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

Reply via email to