Changeset: 57bc6a99e26c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/57bc6a99e26c
Modified Files:
gdk/gdk_bbp.c
Branch: Jan2022
Log Message:
Fix race between BBPmanager and BBPsync.
The race was introduced in the previous changeset.
diffs (79 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3091,13 +3091,13 @@ decref(bat i, bool logical, bool release
int
BBPunfix(bat i)
{
- return decref(i, false, false, true, "BBPunfix");
+ return decref(i, false, false, true, __func__);
}
int
BBPrelease(bat i)
{
- return decref(i, true, false, true, "BBPrelease");
+ return decref(i, true, false, true, __func__);
}
/*
@@ -3124,15 +3124,15 @@ BBPkeepref(bat i)
}
assert(BBP_refs(i));
- decref(i, false, false, lock, "BBPkeepref");
+ decref(i, false, false, lock, __func__);
}
}
static inline void
GDKunshare(bat parent)
{
- (void) decref(parent, false, true, true, "GDKunshare");
- (void) decref(parent, true, false, true, "GDKunshare");
+ (void) decref(parent, false, true, true, __func__);
+ (void) decref(parent, true, false, true, __func__);
}
void
@@ -3162,7 +3162,7 @@ BBPreclaim(BAT *b)
assert(BBP_refs(i) == 1);
- return decref(i, false, false, lock, "BBPreclaim") <0;
+ return decref(i, false, false, lock, __func__) <0;
}
/*
@@ -3404,7 +3404,7 @@ dirty_bat(bat *i, bool subcommit)
if (b != NULL) {
if ((BBP_status(*i) & BBPNEW) &&
BATcheckmodes(b, false) != GDK_SUCCEED) /* check
mmap modes */
- *i = 0; /* error */
+ *i = -*i; /* error */
if ((BBP_status(*i) & BBPPERSISTENT) &&
(subcommit || BATdirty(b)))
return b; /* the bat is loaded,
persistent and dirty */
@@ -3921,9 +3921,12 @@ BBPsync(int cnt, bat *restrict subcommit
BUN size = sizes ? sizes[idx] : BUN_NONE;
BATiter bi;
+ /* add a fix so that BBPmanager doesn't interfere */
+ BBPfix(i);
if (BBP_status(i) & BBPPERSISTENT) {
BAT *b = dirty_bat(&i, subcommit != NULL);
if (i <= 0) {
+ decref(-i, false, false, locked_by == 0
|| locked_by != MT_getpid(), __func__);
break;
}
bi = bat_iterator(BBP_desc(i));
@@ -3959,6 +3962,9 @@ BBPsync(int cnt, bat *restrict subcommit
n = BBPdir_step(i, size, n, buf, sizeof(buf),
&obbpf, nbbpf, subcommit != NULL, &bi);
}
bat_iterator_end(&bi);
+ /* can't use BBPunfix because of the "lock"
+ * argument: locked_by may be set here */
+ decref(i, false, false, locked_by == 0 || locked_by !=
MT_getpid(), __func__);
if (n == -2)
break;
/* we once again have a saved heap */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]