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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list