Changeset: 66b3286e1e9a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/66b3286e1e9a
Modified Files:
        gdk/gdk.h
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_rtree.c
        gdk/gdk_storage.c
Branch: geo-update-dev
Log Message:

Added RTREEdestroy calls to the appropriate places (according to STRMPdestroy) 
and fixed the destroy of RTrees to correctly unlink the file and free the 
memory.


diffs (197 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1879,8 +1879,8 @@ gdk_export gdk_return BATrtree(BAT *wkb,
 gdk_export BUN* RTREEsearch(BAT *b, mbr_t *inMBR, int result_limit);
 gdk_export void RTREEdestroy(BAT *b);
 gdk_export void RTREEfree(BAT *b);
-gdk_export void RTREEdecref(RTree *rtree);
-gdk_export void RTREEincref(RTree *rtree);
+gdk_export void RTREEdecref(BAT *b);
+gdk_export void RTREEincref(BAT *b);
 
 /* The ordered index structure */
 
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -338,6 +338,7 @@ VIEWdestroy(BAT *b)
        IMPSdestroy(b);
        OIDXdestroy(b);
        STRMPdestroy(b);
+       RTREEdestroy(b);
 
        MT_lock_set(&b->theaplock);
        PROPdestroy_nolock(b);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -587,6 +587,7 @@ BATclear(BAT *b, bool force)
        IMPSdestroy(b);
        OIDXdestroy(b);
        STRMPdestroy(b);
+       RTREEdestroy(b);
        PROPdestroy(b);
 
        /* we must dispose of all inserted atoms */
@@ -668,6 +669,7 @@ BATfree(BAT *b)
        IMPSfree(b);
        OIDXfree(b);
        STRMPfree(b);
+       RTREEfree(b);
        MT_lock_set(&b->theaplock);
        if (nunique != BUN_NONE) {
                b->tunique_est = (double) nunique;
@@ -1284,6 +1286,7 @@ BUNappendmulti(BAT *b, const void *value
        IMPSdestroy(b); /* no support for inserts in imprints yet */
        OIDXdestroy(b);
        STRMPdestroy(b);        /* TODO: use STRMPappendBitstring */
+       RTREEdestroy(b);
        return GDK_SUCCEED;
 }
 
@@ -1518,6 +1521,7 @@ BUNinplacemulti(BAT *b, const oid *posit
                OIDXdestroy(b);
                IMPSdestroy(b);
                STRMPdestroy(b);
+               RTREEdestroy(b);
 
                if (b->tvheap && b->ttype) {
                        var_t _d;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -701,6 +701,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
        IMPSdestroy(b);         /* imprints do not support updates yet */
        OIDXdestroy(b);
        STRMPdestroy(b);        /* TODO: use STRMPappendBitString */
+       RTREEdestroy(b);
 
        MT_lock_set(&b->theaplock);
 
@@ -930,6 +931,7 @@ BATdel(BAT *b, BAT *d)
        HASHdestroy(b);
        PROPdestroy(b);
        STRMPdestroy(b);
+       RTREEdestroy(b);
        if (BATtdense(d)) {
                oid o = d->tseqbase;
                BUN c = BATcount(d);
@@ -1124,6 +1126,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
        OIDXdestroy(b);
        IMPSdestroy(b);
        STRMPdestroy(b);
+       RTREEdestroy(b);
        /* load hash so that we can maintain it */
        (void) BATcheckhash(b);
 
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1144,6 +1144,7 @@ fixhashashbat(BAT *b)
        OIDXdestroy(b);
        PROPdestroy(b);
        STRMPdestroy(b);
+       RTREEdestroy(b);
 
        /* make backup of heaps */
        const char *t;
diff --git a/gdk/gdk_rtree.c b/gdk/gdk_rtree.c
--- a/gdk/gdk_rtree.c
+++ b/gdk/gdk_rtree.c
@@ -3,6 +3,7 @@
 #include "gdk_private.h"
 
 //TODO Why use BBPselectfarm?
+//TODO Check if we need to input RTREEdestroy into drop_index func in sql_cat.c
 
 //TODO Do we need to guard against dirty heap and deleted rows? -> Panos only 
does this for persisting, not creating
 //TODO Where do put the RTREEdestroy calls? We should invalidate on updates, 
deletes and inserts -> Check Panos impl
@@ -23,23 +24,23 @@ RTREEcreatecheck (BAT *b) {
 }
 
 void
-RTREEdecref(RTree *rtree)
+RTREEdecref(BAT *b)
 {
-       ATOMIC_BASE_TYPE refs = ATOMIC_DEC(&rtree->refs);
+       ATOMIC_BASE_TYPE refs = ATOMIC_DEC(&b->trtree->refs);
        //If RTree is marked for destruction and there are no refs, destroy the 
RTree
-       if (rtree->destroy && refs == 0) {
-               ATOMIC_DESTROY(&rtree->refs);
-               rtree_destroy(rtree->rtree);
-               rtree->rtree = NULL;
-               rtree = NULL;
+       if (b->trtree->destroy && refs == 0) {
+               ATOMIC_DESTROY(&b->trtree->refs);
+               rtree_destroy(b->trtree->rtree);
+               b->trtree->rtree = NULL;
+               b->trtree = NULL;
        }
 
 }
 
 void
-RTREEincref(RTree *rtree)
+RTREEincref(BAT *b)
 {
-       ATOMIC_INC(&rtree->refs);
+       ATOMIC_INC(&b->trtree->refs);
 }
 
 // Persist rtree to disk if the conditions are right
@@ -248,7 +249,7 @@ RTREEfree(BAT *b)
                MT_lock_set(&pb->batIdxLock);
                //Mark the RTree for destruction
                pb->trtree->destroy = true;
-               RTREEdecref(pb->trtree);
+               RTREEdecref(pb);
                MT_lock_unset(&b->batIdxLock);
        }
 }
@@ -266,13 +267,13 @@ RTREEdestroy(BAT *b)
        }
 
        //TODO When there is a RTree index on file (i.e. not loaded yet) and 
this method is called, we should unlink the file (no need to touch refs)
-       if (pb && pb->trtree->rtree) {
+       if (pb && pb->trtree) {
                MT_lock_set(&pb->batIdxLock);
                //Mark the RTree for destruction
                pb->trtree->destroy = true;
-               RTREEdecref(pb->trtree);
+               RTREEdecref(pb);
                //If the farm is in-memory, don't unlink the file (there is no 
file in that case)
-               if (GDKinmemory(pb->theap->farmid)) {
+               if (!GDKinmemory(pb->theap->farmid)) {
                        GDKunlink(pb->theap->farmid,
                                BATDIR,
                                BBP_physical(b->batCacheid),
@@ -319,7 +320,7 @@ RTREEsearch(BAT *b, mbr_t *inMBR, int re
        rtree_t *rtree = pb->trtree->rtree;
        if (rtree != NULL) {
                //Increase ref, we're gonna use the index
-               RTREEincref(pb->trtree);
+               RTREEincref(pb);
                BUN *candidates = GDKmalloc(result_limit*sizeof(BUN));
                memset(candidates,BUN_NONE,result_limit*sizeof(BUN));
 
@@ -334,7 +335,7 @@ RTREEsearch(BAT *b, mbr_t *inMBR, int re
                results.candidates = candidates;
                rtree_search(rtree, (const rtree_coord_t*) rect, f, &results);
                //Finished using the index, decrease ref
-               RTREEdecref(pb->trtree);
+               RTREEdecref(pb);
                return candidates;
        } else
                return NULL;
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -873,6 +873,7 @@ BATdelete(BAT *b)
        OIDXdestroy(b);
        PROPdestroy_nolock(b);
        STRMPdestroy(b);
+       RTREEdestroy(b);
        HEAPfree(b->theap, true);
        if (b->tvheap)
                HEAPfree(b->tvheap, true);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to