Changeset: 59c105f4830a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/59c105f4830a
Modified Files:
        gdk/gdk_heap.c
Branch: Jan2022
Log Message:

Truncate too large heaps based on actual file size, not calculated size.


diffs (39 lines):

diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -772,21 +772,23 @@ HEAPload_intern(Heap *h, const char *nme
        if (trunc) {
                /* round up mmap heap sizes to GDK_mmap_pagesize
                 * segments, also add some slack */
-               size_t truncsize = ((size_t) (h->free * 1.05) + 
GDK_mmap_pagesize - 1) & ~(GDK_mmap_pagesize - 1);
                int fd;
 
-               if (truncsize == 0)
-                       truncsize = GDK_mmap_pagesize; /* minimum of one page */
-               if (truncsize < h->size &&
-                   (fd = GDKfdlocate(h->farmid, nme, "mrb+", ext)) >= 0) {
-                       ret = ftruncate(fd, truncsize);
-                       TRC_DEBUG(HEAP,
-                                 "ftruncate(file=%s.%s, size=%zu) = %d\n",
-                                 nme, ext, truncsize, ret);
+               if (minsize == 0)
+                       minsize = GDK_mmap_pagesize; /* minimum of one page */
+               if ((fd = GDKfdlocate(h->farmid, nme, "rb+", ext)) >= 0) {
+                       struct stat stb;
+                       if (fstat(fd, &stb) == 0 &&
+                           stb.st_size > (off_t) minsize) {
+                               ret = ftruncate(fd, minsize);
+                               TRC_DEBUG(HEAP,
+                                         "ftruncate(file=%s.%s, size=%zu) = 
%d\n",
+                                         nme, ext, minsize, ret);
+                               if (ret == 0) {
+                                       h->size = minsize;
+                               }
+                       }
                        close(fd);
-                       if (ret == 0) {
-                               h->size = truncsize;
-                       }
                }
        }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to