Changeset: 85e276530f04 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=85e276530f04
Modified Files:
        gdk/gdk_heap.c
        gdk/gdk_private.h
        gdk/gdk_search.c
        gdk/gdk_search.h
        gdk/gdk_storage.c
Branch: Jul2015
Log Message:

Write hash heap to disk when freeing a bat.
We write the heap if it is malloced and dirty, and we don't sync it to
disk.


diffs (110 lines):

diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -714,7 +714,7 @@ HEAPsave_intern(Heap *h, const char *nme
        HEAPDEBUG {
                fprintf(stderr, "#HEAPsave(%s.%s,storage=%d,free=" SZFMT 
",size=" SZFMT ")\n", nme, ext, (int) h->newstorage, h->free, h->size);
        }
-       return GDKsave(h->farmid, nme, ext, h->base, h->free, store);
+       return GDKsave(h->farmid, nme, ext, h->base, h->free, store, TRUE);
 }
 
 gdk_return
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -128,7 +128,7 @@ void BBPdump(void);         /* never called: fo
        __attribute__((__visibility__("hidden")));
 __hidden gdk_return GDKremovedir(int farmid, const char *nme)
        __attribute__((__visibility__("hidden")));
-__hidden gdk_return GDKsave(int farmid, const char *nme, const char *ext, void 
*buf, size_t size, storage_t mode)
+__hidden gdk_return GDKsave(int farmid, const char *nme, const char *ext, void 
*buf, size_t size, storage_t mode, int dosync)
        __attribute__((__visibility__("hidden")));
 __hidden int GDKssort_rev(void *h, void *t, const void *base, size_t n, int 
hs, int ts, int tpe)
        __attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -295,6 +295,7 @@ BATcheckhash(BAT *b)
                                        h->Link = hp->base + HASH_HEADER_SIZE * 
SIZEOF_SIZE_T;
                                        h->Hash = (void *) ((char *) h->Link + 
h->lim * h->width);
                                        close(fd);
+                                       hp->dirty = FALSE;
                                        b->T->hash = h;
                                        ALGODEBUG fprintf(stderr, 
"#BATcheckhash: reusing persisted hash %s\n", BATgetId(b));
                                        
MT_lock_unset(&GDKhashLock(abs(b->batCacheid)), "BATcheckhash");
@@ -387,6 +388,7 @@ BAThash(BAT *b, BUN masksize)
                        GDKfree(hp);
                        return GDK_FAIL;
                }
+               hp->dirty = TRUE;
                sprintf(hp->filename, "%s.%s", nme, ext);
 
                /* cnt = 0, hopefully there is a proper capacity from
@@ -659,6 +661,17 @@ HASHfree(BAT *b)
                MT_lock_set(&GDKhashLock(abs(b->batCacheid)), "HASHfree");
                if (b->T->hash && b->T->hash != (Hash *) -1) {
                        if (b->T->hash != (Hash *) 1) {
+                               if (b->T->hash->heap->storage == STORE_MEM &&
+                                   b->T->hash->heap->dirty) {
+                                       GDKsave(b->T->hash->heap->farmid,
+                                               b->T->hash->heap->filename,
+                                               NULL,
+                                               b->T->hash->heap->base,
+                                               b->T->hash->heap->free,
+                                               STORE_MEM,
+                                               FALSE);
+                                       b->T->hash->heap->dirty = FALSE;
+                               }
                                HEAPfree(b->T->hash->heap, 0);
                                GDKfree(b->T->hash->heap);
                                GDKfree(b->T->hash);
diff --git a/gdk/gdk_search.h b/gdk/gdk_search.h
--- a/gdk/gdk_search.h
+++ b/gdk/gdk_search.h
@@ -222,6 +222,7 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
                } else {                                                \
                        BUN _c = HASHprobe((b)->T->hash, (v));          \
                        HASHputall((b)->T->hash, (i), _c);              \
+                       (b)->T->hash->heap->dirty = TRUE;               \
                }                                                       \
        } while (0)
 
@@ -229,6 +230,7 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
        do {                                    \
                BUN _c = hash_oid(h,v);         \
                HASHputall(h,i,_c);             \
+               (h)->heap->dirty = TRUE;        \
        } while (0)
 
 /* Functions to perform a binary search on a sorted BAT.
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -365,14 +365,14 @@ GDKextend(const char *fn, size_t size)
  * The primary concern here is to handle STORE_MMAP and STORE_MEM.
  */
 gdk_return
-GDKsave(int farmid, const char *nme, const char *ext, void *buf, size_t size, 
storage_t mode)
+GDKsave(int farmid, const char *nme, const char *ext, void *buf, size_t size, 
storage_t mode, int dosync)
 {
        int err = 0;
 
-       IODEBUG fprintf(stderr, "#GDKsave: name=%s, ext=%s, mode %d\n", nme, 
ext ? ext : "", (int) mode);
+       IODEBUG fprintf(stderr, "#GDKsave: name=%s, ext=%s, mode %d, 
dosync=%d\n", nme, ext ? ext : "", (int) mode, dosync);
 
        if (mode == STORE_MMAP) {
-               if (size && MT_msync(buf, size) < 0)
+               if (dosync && size && MT_msync(buf, size) < 0)
                        err = -1;
                if (err)
                        GDKsyserror("GDKsave: error on: name=%s, ext=%s, "
@@ -414,7 +414,7 @@ GDKsave(int farmid, const char *nme, con
                                                (unsigned) MIN(1 << 30, size),
                                                ret);
                        }
-                       if (!(GDKdebug & FORCEMITOMASK) &&
+                       if (dosync && !(GDKdebug & FORCEMITOMASK) &&
 #if defined(NATIVE_WIN32)
                            _commit(fd) < 0
 #elif defined(HAVE_FDATASYNC)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to