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