Changeset: 8fe85e143ade for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8fe85e143ade Modified Files: gdk/gdk_bbp.c Branch: Jul2021 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 @@ -2812,13 +2812,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__); } /* @@ -2845,15 +2845,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 @@ -2883,7 +2883,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; } /* @@ -3125,7 +3125,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 */ @@ -3642,9 +3642,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)); @@ -3679,6 +3682,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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org