Changeset: cdc0df23d284 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cdc0df23d284
Modified Files:
        gdk/gdk_logger.c
        sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:

improved segments2cs


diffs (193 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2503,7 +2503,10 @@ log_bat_clear(logger *lg, int id)
 
        if (LOG_DISABLED(lg)) {
                lg->end++;
-               return la_bat_update_count(lg, id, 0);
+               logger_lock(lg);
+               gdk_return res = la_bat_update_count(lg, id, 0);
+               logger_unlock(lg);
+               return res;
        }
 
        l.flag = LOG_CLEAR;
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -283,8 +283,26 @@ segments_in_transaction(sql_trans *tr, s
        return 0;
 }
 
+static size_t
+segs_end( segments *segs, sql_trans *tr, sql_table *table)
+{
+       size_t cnt = 0;
+
+       lock_table(tr->store, table->base.id);
+       segment *s = segs->h, *l = NULL;
+
+       for(;s; s = s->next) {
+               if (SEG_IS_VALID(s, tr))
+                               l = s;
+       }
+       if (l)
+               cnt = l->end;
+       unlock_table(tr->store, table->base.id);
+       return cnt;
+}
+
 static int
-segments2cs(sql_trans *tr, segments *segs, column_storage *cs)
+segments2cs(sql_trans *tr, segments *segs, column_storage *cs, sql_table *t)
 {
        /* set bits correctly */
        BAT *b = temp_descriptor(cs->bid);
@@ -293,30 +311,58 @@ segments2cs(sql_trans *tr, segments *seg
                return LOG_ERR;
        segment *s = segs->h;
 
+       size_t nr = segs_end(segs, tr, t);
+       if (nr >= BATcapacity(b) && BATextend(b, nr) != GDK_SUCCEED)
+               return LOG_ERR;
+
+       BATsetcount(b, nr);
+       uint32_t *restrict dst;
        for (; s ; s=s->next) {
-               if (s->ts == tr->tid) {
-                       msk m = s->deleted;
-                       if (BATcount(b) < s->start) {
-                               msk nil = bit_nil;
-                               for(BUN i=BATcount(b); i<s->start; i++){
-                                       if (BUNappend(b, &nil, true) != 
GDK_SUCCEED) {
-                                               bat_destroy(b);
-                                               return LOG_ERR;
-                                       }
+               if (s->ts == tr->tid && s->end != s->start) {
+                       size_t lnr = s->end-s->start;
+                       size_t pos = s->start;
+                       dst = ((uint32_t*)Tloc(b, 0)) + (s->start/32);
+                       uint32_t cur = 0;
+                       if (s->deleted) {
+                               size_t used = pos&31, end = 32;
+                               if (used) {
+                                       if (lnr < (32-used))
+                                               end = used + lnr;
+                                       for(size_t j=used; j < end; j++, lnr--)
+                                               cur |= 1U<<j;
+                                       *dst++ |= cur;
+                                       cur = 0;
                                }
-                       }
-                       for(BUN p = s->start; p < s->end; p++) {
-                               if (p >= BATcount(b)) {
-                                       if (BUNappend(b, (ptr) &m, true) != 
GDK_SUCCEED) {
-                                               bat_destroy(b);
-                                               return LOG_ERR;
-                                       }
-                               } else {
-                                       if (BUNreplace(b, p, (ptr) &m, true) != 
GDK_SUCCEED) {
-                                               bat_destroy(b);
-                                               return LOG_ERR;
-                                       }
+                               size_t full = lnr/32;
+                               size_t rest = lnr%32;
+                               for(size_t i = 0; i<full; i++, lnr-=32)
+                                       *dst++ = ~0;
+                               if (rest) {
+                                       for(size_t j=0; j < rest; j++, lnr--)
+                                               cur |= 1U<<j;
+                                       *dst |= cur;
                                }
+                               assert(lnr==0);
+                       } else {
+                               size_t used = pos&31, end = 32;
+                               if (used) {
+                                       if (lnr < (32-used))
+                                               end = used + lnr;
+                                       for(size_t j=used; j < end; j++, lnr--)
+                                               cur |= 1U<<j;
+                                       *dst++ &= ~cur;
+                                       cur = 0;
+                               }
+                               size_t full = lnr/32;
+                               size_t rest = lnr%32;
+                               for(size_t i = 0; i<full; i++, lnr-=32)
+                                       *dst++ = 0;
+                               if (rest) {
+                                       for(size_t j=0; j < rest; j++, lnr--)
+                                               cur |= 1U<<j;
+                                       *dst &= ~cur;
+                               }
+                               assert(lnr==0);
                        }
                }
        }
@@ -558,24 +604,6 @@ count_deletes( segment *s, sql_trans *tr
 }
 
 static size_t
-segs_end( segments *segs, sql_trans *tr, sql_table *table)
-{
-       size_t cnt = 0;
-
-       lock_table(tr->store, table->base.id);
-       segment *s = segs->h, *l = NULL;
-
-       for(;s; s = s->next) {
-               if (SEG_IS_VALID(s, tr))
-                               l = s;
-       }
-       if (l)
-               cnt = l->end;
-       unlock_table(tr->store, table->base.id);
-       return cnt;
-}
-
-static size_t
 count_col(sql_trans *tr, sql_column *c, int access)
 {
        storage *d;
@@ -2349,7 +2377,7 @@ log_segments(sql_trans *tr, segments *se
 }
 
 static int
-log_create_storage(sql_trans *tr, storage *bat, sqlid id)
+log_create_storage(sql_trans *tr, storage *bat, sql_table *t)
 {
        BAT *b;
        int ok;
@@ -2364,11 +2392,11 @@ log_create_storage(sql_trans *tr, storag
        sqlstore *store = tr->store;
        bat_set_access(b, BAT_READ);
        /* set bits correctly */
-       ok = segments2cs(tr, bat->segs, &bat->cs);
+       ok = segments2cs(tr, bat->segs, &bat->cs, t);
        if (ok == LOG_OK)
-               ok = (log_bat_persists(store->logger, b, id) == 
GDK_SUCCEED)?LOG_OK:LOG_ERR;
+               ok = (log_bat_persists(store->logger, b, t->base.id) == 
GDK_SUCCEED)?LOG_OK:LOG_ERR;
        if (ok == LOG_OK)
-               ok = log_segments(tr, bat->segs, id);
+               ok = log_segments(tr, bat->segs, t->base.id);
        bat_destroy(b);
        return ok;
 }
@@ -2382,7 +2410,7 @@ log_create_del(sql_trans *tr, sql_change
        if (t->base.deleted)
                return ok;
        assert(!isTempTable(t));
-       ok = log_create_storage(tr, ATOMIC_PTR_GET(&t->data), t->base.id);
+       ok = log_create_storage(tr, ATOMIC_PTR_GET(&t->data), t);
        if (ok == LOG_OK) {
                for(node *n = ol_first_node(t->columns); n && ok == LOG_OK; n = 
n->next) {
                        sql_column *c = n->data;
@@ -2862,7 +2890,7 @@ log_table_append(sql_trans *tr, sql_tabl
 static int
 log_storage(sql_trans *tr, sql_table *t, storage *s, sqlid id)
 {
-       int ok = segments2cs(tr, s->segs, &s->cs);
+       int ok = segments2cs(tr, s->segs, &s->cs, t);
        if (ok == LOG_OK && s->cs.cleared)
                return tr_log_cs(tr, t, &s->cs, s->segs->h, t->base.id);
        if (ok == LOG_OK)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to