Changeset: 1672a3ca5d86 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1672a3ca5d86 Modified Files: sql/server/sql_mvc.c sql/storage/sql_storage.h sql/storage/store.c Branch: default Log Message:
Merge with Apr2019 branch. diffs (191 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 @@ -412,7 +412,7 @@ mvc_commit(mvc *m, int chain, const char if (mvc_debug) fprintf(stderr, "#mvc_savepoint\n"); store_lock(); - m->session->tr = sql_trans_create(m->session->stk, tr, name); + m->session->tr = sql_trans_create(m->session->stk, tr, name, true); if(!m->session->tr) { store_unlock(); msg = createException(SQL, "sql.commit", SQLSTATE(HY001) "%s allocation failure while committing the transaction, will ROLLBACK instead", operation); @@ -452,7 +452,7 @@ build up the hash (not copied in the tra ctr = sql_trans_deref(ctr); } while (tr->parent != NULL && ok == SQL_OK) - tr = sql_trans_destroy(tr); + tr = sql_trans_destroy(tr, true); store_unlock(); } cur -> parent = tr; @@ -556,7 +556,7 @@ mvc_rollback(mvc *m, int chain, const ch /* make sure we do not reuse changed data */ if (tr->wtime) tr->status = 1; - tr = sql_trans_destroy(tr); + tr = sql_trans_destroy(tr, true); } m->session->tr = tr; /* restart at savepoint */ m->session->status = tr->status; @@ -566,7 +566,7 @@ mvc_rollback(mvc *m, int chain, const ch } else if (tr->parent) { /* first release all intermediate savepoints */ while (tr->parent->parent != NULL) { - tr = sql_trans_destroy(tr); + tr = sql_trans_destroy(tr, true); } m->session-> tr = tr; /* make sure we do not reuse changed data */ @@ -627,7 +627,7 @@ mvc_release(mvc *m, const char *name) /* commit all intermediate savepoints */ if (sql_trans_commit(tr) != SQL_OK) GDKfatal("release savepoints should not fail"); - tr = sql_trans_destroy(tr); + tr = sql_trans_destroy(tr, true); } tr->name = NULL; store_unlock(); @@ -733,7 +733,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w assert(m->session->tr->active == 0); store_lock(); while (tr->parent->parent != NULL) - tr = sql_trans_destroy(tr); + tr = sql_trans_destroy(tr, true); store_unlock(); } if (tr && !sql_session_reset(m->session, 1 /*autocommit on*/)) @@ -802,7 +802,7 @@ mvc_destroy(mvc *m) if (m->session->tr->active) sql_trans_end(m->session); while (tr->parent) - tr = sql_trans_destroy(tr); + tr = sql_trans_destroy(tr, true); m->session->tr = NULL; store_unlock(); } 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 @@ -353,8 +353,8 @@ extern void store_lock(void); extern void store_unlock(void); extern int store_next_oid(void); -extern sql_trans *sql_trans_create(backend_stack stk, sql_trans *parent, const char *name); -extern sql_trans *sql_trans_destroy(sql_trans *tr); +extern sql_trans *sql_trans_create(backend_stack stk, sql_trans *parent, const char *name, bool try_spare); +extern sql_trans *sql_trans_destroy(sql_trans *tr, bool try_spare); extern bool sql_trans_validate(sql_trans *tr); extern int sql_trans_commit(sql_trans *tr); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -220,7 +220,7 @@ trans_drop_tmp(sql_trans *tr) #endif sql_trans * -sql_trans_destroy(sql_trans *t) +sql_trans_destroy(sql_trans *t, bool try_spare) { sql_trans *res = t->parent; @@ -228,7 +228,7 @@ sql_trans_destroy(sql_trans *t) fprintf(stderr, "#destroy trans (%p)\n", t); #endif - if (res == gtrans && spares < MAX_SPARES && !t->name) { + if (res == gtrans && spares < MAX_SPARES && !t->name && try_spare) { #ifdef STORE_DEBUG fprintf(stderr, "#spared (%d) trans (%p)\n", spares, t); #endif @@ -254,7 +254,7 @@ destroy_spare_transactions(void) spares = MAX_SPARES; /* ie now there not spared anymore */ for (i = 0; i < s; i++) { - sql_trans_destroy(spare_trans[i]); + sql_trans_destroy(spare_trans[i], false); } spares = 0; } @@ -1793,7 +1793,7 @@ store_load(void) { /* cannot initialize database in readonly mode */ if (store_readonly) return -1; - tr = sql_trans_create(backend_stk, NULL, NULL); + tr = sql_trans_create(backend_stk, NULL, NULL, true); if (!tr) { fprintf(stderr, "Failure to start a transaction while loading the storage\n"); return -1; @@ -1962,7 +1962,7 @@ store_load(void) { if (sql_trans_commit(tr) != SQL_OK) { fprintf(stderr, "cannot commit initial transaction\n"); } - sql_trans_destroy(tr); + sql_trans_destroy(tr, true); } else { GDKqsort(store_oids, NULL, NULL, nstore_oids, sizeof(sqlid), 0, TYPE_int, false, false); store_oid = store_oids[nstore_oids - 1] + 1; @@ -2194,7 +2194,7 @@ store_exit(void) exit (but leak memory). */ if (!transactions) { - sql_trans_destroy(gtrans); + sql_trans_destroy(gtrans, false); gtrans = NULL; } #ifdef STORE_DEBUG @@ -4205,12 +4205,12 @@ reset_trans(sql_trans *tr, sql_trans *pt } sql_trans * -sql_trans_create(backend_stack stk, sql_trans *parent, const char *name) +sql_trans_create(backend_stack stk, sql_trans *parent, const char *name, bool try_spare) { sql_trans *tr = NULL; if (gtrans) { - if (!parent && spares > 0 && !name) { + if (!parent && spares > 0 && !name && try_spare) { tr = spare_trans[--spares]; #ifdef STORE_DEBUG fprintf(stderr, "#reuse trans (%p) %d\n", tr, spares); @@ -6638,7 +6638,7 @@ sql_session_create(backend_stack stk, in s = ZNEW(sql_session); if (!s) return NULL; - s->tr = sql_trans_create(s->stk, NULL, NULL); + s->tr = sql_trans_create(s->stk, NULL, NULL, true); if(!s->tr) { _DELETE(s); return NULL; @@ -6647,7 +6647,7 @@ sql_session_create(backend_stack stk, in s->tr->active = 0; s->stk = stk; if(!sql_session_reset(s, ac)) { - sql_trans_destroy(s->tr); + sql_trans_destroy(s->tr, true); _DELETE(s); return NULL; } @@ -6660,7 +6660,7 @@ sql_session_destroy(sql_session *s) { assert(!s->tr || s->tr->active == 0); if (s->tr) - sql_trans_destroy(s->tr); + sql_trans_destroy(s->tr, true); if (s->schema_name) _DELETE(s->schema_name); _DELETE(s); @@ -6718,9 +6718,8 @@ sql_trans_begin(sql_session *s) (tr->stime < gtrans->wstime || tr->wtime || store_schema_number() != snr)) { if (!list_empty(tr->moved_tables)) { - tr->name = (char*)1; /* make sure it get destroyed properly */ - sql_trans_destroy(tr); - s->tr = tr = sql_trans_create(s->stk, NULL, NULL); + sql_trans_destroy(tr, false); + s->tr = tr = sql_trans_create(s->stk, NULL, NULL, false); } else { reset_trans(tr, gtrans); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list