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