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

Reply via email to