Changeset: 90bdae54a2ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=90bdae54a2ef
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jun2020
Log Message:

do a deep copy of the global transaction structure, within the 
store_apply_delta's, when no other 'sessions' are running.
This frees any data leftover from previous drops solving bug 6401.
Current setting is extreme (ie always if possible). We may need to have a 
tunable for this.


diffs (truncated from 565 to 300 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
@@ -592,14 +592,8 @@ dup_bat(sql_trans *tr, sql_table *t, sql
 }
 
 static int
-update_col(sql_trans *tr, sql_column *c, void *tids, void *upd, int tpe)
+bind_col_data(sql_trans *tr, sql_column *c) 
 {
-       BAT *b = tids;
-       sql_delta *bat;
-
-       if (tpe == TYPE_bat && !BATcount(b)) 
-               return LOG_OK;
-
        if (!c->data || !c->base.allocated) {
                int type = c->type.type->localtype;
                sql_column *oc = tr_find_column(tr->parent, c);
@@ -612,6 +606,21 @@ update_col(sql_trans *tr, sql_column *c,
                        return LOG_ERR;
                c->base.allocated = 1;
        }
+       return LOG_OK;
+}
+
+static int
+update_col(sql_trans *tr, sql_column *c, void *tids, void *upd, int tpe)
+{
+       BAT *b = tids;
+       sql_delta *bat;
+
+       if (tpe == TYPE_bat && !BATcount(b)) 
+               return LOG_OK;
+
+       if (bind_col_data(tr, c) == LOG_ERR)
+               return LOG_ERR;
+
        bat = c->data;
        bat->wtime = c->base.wtime = c->t->base.wtime = c->t->s->base.wtime = 
tr->wtime = tr->wstime;
        assert(tr != gtrans);
@@ -622,15 +631,9 @@ update_col(sql_trans *tr, sql_column *c,
                return delta_update_val(bat, *(oid*)tids, upd);
 }
 
-static int 
-update_idx(sql_trans *tr, sql_idx * i, void *tids, void *upd, int tpe)
+static int
+bind_idx_data(sql_trans *tr, sql_idx *i) 
 {
-       BAT *b = tids;
-       sql_delta *bat;
-
-       if (tpe == TYPE_bat && !BATcount(b)) 
-               return LOG_OK;
-
        if (!i->data || !i->base.allocated) {
                int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
                sql_idx *oi = tr_find_idx(tr->parent, i);
@@ -643,6 +646,21 @@ update_idx(sql_trans *tr, sql_idx * i, v
                        return LOG_ERR;
                i->base.allocated = 1;
        }
+       return LOG_OK;
+}
+
+static int 
+update_idx(sql_trans *tr, sql_idx * i, void *tids, void *upd, int tpe)
+{
+       BAT *b = tids;
+       sql_delta *bat;
+
+       if (tpe == TYPE_bat && !BATcount(b)) 
+               return LOG_OK;
+
+       if (bind_idx_data(tr, i) == LOG_ERR)
+               return LOG_ERR;
+
        bat = i->data;
        bat->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime = 
tr->wtime = tr->wstime;
        assert(tr != gtrans);
@@ -839,23 +857,8 @@ append_col(sql_trans *tr, sql_column *c,
        if (tpe == TYPE_bat && !BATcount(b)) 
                return ok;
 
-       if (!c->data || !c->base.allocated) {
-               int type = c->type.type->localtype;
-               sql_column *oc = tr_find_column(tr->parent, c);
-               sql_delta *bat = ZNEW(sql_delta), *obat;
-               if (!bat)
-                       ok = LOG_ERR;
-               else {
-                       c->data = bat;
-                       obat = timestamp_delta(oc->data, c->base.stime);
-                       ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc), 
isNew(c));
-                       if(ok == LOG_OK)
-                               c->base.allocated = 1;
-               }
-       }
-
-       if(ok == LOG_ERR)
-               return ok;
+       if (bind_col_data(tr, c) == LOG_ERR)
+               return LOG_ERR;
 
        bat = c->data;
        /* appends only write */
@@ -868,24 +871,6 @@ append_col(sql_trans *tr, sql_column *c,
                ok = delta_append_bat(bat, i);
        else
                ok = delta_append_val(bat, i);
-       /*
-       if (!c->t->data || !c->t->base.allocated) {
-               sql_table *ot = tr_find_table(tr->parent, c->t);
-               sql_dbat *bat = ZNEW(sql_dbat), *obat;
-               if (!bat)
-                       return LOG_ERR;
-               c->t->data = bat;
-               obat = timestamp_dbat(ot->data, c->t->base.stime);
-               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(c->t));
-               c->t->base.allocated = 1;
-       }
-       if (c->t && c->t->data && ((sql_dbat*)c->t->data)->cached) {
-               sql_dbat *bat = c->t->data;
-
-               bat_destroy(bat->cached);
-               bat->cached = NULL;
-       }
-       */
        return ok;
 }
 
@@ -899,23 +884,8 @@ append_idx(sql_trans *tr, sql_idx * i, v
        if (tpe == TYPE_bat && !BATcount(b)) 
                return ok;
 
-       if (!i->data || !i->base.allocated) {
-               int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
-               sql_idx *oi = tr_find_idx(tr->parent, i);
-               sql_delta *bat = ZNEW(sql_delta), *obat;
-               if(!bat)
-                       ok = LOG_ERR;
-               else {
-                       i->data = bat;
-                       obat = timestamp_delta(oi->data, i->base.stime);
-                       ok = dup_bat(tr, i->t, obat, bat, type, isNew(oi), 
isNew(i));
-                       if(ok == LOG_OK)
-                               i->base.allocated = 1;
-               }
-       }
-
-       if(ok == LOG_ERR)
-               return ok;
+       if (bind_idx_data(tr, i) == LOG_ERR)
+               return LOG_ERR;
 
        bat = i->data;
        /* appends only write */
@@ -924,25 +894,6 @@ append_idx(sql_trans *tr, sql_idx * i, v
                ok = delta_append_bat(bat, ib);
        else
                ok = delta_append_val(bat, ib);
-       /*
-       if (!i->t->data || !i->t->base.allocated) {
-               sql_table *ot = tr_find_table(tr->parent, i->t);
-               sql_dbat *bat = ZNEW(sql_dbat), *obat;
-               if(!bat)
-                       return LOG_ERR;
-               i->t->data = bat;
-               obat = timestamp_dbat(ot->data, i->t->base.stime);
-               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(i->t));
-               i->t->base.allocated = 1;
-       }
-
-       if (i->t && i->t->data && ((sql_dbat*)i->t->data)->cached) {
-               sql_dbat *bat = i->t->data;
-
-               bat_destroy(bat->cached);
-               bat->cached = NULL;
-       }
-       */
        return ok;
 }
 
@@ -1007,6 +958,22 @@ delta_delete_val( sql_dbat *bat, oid rid
 }
 
 static int
+bind_del_data(sql_trans *tr, sql_table *t)
+{
+       if (!t->data || !t->base.allocated) {
+               sql_table *ot = tr_find_table(tr->parent, t);
+               sql_dbat *bat = ZNEW(sql_dbat), *obat;
+               if(!bat)
+                       return LOG_ERR;
+               t->data = bat;
+               obat = timestamp_dbat(ot->data, t->base.stime);
+               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
+               t->base.allocated = 1;
+       }
+       return LOG_OK;
+}
+
+static int
 delete_tab(sql_trans *tr, sql_table * t, void *ib, int tpe)
 {
        BAT *b = ib;
@@ -1017,16 +984,9 @@ delete_tab(sql_trans *tr, sql_table * t,
        if (tpe == TYPE_bat && !BATcount(b)) 
                return ok;
 
-       if (!t->data || !t->base.allocated) {
-               sql_table *ot = tr_find_table(tr->parent, t);
-               sql_dbat *bat = ZNEW(sql_dbat), *obat;
-               if(!bat)
-                       return LOG_ERR;
-               t->data = bat;
-               obat = timestamp_dbat(ot->data, t->base.stime);
-               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t));
-               t->base.allocated = 1;
-       }
+       if (bind_del_data(tr, t) == LOG_ERR)
+               return LOG_ERR;
+
        bat = t->data;
        /* delete all cached copies */
 
@@ -2034,18 +1994,8 @@ clear_delta(sql_trans *tr, sql_delta *ba
 static BUN 
 clear_col(sql_trans *tr, sql_column *c)
 {
-       if (!c->data || !c->base.allocated) {
-               int type = c->type.type->localtype;
-               sql_column *oc = tr_find_column(tr->parent, c);
-               sql_delta *bat = c->data = ZNEW(sql_delta), *obat;
-               if(!bat)
-                       return 0;
-               obat = timestamp_delta(oc->data, c->base.stime);
-               assert(tr != gtrans);
-               if(dup_bat(tr, c->t, obat, bat, type, isNew(oc), isNew(c)) == 
LOG_ERR)
-                       return 0;
-               c->base.allocated = 1;
-       }
+       if (bind_col_data(tr, c) == LOG_ERR)
+               return 0;
        c->t->s->base.wtime = c->t->base.wtime = c->base.wtime = tr->wstime;
        if (c->data)
                return clear_delta(tr, c->data);
@@ -2057,17 +2007,8 @@ clear_idx(sql_trans *tr, sql_idx *i)
 {
        if (!isTable(i->t) || (hash_index(i->type) && list_length(i->columns) 
<= 1) || !idx_has_column(i->type))
                return 0;
-       if (!i->data || !i->base.allocated) {
-               int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
-               sql_idx *oi = tr_find_idx(tr->parent, i);
-               sql_delta *bat = i->data = ZNEW(sql_delta), *obat;
-               if(!bat)
-                       return 0;
-               obat = timestamp_delta(oi->data, i->base.stime);
-               if(dup_bat(tr, i->t, obat, bat, type, isNew(oi), isNew(i)))
-                       return 0;
-               i->base.allocated = 1;
-       }
+       if (bind_idx_data(tr, i) == LOG_ERR)
+               return 0;
        i->t->s->base.wtime = i->t->base.wtime = i->base.wtime = tr->wstime;
        if (i->data)
                return clear_delta(tr, i->data);
@@ -2104,15 +2045,9 @@ clear_dbat(sql_trans *tr, sql_dbat *bat)
 static BUN
 clear_del(sql_trans *tr, sql_table *t)
 {
-       if (!t->data || !t->base.allocated) {
-               sql_table *ot = tr_find_table(tr->parent, t);
-               sql_dbat *bat = t->data = ZNEW(sql_dbat), *obat;
-               if(!bat)
-                       return 0;
-               obat = timestamp_dbat(ot->data, t->base.stime);
-               dup_dbat(tr, obat, bat, isNew(ot), isTempTable(t)); 
-               t->base.allocated = 1;
-       }
+
+       if (bind_del_data(tr, t) == LOG_ERR)
+               return 0;
        t->s->base.wtime = t->base.wtime = tr->wstime;
        return clear_dbat(tr, t->data);
 }
@@ -3140,6 +3075,10 @@ bat_storage_init( store_functions *sf)
        sf->bind_idx = (bind_idx_fptr)&bind_idx;
        sf->bind_del = (bind_del_fptr)&bind_del;
 
+       sf->bind_col_data = (bind_col_data_fptr)&bind_col_data;
+       sf->bind_idx_data = (bind_idx_data_fptr)&bind_idx_data;
+       sf->bind_del_data = (bind_del_data_fptr)&bind_del_data;
+       
        sf->append_col = (append_col_fptr)&append_col;
        sf->append_idx = (append_idx_fptr)&append_idx;
        sf->update_col = (update_col_fptr)&update_col;
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to