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]