Changeset: 39a15185b5d7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=39a15185b5d7
Modified Files:
        sql/server/sql_mvc.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jul2015
Log Message:

fix crash in savepoint release code


diffs (145 lines):

diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -180,10 +180,44 @@ mvc_trans(mvc *m)
        store_unlock();
 }
 
+static sql_trans *
+sql_trans_deref( sql_trans *tr ) 
+{
+       node *n, *m, *o;
+
+       for ( n = tr->schemas.set->h; n; n = n->next) {
+               sql_schema *s = n->data;
+
+               if (s->tables.set)
+               for ( m = s->tables.set->h; m; m = m->next) {
+                       sql_table *t = m->data;
+
+                       if (t->po) 
+                               t->po = t->po->po;
+
+                       if (t->columns.set)
+                       for ( o = t->columns.set->h; o; o = o->next) {
+                               sql_column *c = o->data;
+
+                               if (c->po) 
+                                       c->po = c->po->po;
+                       }
+                       if (t->idxs.set)
+                       for ( o = t->idxs.set->h; o; o = o->next) {
+                               sql_idx *i = o->data;
+
+                               if (i->po) 
+                                       i->po = i->po->po;
+                       }
+               }
+       }
+       return tr->parent;
+}
+
 int
 mvc_commit(mvc *m, int chain, const char *name)
 {
-       sql_trans *cur, *tr = m->session->tr;
+       sql_trans *cur, *tr = m->session->tr, *ctr;
        int ok = SQL_OK;//, wait = 0;
 
        assert(tr);
@@ -217,11 +251,15 @@ build up the hash (not copyied in the tr
        }
 
        /* first release all intermediate savepoints */
-       cur = tr;
+       ctr = cur = tr;
        tr = tr->parent;
        if (tr->parent) {
                store_lock();
                while (tr->parent != NULL && ok == SQL_OK) {
+                       /* first free references to tr objects, ie
+                        * c->po = c->po->po etc
+                        */
+                       ctr = sql_trans_deref(ctr);
                        tr = sql_trans_destroy(tr);
                }
                store_unlock();
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
@@ -15,6 +15,13 @@
 
 #define SNAPSHOT_MINSIZE ((BUN) 1024*128)
 
+static sql_trans *
+oldest_active_transaction(void)
+{
+       sql_session *s = active_sessions->h->data;
+       return s->tr;
+}
+
 sql_delta *
 timestamp_delta( sql_delta *d, int ts)
 {
@@ -2087,7 +2094,7 @@ tr_merge_dbat(sql_trans *tr, sql_dbat *t
 static int
 update_table(sql_trans *tr, sql_table *ft, sql_table *tt)
 {
-       sql_trans *oldest = active_transactions->h->data;
+       sql_trans *oldest = oldest_active_transaction();
        int ok = LOG_OK;
        node *n, *m;
 
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -33,7 +33,7 @@ typedef enum store_type {
 #define STORE_READONLY (store_readonly)
 
 extern sql_trans *gtrans;
-extern list *active_transactions;
+extern list *active_sessions;
 extern int store_nr_active;
 extern store_type active_store_type;
 extern int store_readonly;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -28,7 +28,7 @@ static int prev_oid = 0;
 static int nr_sessions = 0;
 static int transactions = 0;
 sql_trans *gtrans = NULL;
-list *active_transactions = NULL;
+list *active_sessions = NULL;
 int store_nr_active = 0;
 store_type active_store_type = store_bat;
 int store_readonly = 0;
@@ -1385,7 +1385,7 @@ store_init(int debug, store_type store, 
 
        sequences_init();
        gtrans = tr = create_trans(sa, stk);
-       active_transactions = sa_list(sa); 
+       active_sessions = sa_list(sa); 
 
        store_readonly = readonly;
        store_singleuser = singleuser;
@@ -5270,7 +5270,7 @@ sql_trans_begin(sql_session *s)
        s->schema = find_sql_schema(tr, s->schema_name);
        s->tr = tr;
        store_nr_active ++;
-       list_append(active_transactions, tr); 
+       list_append(active_sessions, s); 
        s->status = 0;
 #ifdef STORE_DEBUG
        fprintf(stderr,"#sql trans begin (%d)\n", tr->schema_number);
@@ -5286,7 +5286,7 @@ sql_trans_end(sql_session *s)
 #endif
        s->active = 0;
        s->auto_commit = s->ac_on_commit;
-       list_remove_data(active_transactions, s->tr);
+       list_remove_data(active_sessions, s);
        store_nr_active --;
-       assert(list_length(active_transactions) == store_nr_active);
-}
+       assert(list_length(active_sessions) == store_nr_active);
+}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to