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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list