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

update the right row in the sql catalog when reading logs, ie when a column got 
replaced by a new bat, old log
records still refer to the old bat.


diffs (61 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -593,17 +593,33 @@ static gdk_return
 la_bat_update_count(logger *lg, log_id id, lng cnt)
 {
        BATiter cni = bat_iterator_nolock(lg->catalog_id);
-       BUN p;
 
        if (BAThash(lg->catalog_id) == GDK_SUCCEED) {
                MT_rwlock_rdlock(&cni.b->thashlock);
+               BUN p, cp = BUN_NONE;
+
                HASHloop_int(cni, cni.b->thash, p, &id) {
-                       lng ocnt = *(lng*) Tloc(lg->catalog_cnt, p);
+                       lng lid = *(lng *) Tloc(lg->catalog_lid, p);
+
+                       if (lid != lng_nil && lid <= lg->saved_tid)
+                               break;
+                       cp = p;
+               }
+               if (cp != BUN_NONE) {
+                       lng ocnt = *(lng*) Tloc(lg->catalog_cnt, cp);
                        assert(lg->catalog_cnt->hseqbase == 0);
-                       if (ocnt < cnt && BUNreplace(lg->catalog_cnt, p, &cnt, 
false) != GDK_SUCCEED) {
+                       if (ocnt < cnt && BUNreplace(lg->catalog_cnt, cp, &cnt, 
false) != GDK_SUCCEED) {
                                MT_rwlock_rdunlock(&cni.b->thashlock);
                                return GDK_FAIL;
                        }
+#ifndef NDEBUG
+                       if (ocnt < cnt) {
+                               log_bid bid = *(log_bid *) 
Tloc(lg->catalog_bid, cp);
+                               BAT *b = BBP_record(bid).cache;
+                               if (!(b == NULL || b->theap == NULL || b->ttype 
== 0 || b->theap->dirty) && (!b->batTransient))
+                                       fprintf(stderr, "update count: sqlid: 
%d, cnt: "LLFMT"->"LLFMT", "ALGOBATFMT"\n", id, ocnt, cnt, ALGOBATPAR(b));
+                       }
+#endif
                }
                MT_rwlock_rdunlock(&cni.b->thashlock);
        }
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
@@ -2573,7 +2573,7 @@ log_segments(sql_trans *tr, segments *se
 {
        /* log segments */
        for (segment *seg = segs->h; seg; seg=seg->next) {
-               if (seg->ts == tr->tid) {
+               if (seg->ts == tr->tid && seg->end-seg->start) {
                        if (log_segment(tr, seg, id) != LOG_OK)
                                return LOG_ERR;
                }
@@ -3087,6 +3087,8 @@ log_storage(sql_trans *tr, sql_table *t,
        if (ok == LOG_OK && cleared)
                ok =  tr_log_cs(tr, t, &s->cs, s->segs->h, t->base.id);
        if (ok == LOG_OK)
+               ok = segments2cs(tr, s->segs, &s->cs);
+       if (ok == LOG_OK)
                ok = log_segments(tr, s->segs, id);
        if (ok == LOG_OK && !cleared)
                ok = log_table_append(tr, t, s->segs);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to