Changeset: 60af81edec9e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/60af81edec9e Modified Files: gdk/gdk_bbp.c gdk/gdk_private.h gdk/gdk_storage.c Branch: Jul2021 Log Message:
Make sure dirty bits are set after committing a bat partially. diffs (89 lines): diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -3299,6 +3299,9 @@ BBPsync(int cnt, bat *restrict subcommit bat i = subcommit ? subcommit[idx] : idx; /* BBP_desc(i) may be NULL */ BATiter bi = bat_iterator(BBP_desc(i)); + BUN size = sizes ? sizes[idx] : BUN_NONE; + if (size > bi.count) + size = bi.count; if (BBP_status(i) & BBPPERSISTENT) { BAT *b = dirty_bat(&i, subcommit != NULL); @@ -3307,10 +3310,10 @@ BBPsync(int cnt, bat *restrict subcommit break; } if (b) - ret = BATsave_locked(b, &bi); + ret = BATsave_locked(b, &bi, size); } if (ret == GDK_SUCCEED) { - n = BBPdir_step(i, sizes ? sizes[idx] : BUN_NONE, n, buf, sizeof(buf), &obbpf, nbbpf); + n = BBPdir_step(i, size, n, buf, sizeof(buf), &obbpf, nbbpf); } bat_iterator_end(&bi); if (n == -2) diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -81,7 +81,7 @@ void BATrmprop(BAT *b, enum prop_t idx) __attribute__((__visibility__("hidden"))); void BATrmprop_nolock(BAT *b, enum prop_t idx) __attribute__((__visibility__("hidden"))); -gdk_return BATsave_locked(BAT *bd, BATiter *bi) +gdk_return BATsave_locked(BAT *bd, BATiter *bi, BUN size) __attribute__((__visibility__("hidden"))); void BATsetdims(BAT *b) __attribute__((__visibility__("hidden"))); diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c --- a/gdk/gdk_storage.c +++ b/gdk/gdk_storage.c @@ -779,7 +779,7 @@ gettailnamebi(const BATiter *bi) } gdk_return -BATsave_locked(BAT *b, BATiter *bi) +BATsave_locked(BAT *b, BATiter *bi, BUN size) { gdk_return err = GDK_SUCCEED; const char *nme; @@ -859,7 +859,6 @@ BATsave_locked(BAT *b, BATiter *bi) if (err == GDK_SUCCEED) { MT_lock_set(&b->theaplock); - b->batCopiedtodisk = true; if (b->theap != bi->h) { assert(b->theap->dirty); b->theap->wasempty = bi->h->wasempty; @@ -868,8 +867,19 @@ BATsave_locked(BAT *b, BATiter *bi) assert(b->tvheap->dirty); b->tvheap->wasempty = bi->vh->wasempty; } - b->batDirtyflushed = DELTAdirty(b); - b->batDirtydesc = false; + if (size != b->batCount || b->batInserted < b->batCount) { + /* if the sizes don't match, the BAT must be dirty */ + b->batCopiedtodisk = false; + b->batDirtyflushed = true; + b->batDirtydesc = true; + b->theap->dirty = true; + if (b->tvheap) + b->tvheap->dirty = true; + } else { + b->batCopiedtodisk = true; + b->batDirtyflushed = DELTAdirty(b); + b->batDirtydesc = false; + } MT_lock_unset(&b->theaplock); if (MT_rwlock_rdtry(&b->thashlock)) { /* if we can't get the lock, don't bother saving @@ -893,7 +903,7 @@ BATsave(BAT *b) MT_rwlock_rdlock(&b->thashlock); BATiter bi = bat_iterator(b); - rc = BATsave_locked(b, &bi); + rc = BATsave_locked(b, &bi, bi.count); bat_iterator_end(&bi); MT_rwlock_rdunlock(&b->thashlock); return rc; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list