Changeset: 45b9f37c934b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=45b9f37c934b
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_mosaic.c
        gdk/gdk_mosaic_templates.h
        monetdb5/modules/mosaic/mosaic.c
        monetdb5/modules/mosaic/mosaic.h
        monetdb5/modules/mosaic/mosaic_dictionary_templates.h
        monetdb5/modules/mosaic/mosaic_utility.h
        sql/backends/monet5/sql_cat.c
        sql/test/mosaic/Tests/analysis.stable.out
        sql/test/mosaic/Tests/compression.stable.out
        sql/test/mosaic/Tests/compressionRLE.stable.out
        sql/test/mosaic/Tests/compressionRLE2.stable.out
        sql/test/mosaic/Tests/join.stable.out
        sql/test/mosaic/Tests/layout_delta.stable.out
        sql/test/mosaic/Tests/layout_dict.stable.out
        sql/test/mosaic/Tests/layout_frame.stable.out
        sql/test/mosaic/Tests/layout_linear.stable.out
        sql/test/mosaic/Tests/layout_prefix.stable.out
        sql/test/mosaic/Tests/layout_raw.stable.out
        sql/test/mosaic/Tests/mix.stable.out
        sql/test/mosaic/Tests/session_exit.stable.out
        sql/test/mosaic/Tests/xqueries.stable.out
        sql/test/mosaic/Tests/xqueries_delta.stable.out
        sql/test/mosaic/Tests/xqueries_rle.stable.out
Branch: mosaic
Log Message:

Repair mosaic heap persistence management.


diffs (truncated from 1789 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -338,7 +338,11 @@ void IMPSdestroy(BAT *b);
 lng IMPSimprintsize(BAT *b);
 const char *LEVEL_STR[];
 LOG_LEVEL LVL_PER_COMPONENT[];
+Heap *MOScreate_mosaic_heap(BAT *b, BUN cap);
+Heap *MOScreate_vmosaic_heap(BAT *b, BUN cap);
 void MOSdestroy(BAT *b);
+void MOSfree(BAT *bn);
+void MOSpersist(BAT *b);
 void MOSsetLock(BAT *b);
 void MOSunsetLock(BAT *b);
 void MOSvirtualize(BAT *bn);
@@ -1552,9 +1556,9 @@ str MKEYconstbulk_rotate_xor_hash(bat *r
 str MKEYhash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MKEYrotate(lng *ret, const lng *v, const int *nbits);
 str MKEYrotate_xor_hash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
-str MOSAnalysis(BAT *b, BAT *btech, BAT *blayout, BAT *output, BAT *factor, 
BAT *compress, BAT *decompress, str compressions);
+str MOSAnalysis(BAT *b, BAT *btech, BAT *blayout, BAT *output, BAT *factor, 
BAT *compress, BAT *decompress, str compressions, str common_compressions);
 str MOScompress(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-str MOScompressInternal(BAT *bsrc, const char *compressions);
+str MOScompressInternal(BAT *bsrc, const char *compressions, bool persist);
 str MOScreateCappedInfo(MOStask *task);
 void MOScreateframeDictionary(MOStask *task);
 void MOScreatevar(MOStask *task);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1622,8 +1622,12 @@ bunfastappVAR(BAT *b, const void *v)
 /* support routines for the mosaic approach */
 #define MOSAIC_VERSION 20140808
 gdk_export gdk_return BATmosaic(BAT *b, BUN cap);
+gdk_export Heap* MOScreate_mosaic_heap(BAT *b, BUN cap);
+gdk_export Heap* MOScreate_vmosaic_heap(BAT *b, BUN cap);
 gdk_export int BATcheckmosaic(BAT *b);
 gdk_export void MOSdestroy(BAT *b);
+gdk_export void MOSfree(BAT *bn);
+gdk_export void  MOSpersist(BAT *b);
 gdk_export void MOSsetLock(BAT* b);
 gdk_export void MOSunsetLock(BAT* b);
 gdk_export void MOSvirtualize(BAT *bn);
@@ -1951,14 +1955,10 @@ gdk_export void VIEWbounds(BAT *b, BAT *
 #define isVIEW(x)                                                      \
        (assert((x)->batCacheid > 0),                                   \
         ((x)->theap.parentid ||                                        \
-         ((x)->tvheap && (x)->tvheap->parentid != (x)->batCacheid) || \
-         ((x)->tmosaic && (x)->tmosaic->parentid != (x)->batCacheid)))
+         ((x)->tvheap && (x)->tvheap->parentid != (x)->batCacheid)))
 
 #define VIEWtparent(x) ((x)->theap.parentid)
 #define VIEWvtparent(x)        ((x)->tvheap == NULL || (x)->tvheap->parentid 
== (x)->batCacheid ? 0 : (x)->tvheap->parentid)
-// TODO check if this part of the check "(x)->tmosaic->parentid == 
(x)->batCacheid"  is necessary.
-#define VIEWmosaictparent(x)   ((x)->tmosaic == NULL || (x)->tmosaic->parentid 
== (x)->batCacheid ? 0 : (x)->tmosaic->parentid)
-#define VIEWvmosaictparent(x)  ((x)->tvmosaic == NULL || 
(x)->tvmosaic->parentid == (x)->batCacheid ? 0 : (x)->tvmosaic->parentid)
 
 /*
  * @+ BAT Iterators
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -236,10 +236,8 @@ VIEWunlink(BAT *b)
        if (b) {
                bat tp = VIEWtparent(b);
                bat vtp = VIEWvtparent(b);
-               bat mtp = VIEWmosaictparent(b);
                BAT *tpb = NULL;
                BAT *vtpb = NULL;
-               BAT *mtpb = NULL;
 
                assert(b->batCacheid > 0);
                if (tp)
@@ -248,8 +246,6 @@ VIEWunlink(BAT *b)
                        vtp = tp;
                if (vtp)
                        vtpb = BBP_cache(vtp);
-               if (mtp)
-                       mtpb = BBP_cache(mtp);
 
                if (tpb == NULL && vtpb == NULL)
                        return;
@@ -266,10 +262,6 @@ VIEWunlink(BAT *b)
                /* unlink imprints shared with parent */
                if (tpb && b->timprints && b->timprints == tpb->timprints)
                        b->timprints = NULL;
-
-               /* unlink mosaic shared with parent */
-               if (mtpb && b->tmosaic && b->tmosaic == mtpb->tmosaic)
-                       b->tmosaic = NULL;
        }
 }
 
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -553,7 +553,7 @@ BATfree(BAT *b)
        HASHfree(b);
        IMPSfree(b);
        OIDXfree(b);
-       MOSdestroy(b);
+       MOSfree(b);
        if (b->ttype)
                HEAPfree(&b->theap, false);
        else
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1616,7 +1616,6 @@ BBPexit(void)
                                                 * to locks) do it */
                                                bat tp = VIEWtparent(b);
                                                bat vtp = VIEWvtparent(b);
-                                               bat mosaictp = 
VIEWmosaictparent(b);
                                                if (tp) {
                                                        
BBP_desc(tp)->batSharecnt--;
                                                        --BBP_lrefs(tp);
@@ -1625,10 +1624,6 @@ BBPexit(void)
                                                        
BBP_desc(vtp)->batSharecnt--;
                                                        --BBP_lrefs(vtp);
                                                }
-                                               if (mosaictp) {
-                                                       
BBP_desc(mosaictp)->batSharecnt--;
-                                                       --BBP_lrefs(mosaictp);
-                                               }
                                                VIEWdestroy(b);
                                        } else {
                                                BATfree(b);
@@ -2494,7 +2489,7 @@ static inline int
 incref(bat i, bool logical, bool lock)
 {
        int refs;
-       bat tp, tvp, tmp;
+       bat tp, tvp;
        BAT *b, *pb = NULL, *pvb = NULL, *pmb = NULL;
        bool load = false;
 
@@ -2520,16 +2515,6 @@ incref(bat i, bool logical, bool lock)
                                        BBPunfix(pb->batCacheid);
                                return 0;
                        }
-               } // there could be a parent because of a shared mosaic
-               if (b->tmosaic && b->tmosaic->parentid != i) {
-                       pmb = BATdescriptor(b->tmosaic->parentid);
-                       if (pmb == NULL) {
-                               if (pb)
-                                       BBPunfix(pb->batCacheid);
-                               if (pvb)
-                                       BBPunfix(pvb->batCacheid);
-                               return 0;
-                       }
                }
        }
 
@@ -2563,9 +2548,8 @@ incref(bat i, bool logical, bool lock)
                tp = b->theap.parentid;
                assert(tp >= 0);
                tvp = b->tvheap == 0 || b->tvheap->parentid == i ? 0 : 
b->tvheap->parentid;
-               tmp = b->tmosaic == 0 || b->tmosaic->parentid == i ? 0 : 
b->tmosaic->parentid;
                refs = ++BBP_refs(i);
-               if (refs == 1 && (tp || tvp || tmp)) {
+               if (refs == 1 && (tp || tvp)) {
                        /* If this is a view, we must load the parent
                         * BATs, but we must do that outside of the
                         * lock.  Set the BBPLOADING flag so that
@@ -2639,7 +2623,7 @@ decref(bat i, bool logical, bool release
 {
        int refs = 0;
        bool swap = false;
-       bat tp = 0, tvp = 0, tmp = 0;
+       bat tp = 0, tvp = 0;
        BAT *b;
 
        assert(i > 0);
@@ -2677,13 +2661,11 @@ decref(bat i, bool logical, bool release
                } else {
                        assert(b == NULL || b->theap.parentid == 0 || 
BBP_refs(b->theap.parentid) > 0);
                        assert(b == NULL || b->tvheap == NULL || 
b->tvheap->parentid == 0 || BBP_refs(b->tvheap->parentid) > 0);
-                       assert(b == NULL || b->tmosaic == NULL || 
b->tmosaic->parentid == 0 || BBP_refs(b->tmosaic->parentid) > 0);
                        refs = --BBP_refs(i);
                        if (b && refs == 0) {
                                if ((tp = b->theap.parentid) != 0)
                                        b->theap.base = (char *) (b->theap.base 
- BBP_cache(tp)->theap.base);
                                tvp = VIEWvtparent(b);
-                               tmp = VIEWmosaictparent(b);
                        }
                }
        }
@@ -2725,8 +2707,6 @@ decref(bat i, bool logical, bool release
                decref(tp, false, false, lock, func);
        if (tvp)
                decref(tvp, false, false, lock, func);
-       if (tmp)
-               decref(tmp, false, false, lock, func);
        return refs;
 }
 
@@ -2937,7 +2917,6 @@ BBPdestroy(BAT *b)
 {
        bat tp = b->theap.parentid;
        bat vtp = VIEWvtparent(b);
-       bat mtp = VIEWmosaictparent(b);
 
        if (isVIEW(b)) {        /* a physical view */
                VIEWdestroy(b);
@@ -2962,14 +2941,12 @@ BBPdestroy(BAT *b)
                GDKunshare(tp);
        if (vtp)
                GDKunshare(vtp);
-       if (mtp)
-               GDKunshare(mtp);
 }
 
 static gdk_return
 BBPfree(BAT *b, const char *calledFrom)
 {
-       bat bid = b->batCacheid, tp = VIEWtparent(b), vtp = VIEWvtparent(b), 
mtp = VIEWmosaictparent(b);
+       bat bid = b->batCacheid, tp = VIEWtparent(b), vtp = VIEWvtparent(b);
        gdk_return ret;
 
        assert(bid > 0);
@@ -2998,8 +2975,6 @@ BBPfree(BAT *b, const char *calledFrom)
                GDKunshare(tp);
        if (ret == GDK_SUCCEED && vtp)
                GDKunshare(vtp);
-       if (ret == GDK_SUCCEED && mtp)
-               GDKunshare(mtp);
        return ret;
 }
 
@@ -3848,12 +3823,6 @@ BBPdiskscan(const char *parent, size_t b
                        } else if (strncmp(p + 1, "theap", 5) == 0) {
                                BAT *b = getdesc(bid);
                                delete = (b == NULL || !b->tvheap || 
!b->batCopiedtodisk);
-                       } else if (strncmp(p + 1, "mosaic", 6) == 0) {
-                               BAT *b = getdesc(bid);
-                               delete = (b == NULL || !b->tmosaic || 
!b->batCopiedtodisk);
-                       } else if (strncmp(p + 1, "vmosaic", 7) == 0) {
-                               BAT *b = getdesc(bid);
-                               delete = (b == NULL || !b->tmosaic || 
!b->batCopiedtodisk);
                        } else if (strncmp(p + 1, "thashl", 6) == 0 ||
                                   strncmp(p + 1, "thashb", 6) == 0) {
 #ifdef PERSISTENTHASH
@@ -3864,16 +3833,16 @@ BBPdiskscan(const char *parent, size_t b
 #else
                                delete = true;
 #endif
-                       } else if (strncmp(p + 1, "tmosaic", 9) == 0) {
+                       } else if (strncmp(p + 1, "tmosaic", 7) == 0) {
                                BAT *b = getdesc(bid);
                                delete = b == NULL;
                                if (!delete)
                                        b->tmosaic = (Heap *) 1;
-                       } else if (strncmp(p + 1, "tvmosaic", 10) == 0) {
+                       } else if (strncmp(p + 1, "tvmosaic", 8) == 0) {
                                BAT *b = getdesc(bid);
                                delete = b == NULL;
                                if (!delete)
-                                       b->tmosaic = (Heap *) 1;
+                                       b->tvmosaic = (Heap *) 1;
                        } else if (strncmp(p + 1, "thash", 5) == 0) {
                                /* older versions used .thash which we
                                 * can simply ignore */
diff --git a/gdk/gdk_mosaic.c b/gdk/gdk_mosaic.c
--- a/gdk/gdk_mosaic.c
+++ b/gdk/gdk_mosaic.c
@@ -22,16 +22,8 @@ void MOSunsetLock(BAT* b) {
        MT_lock_unset(&b->batIdxLock);
 }
 
-static inline void
-MOSsync(int fd) {
-#if defined(NATIVE_WIN32)
-        _commit(fd);
-#elif defined(HAVE_FDATASYNC)
-        fdatasync(fd);
-#elif defined(HAVE_FSYNC)
-        fsync(fd);
-#endif
-}
+
+#define EXT(HEAP) ("t" STRINGIFY(HEAP))
 
 #define HEAP mosaic
 #include "gdk_mosaic_templates.h"
@@ -42,28 +34,52 @@ MOSsync(int fd) {
 
 void
 MOSdestroy(BAT *bn) {
+       MT_lock_set(&bn->batIdxLock);
        MOSdestroy_mosaic(bn);
        MOSdestroy_vmosaic(bn);
+       MT_lock_unset(&bn->batIdxLock);
+}
+
+void
+MOSfree(BAT *bn) {
+       MT_lock_set(&bn->batIdxLock);
+       MOSfree_mosaic(bn);
+       MOSfree_vmosaic(bn);
+       MT_lock_unset(&bn->batIdxLock);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to