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

Reply via email to