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