Changeset: 7c042c27748f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7c042c27748f
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_result.c
sql/include/sql_catalog.h
sql/server/sql_mvc.c
sql/server/sql_partition.c
sql/server/sql_privileges.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/bat/bat_table.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: nospare
Log Message:
mvcc using a single catalog tree with chains of versions (ie objects can be
chained (most recent object first), and content (delta storage) is chained)
diffs (truncated from 6164 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -5363,8 +5363,6 @@ sql_truncate(backend *be, sql_table *t,
error = 1;
goto finalize;
}
- seq->base.wtime =
sche->base.wtime = tr->wtime = tr->wstime;
- tr->schema_updates++;
}
}
}
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -959,7 +959,7 @@ mvc_getVersion(lng *version, const int *
return msg;
*version = -1;
if (m->session->tr)
- *version = m->session->tr->stime;
+ *version = (lng)m->session->tr->ts;
return MAL_SUCCEED;
}
@@ -1350,13 +1350,9 @@ mvc_insert_delta_values(mvc *m, BAT *col
return createException(SQL,"sql.delta", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
}
/* compute level using global transaction */
- if (gtrans) {
- sql_column *oc = tr_find_column(gtrans, c);
-
- if (oc) {
- for(sql_delta *d = oc->data; d; d = d->next)
+ if (c) {
+ for(sql_delta *d = c->data; d; d = d->next)
level++;
- }
}
if (BUNappend(col7, &level, false) != GDK_SUCCEED) {
return createException(SQL,"sql.delta", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -921,7 +921,6 @@ alter_table(Client cntxt, mvc *sql, char
if (c->storage_type != nc->storage_type) {
if (c->t->access == TABLE_WRITABLE)
throw(SQL,"sql.alter_table", SQLSTATE(40002)
"ALTER TABLE: SET STORAGE for column %s.%s only allowed on READ or INSERT ONLY
tables", c->t->base.name, c->base.name);
- nc->base.rtime = nc->base.wtime =
sql->session->tr->wtime;
mvc_storage(sql, nc, c->storage_type);
}
}
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -851,7 +851,6 @@ mvc_import_table(Client cntxt, BAT ***ba
BAT *b =
store->storage_api.bind_col(m->session->tr, c, RDONLY);
sql_delta *d = c->data;
- c->base.wtime = t->base.wtime =
t->s->base.wtime = m->session->tr->wtime = m->session->tr->wstime;
if ( b == NULL)
sql_error(m, 500, "failed to bind to
delta column");
else {
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -197,14 +197,13 @@ typedef enum commit_action_t {
typedef int sqlid;
typedef struct sql_base {
- int wtime;
- int rtime;
- int stime;
int allocated;
int flags;
int refcnt;
sqlid id;
char *name;
+ ulng ts; /* transaction start timestamp
*/
+ struct sql_base *next; /* older versions */
} sql_base;
#define newFlagSet(x) ((x & TR_NEW) == TR_NEW)
@@ -267,14 +266,13 @@ typedef struct sql_catalog {
typedef struct sql_trans {
char *name;
- int ts; /* transaction timestamp */
- sql_store store; /* keep link into the global store */
+
+ ulng ts; /* transaction start timestamp */
+ ulng tid; /* transaction id */
- int stime; /* start of transaction */
- int wstime; /* first write transaction time stamp */
- int wtime; /* timestamp of latest write performed in
transaction*/
- int schema_number; /* schema timestamp */
- int schema_updates; /* set on schema changes */
+ sql_store store; /* keep link into the global store */
+ list *changes; /* list of changes */
+
int active; /* active transaction */
int status; /* status of the last query */
list *dropped; /* protection against recursive cascade action*/
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
@@ -445,7 +445,7 @@ void
mvc_cancel_session(mvc *m)
{
store_lock(m->store);
- sql_trans_end(m->session, 0);
+ (void)sql_trans_end(m->session, 0);
store_unlock(m->store);
}
@@ -466,7 +466,7 @@ mvc_trans(mvc *m)
/* TODO Change into recreate all */
m->qc = qc_create(m->pa, m->clientid, seqnr);
if (!m->qc) {
- sql_trans_end(m->session, 0);
+ (void)sql_trans_end(m->session, 0);
store_unlock(m->store);
return -1;
}
@@ -481,7 +481,7 @@ mvc_commit(mvc *m, int chain, const char
{
sql_trans *cur, *tr = m->session->tr, *ctr;
int ok = SQL_OK;
- str msg, other;
+ str msg = NULL, other;
char operation[BUFSIZ];
assert(tr);
@@ -527,6 +527,18 @@ mvc_commit(mvc *m, int chain, const char
return msg;
}
+ if (!tr->parent && !name) {
+ store_lock(m->store);
+ if (sql_trans_end(m->session, 1) != SQL_OK) {
+ store_unlock(m->store);
+ /* transaction conflict */
+ msg = createException(SQL, "sql.commit",
SQLSTATE(40000) "%s transaction is aborted because of concurrency conflicts,
will ROLLBACK instead", operation);
+ return msg;
+ }
+ store_unlock(m->store);
+ return msg;
+ }
+
/* first release all intermediate savepoints */
ctr = cur = tr;
tr = tr->parent;
@@ -548,9 +560,9 @@ mvc_commit(mvc *m, int chain, const char
store_lock(m->store);
/* if there is nothing to commit reuse the current transaction */
- if (tr->wtime == 0) {
+ if (tr->changes == NULL) {
if (!chain)
- sql_trans_end(m->session, 1);
+ (void)sql_trans_end(m->session, 1);
m->type = Q_TRANS;
msg = WLCcommit(m->clientid);
store_unlock(m->store);
@@ -564,26 +576,8 @@ mvc_commit(mvc *m, int chain, const char
return msg;
}
- /* validation phase */
- bool valid = sql_trans_validate(tr);
- if (valid) {
- store_unlock(m->store);
- if (sql_save_snapshots(tr) != SQL_OK) {
- GDKfatal("%s transaction commit failed (perhaps your
disk is full?) exiting (kernel error: %s)", operation, GDKerrbuf);
- }
- store_lock(m->store);
- }
- valid = sql_trans_validate(tr);
- if (valid) {
- if ((ok = sql_trans_commit(tr)) != SQL_OK) {
- GDKfatal("%s transaction commit failed (perhaps your
disk is full?) exiting (kernel error: %s)", operation, GDKerrbuf);
- }
- } else {
- store_unlock(m->store);
- msg = createException(SQL, "sql.commit", SQLSTATE(40000) "%s
transaction is aborted because of concurrency conflicts, will ROLLBACK
instead", operation);
- if ((other = mvc_rollback(m, chain, name, false)) !=
MAL_SUCCEED)
- freeException(other);
- return msg;
+ if ((ok = sql_trans_commit(tr)) != SQL_OK) {
+ GDKfatal("%s transaction commit failed (perhaps your disk is
full?) exiting (kernel error: %s)", operation, GDKerrbuf);
}
msg = WLCcommit(m->clientid);
if (msg != MAL_SUCCEED) {
@@ -592,7 +586,7 @@ mvc_commit(mvc *m, int chain, const char
freeException(other);
return msg;
}
- sql_trans_end(m->session, 1);
+ (void)sql_trans_end(m->session, 1);
if (chain)
sql_trans_begin(m->session);
store_unlock(m->store);
@@ -625,7 +619,7 @@ mvc_rollback(mvc *m, int chain, const ch
tr = m->session->tr;
while (!tr->name || strcmp(tr->name, name) != 0) {
/* make sure we do not reuse changed data */
- if (tr->wtime)
+ if (tr->changes)
tr->status = 1;
tr = sql_trans_destroy(tr);
}
@@ -641,9 +635,9 @@ mvc_rollback(mvc *m, int chain, const ch
}
m->session-> tr = tr;
/* make sure we do not reuse changed data */
- if (tr->wtime)
+ if (tr->changes)
tr->status = 1;
- sql_trans_end(m->session, 0);
+ (void)sql_trans_end(m->session, 0);
if (chain)
sql_trans_begin(m->session);
}
@@ -657,7 +651,7 @@ mvc_rollback(mvc *m, int chain, const ch
TRC_INFO(SQL_TRANS,
"Commit%s%s rolled back%s\n",
name ? " " : "", name ? name : "",
- tr->wtime == 0 ? " (no changes)" : "");
+ !tr->changes ? " (no changes)" : "");
return msg;
}
@@ -858,7 +852,7 @@ mvc_destroy(mvc *m)
store_lock(m->store);
if (tr) {
if (m->session->tr->active)
- sql_trans_end(m->session, 0);
+ (void)sql_trans_end(m->session, 0);
while (tr->parent)
tr = sql_trans_destroy(tr);
m->session->tr = NULL;
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -418,7 +418,6 @@ initialize_sql_parts(mvc *sql, sql_table
}
for (node *n = new->h; n; n = n->next) {
sql_part *next = (sql_part*) n->data;
- sql_table *pt = find_sql_table_id(mt->s, next->base.id);
sql_part *err = NULL;
cs_add(&mt->s->parts, next, TR_NEW);
@@ -435,14 +434,8 @@ initialize_sql_parts(mvc *sql, sql_table
SQLSTATE(42000) "Internal error while bootstrapping partitioned tables");
goto finish;
}
- pt->s->base.wtime = pt->base.wtime = tr->wtime =
tr->wstime;
- if (isGlobal(pt))
- tr->schema_updates++;
}
}
- mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime;
- if (isGlobal(mt))
- tr->schema_updates++;
finish:
return res;
}
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -104,7 +104,6 @@ schema_privs(sqlid grantor, sql_schema *
str
sql_grant_global_privs( mvc *sql, char *grantee, int privs, int grant, sqlid
grantor)
{
- sql_trans *tr = sql->session->tr;
bool allowed;
sqlid grantee_id;
@@ -123,14 +122,12 @@ sql_grant_global_privs( mvc *sql, char *
if ((sql_privilege(sql, grantee_id, GLOBAL_OBJID, privs) >= 0))
throw(SQL,"sql.grant_global",SQLSTATE(01007) "GRANT: User/role
'%s' already has this privilege", grantee);
sql_insert_priv(sql, grantee_id, GLOBAL_OBJID, privs, grantor, grant);
- tr->schema_updates++;
return MAL_SUCCEED;
}
char *
sql_grant_table_privs( mvc *sql, char *grantee, int privs, char *sname, char
*tname, char *cname, int grant, sqlid grantor)
{
- sql_trans *tr = sql->session->tr;
sql_table *t = NULL;
sql_column *c = NULL;
bool allowed;
@@ -182,14 +179,12 @@ sql_grant_table_privs( mvc *sql, char *g
} else {
sql_insert_priv(sql, grantee_id, c->base.id, privs, grantor,
grant);
}
- tr->schema_updates++;
return NULL;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list