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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list