Changeset: 3c89448b4554 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3c89448b4554
Modified Files:
        gdk/gdk_hash.c
        gdk/gdk_imprints.c
        gdk/gdk_orderidx.c
Branch: Aug2018
Log Message:

Don't use the write system call on files that are also memory-mapped.
Doing that causes a serious hang on MacOSX (one that requires a reboot).


diffs (180 lines):

diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -256,26 +256,34 @@ BAThashsync(void *arg)
        MT_lock_set(&GDKhashLock(b->batCacheid));
        if (b->thash != NULL) {
                Heap *hp = &b->thash->heap;
-               if (HEAPsave(hp, hp->filename, NULL) == GDK_SUCCEED &&
-                   (fd = GDKfdlocate(hp->farmid, hp->filename, "rb+", NULL)) 
>= 0) {
-                       ((size_t *) hp->base)[0] |= 1 << 24;
-                       if (write(fd, hp->base, SIZEOF_SIZE_T) >= 0) {
-                               failed = ""; /* not failed */
-                               if (!(GDKdebug & NOSYNCMASK)) {
+               if (HEAPsave(hp, hp->filename, NULL) == GDK_SUCCEED) {
+                       if (hp->storage == STORE_MEM) {
+                               if ((fd = GDKfdlocate(hp->farmid, hp->filename, 
"rb+", NULL)) >= 0) {
+                                       ((size_t *) hp->base)[0] |= (size_t) 1 
<< 24;
+                                       if (write(fd, hp->base, SIZEOF_SIZE_T) 
>= 0) {
+                                               failed = ""; /* not failed */
+                                               if (!(GDKdebug & NOSYNCMASK)) {
 #if defined(NATIVE_WIN32)
-                                       _commit(fd);
+                                                       _commit(fd);
 #elif defined(HAVE_FDATASYNC)
-                                       fdatasync(fd);
+                                                       fdatasync(fd);
 #elif defined(HAVE_FSYNC)
-                                       fsync(fd);
+                                                       fsync(fd);
 #endif
+                                               }
+                                       } else {
+                                               perror("write hash");
+                                       }
+                                       close(fd);
                                }
                        } else {
-                               perror("write hash");
+                               ((size_t *) hp->base)[0] |= (size_t) 1 << 24;
+                               if (!(GDKdebug & NOSYNCMASK) &&
+                                   MT_msync(hp->base, SIZEOF_SIZE_T) < 0)
+                                       ((size_t *) hp->base)[0] &= ~((size_t) 
1 << 24);
                        }
-                       close(fd);
+                       ALGODEBUG fprintf(stderr, "#BAThash: persisting hash %s 
(" LLFMT " usec)%s\n", hp->filename, GDKusec() - t0, failed);
                }
-               ALGODEBUG fprintf(stderr, "#BAThash: persisting hash %s (" 
LLFMT " usec)%s\n", hp->filename, GDKusec() - t0, failed);
        }
        MT_lock_unset(&GDKhashLock(b->batCacheid));
        BBPunfix(b->batCacheid);
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -273,36 +273,49 @@ BATimpsync(void *arg)
        Imprints *imprints;
        int fd;
        lng t0 = 0;
+       const char *failed = " failed";
 
        ALGODEBUG t0 = GDKusec();
 
        MT_lock_set(&GDKimprintsLock(b->batCacheid));
        if ((imprints = b->timprints) != NULL) {
-               if (HEAPsave(&imprints->imprints, BBP_physical(b->batCacheid),
-                            "timprints") == GDK_SUCCEED &&
-                   (fd = GDKfdlocate(imprints->imprints.farmid,
-                                     BBP_physical(b->batCacheid), "rb+",
-                                     "timprints")) >= 0) {
-                       /* add version number */
-                       ((size_t *) imprints->imprints.base)[0] |= (size_t) 
IMPRINTS_VERSION << 8;
-                       /* sync-on-disk checked bit */
-                       ((size_t *) imprints->imprints.base)[0] |= (size_t) 1 
<< 16;
-                       if (write(fd, imprints->imprints.base, sizeof(size_t)) 
< 0)
-                               perror("write imprints");
-                       if (!(GDKdebug & NOSYNCMASK)) {
+               Heap *hp = &imprints->imprints;
+               if (HEAPsave(hp, hp->filename, NULL) == GDK_SUCCEED) {
+                       if (hp->storage == STORE_MEM) {
+                               if ((fd = GDKfdlocate(hp->farmid, hp->filename, 
"rb+", NULL)) >= 0) {
+                                       /* add version number */
+                                       ((size_t *) hp->base)[0] |= (size_t) 
IMPRINTS_VERSION << 8;
+                                       /* sync-on-disk checked bit */
+                                       ((size_t *) hp->base)[0] |= (size_t) 1 
<< 16;
+                                       if (write(fd, hp->base, SIZEOF_SIZE_T) 
>= 0) {
+                                               failed = ""; /* not failed */
+                                               if (!(GDKdebug & NOSYNCMASK)) {
 #if defined(NATIVE_WIN32)
-                               _commit(fd);
+                                                       _commit(fd);
 #elif defined(HAVE_FDATASYNC)
-                               fdatasync(fd);
+                                                       fdatasync(fd);
 #elif defined(HAVE_FSYNC)
-                               fsync(fd);
+                                                       fsync(fd);
 #endif
+                                               }
+                                       } else {
+                                               perror("write hash");
+                                       }
+                                       close(fd);
+                               }
+                       } else {
+                               /* add version number */
+                               ((size_t *) hp->base)[0] |= (size_t) 
IMPRINTS_VERSION << 8;
+                               /* sync-on-disk checked bit */
+                               ((size_t *) hp->base)[0] |= (size_t) 1 << 16;
+                               if (!(GDKdebug & NOSYNCMASK) &&
+                                   MT_msync(hp->base, SIZEOF_SIZE_T) < 0)
+                                       ((size_t *) hp->base)[0] &= ~((size_t) 
IMPRINTS_VERSION << 8);
                        }
-                       close(fd);
                        ALGODEBUG fprintf(stderr, "#BATimpsync(" ALGOBATFMT "): 
"
                                          "imprints persisted "
-                                         "(" LLFMT " usec)\n", ALGOBATPAR(b),
-                                         GDKusec() - t0);
+                                         "(" LLFMT " usec)%s\n", ALGOBATPAR(b),
+                                         GDKusec() - t0, failed);
                }
        }
        MT_lock_unset(&GDKimprintsLock(b->batCacheid));
diff --git a/gdk/gdk_orderidx.c b/gdk/gdk_orderidx.c
--- a/gdk/gdk_orderidx.c
+++ b/gdk/gdk_orderidx.c
@@ -20,32 +20,42 @@ BATidxsync(void *arg)
        Heap *hp;
        int fd;
        lng t0 = 0;
+       const char *failed = " failed";
 
        ALGODEBUG t0 = GDKusec();
 
        MT_lock_set(&GDKhashLock(b->batCacheid));
        if ((hp = b->torderidx) != NULL) {
-               if (HEAPsave(hp, hp->filename, NULL) == GDK_SUCCEED &&
-                   (fd = GDKfdlocate(hp->farmid, hp->filename, "rb+", NULL)) 
>= 0) {
-                       ((oid *) hp->base)[0] |= (oid) 1 << 24;
-                       if (write(fd, hp->base, SIZEOF_SIZE_T) >= 0) {
-                               if (!(GDKdebug & NOSYNCMASK)) {
+               if (HEAPsave(hp, hp->filename, NULL) == GDK_SUCCEED) {
+                       if (hp->storage == STORE_MEM) {
+                               if ((fd = GDKfdlocate(hp->farmid, hp->filename, 
"rb+", NULL)) >= 0) {
+                                       ((oid *) hp->base)[0] |= (oid) 1 << 24;
+                                       if (write(fd, hp->base, SIZEOF_OID) >= 
0) {
+                                               failed = ""; /* not failed */
+                                               if (!(GDKdebug & NOSYNCMASK)) {
 #if defined(NATIVE_WIN32)
-                                       _commit(fd);
+                                                       _commit(fd);
 #elif defined(HAVE_FDATASYNC)
-                                       fdatasync(fd);
+                                                       fdatasync(fd);
 #elif defined(HAVE_FSYNC)
-                                       fsync(fd);
+                                                       fsync(fd);
 #endif
+                                               }
+                                       } else {
+                                               perror("write hash");
+                                       }
+                                       close(fd);
                                }
                        } else {
-                               perror("write orderidx");
+                               ((oid *) hp->base)[0] |= (oid) 1 << 24;
+                               if (!(GDKdebug & NOSYNCMASK) &&
+                                   MT_msync(hp->base, SIZEOF_OID) < 0)
+                                       ((oid *) hp->base)[0] &= ~((oid) 1 << 
24);
                        }
-                       close(fd);
+                       ALGODEBUG fprintf(stderr, "#BATidxsync(%s): orderidx 
persisted"
+                                         " (" LLFMT " usec)%s\n",
+                                         BATgetId(b), GDKusec() - t0, failed);
                }
-               ALGODEBUG fprintf(stderr, "#BATidxsync(%s): orderidx persisted"
-                                 " (" LLFMT " usec)\n",
-                                 BATgetId(b), GDKusec() - t0);
        }
        MT_lock_unset(&GDKhashLock(b->batCacheid));
        BBPunfix(b->batCacheid);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to