Changeset: b0bc7c7583d2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b0bc7c7583d2
Modified Files:
gdk/gdk_bbp.c
gdk/gdk_storage.c
Branch: Jul2021
Log Message:
Better deal with "swapped" bats.
Turn off swapped bit when the bat is loaded, and sync the heaps during
commit, since they were saved, but not necessarily flushed to disk.
diffs (99 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1558,6 +1558,7 @@ BBPdump(void)
if (BBP_refs(i) == 0 && BBP_lrefs(i) == 0)
continue;
BAT *b = BBP_desc(i);
+ unsigned status = BBP_status(i);
fprintf(stderr,
"# %d: " ALGOOPTBATFMT " "
"refs=%d lrefs=%d "
@@ -1566,7 +1567,7 @@ BBPdump(void)
ALGOOPTBATPAR(b),
BBP_refs(i),
BBP_lrefs(i),
- BBP_status(i),
+ status,
BBP_cache(i) ? "" : " not cached");
if (b->batSharecnt > 0)
fprintf(stderr, " shares=%d", b->batSharecnt);
@@ -1581,7 +1582,7 @@ BBPdump(void)
HEAPmemsize(b->theap),
HEAPvmsize(b->theap),
b->theap->farmid,
- b->theap->dirty ? "(Dirty)" : "");
+ status & BBPSWAPPED ? "(Swapped)" :
b->theap->dirty ? "(Dirty)" : "");
if (BBP_logical(i) && BBP_logical(i)[0] == '.')
{
cmem += HEAPmemsize(b->theap);
cvm += HEAPvmsize(b->theap);
@@ -1896,7 +1897,7 @@ BBPcacheit(BAT *bn, bool lock)
if (lock)
MT_lock_set(&GDKswapLock(i));
- mode = (BBP_status(i) | BBPLOADED) & ~(BBPLOADING | BBPDELETING);
+ mode = (BBP_status(i) | BBPLOADED) & ~(BBPLOADING | BBPDELETING |
BBPSWAPPED);
BBP_status_set(i, mode);
BBP_desc(i) = bn;
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -795,15 +795,48 @@ BATsave(BAT *bd)
/* start saving data */
nme = BBP_physical(b->batCacheid);
- if (!b->batCopiedtodisk || b->batDirtydesc || b->theap->dirty)
- if (err == GDK_SUCCEED && b->ttype)
- err = HEAPsave(b->theap, nme, gettailname(b), dosync);
- if (b->tvheap
- && (!b->batCopiedtodisk || b->batDirtydesc || b->tvheap->dirty)
- && b->ttype
- && b->tvarsized
- && err == GDK_SUCCEED)
- err = HEAPsave(b->tvheap, nme, "theap", dosync);
+ if (b->theap->base == NULL) {
+ assert(BBP_status(bd->batCacheid) & BBPSWAPPED);
+ if (dosync && !(GDKdebug & NOSYNCMASK)) {
+ int fd = GDKfdlocate(b->theap->farmid, nme, "rb+",
gettailname(b));
+ if (
+#if defined(NATIVE_WIN32)
+ _commit(fd) < 0
+#elif defined(HAVE_FDATASYNC)
+ fdatasync(fd) < 0
+#elif defined(HAVE_FSYNC)
+ fsync(fd) < 0
+#endif
+ )
+ GDKsyserror("sync failed for %s.%s\n", nme,
+ gettailname(b));
+ close(fd);
+ if (b->tvheap) {
+ fd = GDKfdlocate(b->tvheap->farmid, nme, "rb+",
"theap");
+ if (
+#if defined(NATIVE_WIN32)
+ _commit(fd) < 0
+#elif defined(HAVE_FDATASYNC)
+ fdatasync(fd) < 0
+#elif defined(HAVE_FSYNC)
+ fsync(fd) < 0
+#endif
+ )
+ GDKsyserror("sync failed for
%s.theap\n", nme);
+ close(fd);
+ }
+ }
+ } else {
+ if (!b->batCopiedtodisk || b->batDirtydesc || b->theap->dirty)
+ if (err == GDK_SUCCEED && b->ttype)
+ err = HEAPsave(b->theap, nme, gettailname(b),
dosync);
+ if (b->tvheap
+ && (!b->batCopiedtodisk || b->batDirtydesc ||
b->tvheap->dirty)
+ && b->ttype
+ && b->tvarsized
+ && err == GDK_SUCCEED)
+ err = HEAPsave(b->tvheap, nme, "theap", dosync);
+ }
HEAPdecref(b->theap, false);
if (b->tvheap)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list