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