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