Changeset: d670e6415c75 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d670e6415c75
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_hash.c
        gdk/gdk_private.h
        gdk/gdk_storage.c
Branch: Sep2022
Log Message:

Merge with Jan2022 branch.


diffs (97 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3874,9 +3874,7 @@ BBPsync(int cnt, bat *restrict subcommit
                                        BBP_status_on(i, BBPSAVING);
                                        if (lock)
                                                MT_lock_unset(&GDKswapLock(i));
-                                       MT_rwlock_rdlock(&b->thashlock);
-                                       ret = BATsave_locked(b, &bi, size);
-                                       MT_rwlock_rdunlock(&b->thashlock);
+                                       ret = BATsave_iter(b, &bi, size);
                                        BBP_status_off(i, BBPSAVING);
                                }
                        } else {
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -615,6 +615,7 @@ BAThashsave_intern(BAT *b, bool dosync)
                /* only persist if parent BAT hasn't changed in the
                 * mean time */
                if (!b->theap->dirty &&
+                   ((size_t *) h->heapbckt.base)[1] == BATcount(b) &&
                    ((size_t *) h->heapbckt.base)[4] == BATcount(b) &&
                    HEAPsave(&h->heaplink, h->heaplink.filename, NULL, dosync, 
h->heaplink.free, NULL) == GDK_SUCCEED &&
                    HEAPsave(hp, hp->filename, NULL, dosync, hp->free, NULL) == 
GDK_SUCCEED) {
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -86,7 +86,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, BUN size)
+gdk_return BATsave_iter(BAT *bd, BATiter *bi, BUN size)
        __attribute__((__visibility__("hidden")));
 void BATsetdims(BAT *b, uint16_t width)
        __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
@@ -661,23 +661,31 @@ DESCload(int i)
 }
 
 gdk_return
-BATsave_locked(BAT *b, BATiter *bi, BUN size)
+BATsave_iter(BAT *b, BATiter *bi, BUN size)
 {
        gdk_return err = GDK_SUCCEED;
        const char *nme;
        bool dosync;
+       bool locked = false;
 
        BATcheck(b, GDK_FAIL);
 
+       if (MT_rwlock_rdtry(&b->thashlock))
+               locked = true;
+
        dosync = (BBP_status(b->batCacheid) & BBPPERSISTENT) != 0;
        assert(!GDKinmemory(bi->h->farmid));
        /* views cannot be saved, but make an exception for
         * force-remapped views */
        if (isVIEW(b)) {
+               if (locked)
+                       MT_rwlock_rdunlock(&b->thashlock);
                GDKerror("%s is a view on %s; cannot be saved\n", BATgetId(b), 
BBP_logical(VIEWtparent(b)));
                return GDK_FAIL;
        }
        if (!BATdirtybi(*bi)) {
+               if (locked)
+                       MT_rwlock_rdunlock(&b->thashlock);
                return GDK_SUCCEED;
        }
 
@@ -758,9 +766,11 @@ BATsave_locked(BAT *b, BATiter *bi, BUN 
                        b->batCopiedtodisk = true;
                }
                MT_lock_unset(&b->theaplock);
-               if (b->thash && b->thash != (Hash *) 1)
+               if (locked &&  b->thash && b->thash != (Hash *) 1)
                        BAThashsave(b, dosync);
        }
+       if (locked)
+               MT_rwlock_rdunlock(&b->thashlock);
        return err;
 }
 
@@ -770,9 +780,7 @@ BATsave(BAT *b)
        gdk_return rc;
 
        BATiter bi = bat_iterator(b);
-       MT_rwlock_rdlock(&b->thashlock);
-       rc = BATsave_locked(b, &bi, bi.count);
-       MT_rwlock_rdunlock(&b->thashlock);
+       rc = BATsave_iter(b, &bi, bi.count);
        bat_iterator_end(&bi);
        return rc;
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to