Changeset: 8c0ee03e16e6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8c0ee03e16e6
Modified Files:
gdk/gdk_bbp.c
Branch: Jan2022
Log Message:
Do not unload/reload views when the ref count goes to 0.
This fixes bug #7237.
diffs (68 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2830,7 +2830,6 @@ incref(bat i, bool logical, bool lock)
int refs;
bat tp = i, tvp = i;
BAT *b, *pb = NULL, *pvb = NULL;
- bool load = false;
if (!BBPcheck(i))
return 0;
@@ -2890,40 +2889,12 @@ incref(bat i, bool logical, bool lock)
} else {
assert(tp >= 0);
refs = ++BBP_refs(i);
- unsigned flag = BBPHOT;
- if (refs == 1 && (tp != i || tvp != i)) {
- /* If this is a view, we must load the parent
- * BATs, but we must do that outside of the
- * lock. Set the BBPLOADING flag so that
- * other threads will wait until we're
- * done. */
- flag |= BBPLOADING;
- load = true;
- }
- BBP_status_on(i, flag);
+ BBP_status_on(i, BBPHOT);
}
if (lock)
MT_lock_unset(&GDKswapLock(i));
- if (load) {
- /* load the parent BATs */
- assert(!logical);
- if (tp != i) {
- assert(pb != NULL);
- /* load being set implies there is no other
- * thread that has access to this bat, but the
- * parent is a different matter */
- MT_lock_set(&pb->theaplock);
- if (b->theap != pb->theap) {
- HEAPincref(pb->theap);
- HEAPdecref(b->theap, false);
- b->theap = pb->theap;
- }
- MT_lock_unset(&pb->theaplock);
- }
- /* done loading, release descriptor */
- BBP_status_off(i, BBPLOADING);
- } else if (!logical) {
+ if (!logical && refs > 1) {
/* this wasn't the first physical reference, so undo
* the fixes on the parent bats */
if (pb)
@@ -3067,8 +3038,12 @@ decref(bat i, bool logical, bool release
? (!BATdirty(b) &&
!(BBP_status(i) & chkflag) &&
(BBP_status(i) & BBPPERSISTENT) &&
+ /* cannot unload in-memory data */
!GDKinmemory(farmid) &&
- b->batSharecnt == 0)
+ /* do not unload views or parents of views */
+ b->batSharecnt == 0 &&
+ b->batCacheid == b->theap->parentid &&
+ (b->tvheap == NULL || b->batCacheid == b->tvheap->parentid))
: (BBP_status(i) & BBPTMP)))) {
/* bat will be unloaded now. set the UNLOADING bit
* while locked so no other thread thinks it's
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list