Changeset: 8fd55f1d1858 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8fd55f1d1858
Modified Files:
gdk/gdk_heap.c
gdk/gdk_private.h
gdk/gdk_storage.c
Branch: Feb2013
Log Message:
When a mmapped BAT gets saved, shrink it and the file to fit.
diffs (88 lines):
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -477,6 +477,55 @@ HEAPextend(Heap *h, size_t size)
}
int
+HEAPshrink(Heap *h, size_t size)
+{
+ char *p;
+
+ assert(size >= h->free);
+ assert(size <= h->size);
+ if (h->storage == STORE_MEM) {
+ p = GDKreallocmax(h->base, size, &size, 0);
+ HEAPDEBUG fprintf(stderr, "#HEAPshrink: shrinking malloced "
+ "heap " SZFMT " " SZFMT " " PTRFMT " "
+ PTRFMT "\n", h->size, size,
+ PTRFMTCAST h->base, PTRFMTCAST p);
+ } else {
+ char nme[PATHLENGTH], *ext = NULL;
+ long_str path;
+
+ if (h->filename) {
+ strncpy(nme, h->filename, sizeof(nme));
+ nme[sizeof(nme) - 1] = 0;
+ ext = decompose_filename(nme);
+ }
+ /* shrink memory mapped file */
+ GDKfilepath(path, BATDIR, nme, ext);
+ size = (size + MT_pagesize() - 1) & ~(MT_pagesize() - 1);
+ if (size >= h->size) {
+ /* don't grow */
+ return 0;
+ }
+ p = MT_mremap(path,
+ h->storage == STORE_PRIV ?
+ MMAP_COPY | MMAP_READ | MMAP_WRITE :
+ MMAP_READ | MMAP_WRITE,
+ h->base, h->size, &size);
+ HEAPDEBUG fprintf(stderr, "#HEAPshrink: shrinking %s mmapped "
+ "heap (%s) " SZFMT " " SZFMT " " PTRFMT " "
+ PTRFMT "\n",
+ h->storage == STORE_MMAP ? "shared" :
"privately",
+ h->filename, h->size, size,
+ PTRFMTCAST h->base, PTRFMTCAST p);
+ }
+ if (p) {
+ h->maxsize = h->size = size;
+ h->base = p;
+ return 0;
+ }
+ return -1;
+}
+
+int
GDKupgradevarheap(COLrec *c, var_t v, int copyall)
{
bte shift = c->shift;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -76,6 +76,7 @@ void HEAP_init(Heap *heap, int tpe);
int HEAPload(Heap *h, const char *nme, const char *ext, int trunc);
int HEAP_mmappable(Heap *heap);
int HEAPsave(Heap *h, const char *nme, const char *ext);
+int HEAPshrink(Heap *h, size_t size);
int HEAPwarm(Heap *h);
oid MAXoid(BAT *i);
void MT_global_exit(int status)
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -620,6 +620,14 @@ BATsave(BAT *bd)
if (err == 0) {
bd->batCopiedtodisk = 1;
DESCclean(bd);
+ if (bd->H->heap.storage == STORE_MMAP)
+ HEAPshrink(&bd->H->heap, bd->H->heap.free);
+ if (bd->T->heap.storage == STORE_MMAP)
+ HEAPshrink(&bd->T->heap, bd->T->heap.free);
+ if (bd->H->vheap && bd->H->vheap->storage == STORE_MMAP)
+ HEAPshrink(bd->H->vheap, bd->H->vheap->free);
+ if (bd->T->vheap && bd->T->vheap->storage == STORE_MMAP)
+ HEAPshrink(bd->T->vheap, bd->T->vheap->free);
return bd;
}
return NULL;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list