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

Reply via email to