Changeset: 166686778166 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/166686778166
Modified Files:
gdk/gdk_bbp.c
gdk/gdk_hash.c
gdk/gdk_private.h
gdk/gdk_storage.c
Branch: Jan2022
Log Message:
Merge with Jul2021 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
@@ -4045,9 +4045,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
@@ -614,6 +614,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) == GDK_SUCCEED &&
HEAPsave(hp, hp->filename, NULL, dosync, hp->free) ==
GDK_SUCCEED) {
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -85,7 +85,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
@@ -753,23 +753,31 @@ BATmsync(BAT *b)
}
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 (!BATdirty(b)) {
+ if (locked)
+ MT_rwlock_rdunlock(&b->thashlock);
return GDK_SUCCEED;
}
@@ -850,9 +858,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;
}
@@ -862,9 +872,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 -- [email protected]
To unsubscribe send an email to [email protected]