Changeset: 8da4ae1041f8 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8da4ae1041f8
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/store.c
Branch: default
Log Message:
fixed leak(s) in bat delta management
fixed crash
diffs (227 lines):
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -515,6 +515,7 @@ dup_del(sql_trans *tr, sql_table *ot, sq
{
sql_dbat *bat = t->data = ZNEW(sql_dbat), *obat = ot->data;
int ok = dup_dbat( tr, obat, bat, isNew(t), isTempTable(t));
+ assert(t->base.allocated == 0);
t->base.allocated = 1;
return ok;
}
@@ -615,12 +616,9 @@ delete_tab(sql_trans *tr, sql_table * t,
sql_column *c = n->data;
sql_delta *bat;
- if (!c->data || !c->base.allocated) {
- int type = c->type.type->localtype;
+ if (!c->data) {
sql_column *oc = tr_find_column(tr->parent, c);
- sql_delta *bat = c->data = ZNEW(sql_delta), *obat =
timestamp_delta(oc->data, tr->stime);
- (void)dup_bat(tr, c->t, obat, bat, type, isNew(oc),
c->base.flag == TR_NEW);
- c->base.allocated = 1;
+ c->data = timestamp_delta(oc->data, tr->stime);
}
bat = c->data;
if (bat->cached) {
@@ -633,12 +631,9 @@ delete_tab(sql_trans *tr, sql_table * t,
sql_idx *i = n->data;
sql_delta *bat;
- if (!i->data || !i->base.allocated) {
- int type =
(i->type==join_idx)?TYPE_oid:TYPE_wrd;
+ if (!i->data) {
sql_idx *oi = tr_find_idx(tr->parent, i);
- sql_delta *bat = i->data = ZNEW(sql_delta),
*obat = timestamp_delta(oi->data, tr->stime);
- (void)dup_bat(tr, i->t, obat, bat, type,
isNew(i), i->base.flag == TR_NEW);
- i->base.allocated = 1;
+ i->data = timestamp_delta(oi->data, tr->stime);
}
bat = i->data;
if (bat && bat->cached) {
@@ -846,7 +841,7 @@ new_persistent_bat(sql_trans *tr, sql_de
return new_persistent_delta(bat, sz);
}
-void
+static void
create_delta( sql_delta *d, BAT *b, BAT *i, bat u)
{
d->cnt = BATcount(i);
@@ -1130,7 +1125,7 @@ log_destroy_delta(sql_trans *tr, sql_del
return ok;
}
-int
+static int
destroy_delta(sql_delta *b)
{
if (b->name)
@@ -1206,8 +1201,8 @@ log_destroy_idx(sql_trans *tr, sql_idx *
return LOG_OK;
}
-int
-destroy_dbat(sql_dbat *bat)
+static int
+destroy_dbat(sql_trans *tr, sql_dbat *bat)
{
sql_dbat *n = bat->next;
@@ -1217,24 +1212,20 @@ destroy_dbat(sql_dbat *bat)
temp_destroy(bat->dbid);
bat->dbid = 0;
bat->dname = NULL;
+ _DELETE(bat);
if (n)
- return destroy_dbat(n);
+ return destroy_dbat(tr, n);
return LOG_OK;
}
static int
destroy_del(sql_trans *tr, sql_table *t)
{
- int ok = 0;
- sql_dbat *bat = t->data;
+ int ok = LOG_OK;
- (void)tr;
- if (!bat)
- return LOG_OK;
- if (bat && t->base.allocated) {
+ if (t->data && t->base.allocated) {
t->base.allocated = 0;
- ok = destroy_dbat(bat);
- _DELETE(bat);
+ ok = destroy_dbat(tr, t->data);
}
t->data = NULL;
return ok;
@@ -1265,7 +1256,7 @@ log_destroy_del(sql_trans *tr, sql_table
return LOG_OK;
}
-BUN
+static BUN
clear_delta(sql_trans *tr, sql_delta *bat)
{
BAT *b;
@@ -1334,7 +1325,7 @@ clear_idx(sql_trans *tr, sql_idx *i)
return 0;
}
-BUN
+static BUN
clear_dbat(sql_trans *tr, sql_dbat *bat)
{
BUN sz = 0;
@@ -1631,7 +1622,6 @@ tr_update_dbat(sql_trans *tr, sql_dbat *
if (!fdb)
return ok;
- (void)tr;
assert(store_nr_active==1);
db = temp_descriptor(fdb->dbid);
if (BUNlast(db) > db->batInserted || cleared) {
@@ -1650,7 +1640,7 @@ tr_update_dbat(sql_trans *tr, sql_dbat *
}
bat_destroy(db);
if (tdb->next) {
- ok = destroy_dbat(tdb->next);
+ ok = destroy_dbat(tr, tdb->next);
tdb->next = NULL;
}
return ok;
@@ -1686,9 +1676,10 @@ update_table(sql_trans *tr, sql_table *f
}
if (b && b->wtime > oldest->stime && p) {
p->next = NULL;
- destroy_dbat(b);
+ destroy_dbat(tr, b);
}
} else {
+ assert(tt->base.allocated);
tr_update_dbat(tr, tt->data, ft->data, ft->cleared);
}
}
@@ -1717,6 +1708,7 @@ update_table(sql_trans *tr, sql_table *f
destroy_bat(tr, b);
}
} else {
+ assert(oc->base.allocated);
tr_update_delta(tr, oc->data, cc->data,
SNAPSHOT_MINSIZE);
}
@@ -1754,6 +1746,7 @@ update_table(sql_trans *tr, sql_table *f
destroy_bat(tr, b);
}
} else {
+ assert(oi->base.allocated);
tr_update_delta(tr, oi->data, ci->data,
SNAPSHOT_MINSIZE);
}
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -47,12 +47,6 @@ typedef struct sql_dbat {
/* initialize bat storage call back functions interface */
extern int bat_storage_init( store_functions *sf );
-extern void create_delta( sql_delta *d, BAT *b, BAT *i, bat u);
-extern int destroy_delta(sql_delta *b);
-extern int destroy_dbat(sql_dbat *bat);
-
-extern BUN clear_delta(sql_trans *tr, sql_delta *bat);
-extern BUN clear_dbat(sql_trans *tr, sql_dbat *bat);
extern int tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat,
BUN snapshot_minsize);
extern int tr_update_dbat(sql_trans *tr, sql_dbat *tdb, sql_dbat *fdb, int
cleared);
extern int tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2937,12 +2937,8 @@ reset_idx(sql_trans *tr, sql_idx *fi, sq
{
/* did we make changes or is the global changed after we started */
if (fi->base.rtime || fi->base.wtime || tr->stime < pfi->base.wtime) {
- if (isTable(fi->t)) {
- if (fi->base.allocated)
- store_funcs.destroy_idx(NULL, fi);
- fi->data = NULL;
- fi->base.allocated = 0;
- }
+ if (isTable(fi->t))
+ store_funcs.destroy_idx(NULL, fi);
fi->base.wtime = fi->base.rtime = 0;
}
return LOG_OK;
@@ -2954,12 +2950,8 @@ reset_column(sql_trans *tr, sql_column *
/* did we make changes or is the global changed after we started */
if (fc->base.rtime || fc->base.wtime || tr->stime < pfc->base.wtime) {
- if (isTable(fc->t)) {
- if (fc->base.allocated)
- store_funcs.destroy_col(NULL, fc);
- fc->data = NULL;
- fc->base.allocated = 0;
- }
+ if (isTable(fc->t))
+ store_funcs.destroy_col(NULL, fc);
fc->null = pfc->null;
fc->unique = pfc->unique;
@@ -3000,12 +2992,8 @@ reset_table(sql_trans *tr, sql_table *ft
if (ft->base.rtime || ft->base.wtime || tr->stime < pft->base.wtime) {
int ok = LOG_OK;
- if (isTable(ft)) {
- if (ft->base.allocated)
- store_funcs.destroy_del(NULL, ft);
- ft->data = NULL;
- ft->base.allocated = 0;
- }
+ if (isTable(ft))
+ store_funcs.destroy_del(NULL, ft);
ft->base.wtime = ft->base.rtime = 0;
ok = reset_changeset( tr, &ft->columns, &pft->columns,
&ft->base, (resetf) &reset_column, (dupfunc) &column_dup);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list