Changeset: f8838f38dcfd for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f8838f38dcfd Modified Files: sql/storage/bat/bat_storage.c sql/storage/sql_storage.h sql/storage/store.c Branch: default Log Message:
update store ->oldest on end of transactions, use this in the store_oldest lookup (is now lockless) diffs (76 lines): 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 @@ -2992,11 +2992,9 @@ claim_tab(sql_trans *tr, sql_table *t, s if ((s = bind_del_data(tr, t)) == NULL) return BUN_NONE; - store_lock(tr->store); lock_table(tr->store, t->base.id); BUN slot = claim_segment(tr, t, s, cnt); /* find slot */ unlock_table(tr->store, t->base.id); - store_unlock(tr->store); if (slot == BUN_NONE) return BUN_NONE; return (size_t)slot; 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 @@ -463,10 +463,11 @@ typedef struct sqlstore { MT_Lock flush; /* flush lock protecting concurrent writes (not reads, ie use rcu) */ MT_Lock table_locks[NR_TABLE_LOCKS]; /* protecting concurrent writes too table (storage) */ list *active; /* list of running transactions */ + ATOMIC_TYPE nr_active; /* count number of transactions */ ATOMIC_TYPE timestamp; /* timestamp counter */ ATOMIC_TYPE transaction;/* transaction id counter */ - + ulng oldest; int readonly; /* store is readonly */ int singleuser; /* store is for a single user only (==1 enable, ==2 single user session running) */ int first; /* just created the db */ diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -47,17 +47,9 @@ store_transaction_id(sqlstore *store) static ulng store_oldest_given_max(sqlstore *store, ulng commit_ts) { - ulng oldest = commit_ts; - if (store->active && list_length(store->active) == 1) + if (ATOMIC_GET(&store->nr_active) <= 1) return commit_ts; - if (store->active) { - for(node *n = store->active->h; n; n=n->next) { - sql_session *s = n->data; - if (oldest > s->tr->ts) - oldest = s->tr->ts; - } - } - return oldest; + return store->oldest; } ulng @@ -6086,10 +6078,17 @@ sql_trans_end(sql_session *s, int commit s->tr->active = 0; s->auto_commit = s->ac_on_commit; sqlstore *store = s->tr->store; - //if (s->tr->parent == gtrans) { - list_remove_data(store->active, NULL, s); - (void) ATOMIC_DEC(&store->nr_active); - //} + list_remove_data(store->active, NULL, s); + (void) ATOMIC_DEC(&store->nr_active); + if (store->active && store->active->h) { + ulng oldest = TRANSACTION_ID_BASE; + for(node *n = store->active->h; n; n = n->next) { + sql_session *s = n->data; + if (s->tr->ts < oldest) + oldest = s->tr->ts; + } + store->oldest = oldest; + } assert(list_length(store->active) == (int) ATOMIC_GET(&store->nr_active)); return ok; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list