Changeset: 0be1cf0829be for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0be1cf0829be
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: default
Log Message:

some more cleanup

added locks around (slot) claim's


diffs (150 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
@@ -14,10 +14,6 @@
 #include "gdk_atoms.h"
 #include "matomic.h"
 
-//static MT_Lock segs_lock = MT_LOCK_INITIALIZER(segs_lock);
-#define NR_TABLE_LOCKS 64
-//static MT_Lock table_locks[NR_TABLE_LOCKS]; /* set of locks to protect table 
changes (claim) */
-
 #define inTransaction(tr,t) (isLocalTemp(t) || 
os_obj_intransaction(t->s->tables, tr, &t->base))
 
 static int log_update_col( sql_trans *tr, sql_change *c);
@@ -53,23 +49,17 @@ static int tr_merge_delta( sql_trans *tr
 #define SEG_VALID_4_CLAIM(seg,tr) SEG_VALID_4_WRITE(seg,tr,false)
 #define SEG_VALID_4_DELETE(seg,tr) SEG_VALID_4_WRITE(seg,tr,true)
 
-#if 0
 static void
 lock_table(sqlstore *store, sqlid id)
 {
-       (void)store;
-       (void)id;
-       //MT_lock_set(&table_locks[id&(NR_TABLE_LOCKS-1)]);
+       MT_lock_set(&store->table_locks[id&(NR_TABLE_LOCKS-1)]);
 }
 
 static void
 unlock_table(sqlstore *store, sqlid id)
 {
-       (void)store;
-       (void)id;
-       //MT_lock_unset(&table_locks[id&(NR_TABLE_LOCKS-1)]);
+       MT_lock_unset(&store->table_locks[id&(NR_TABLE_LOCKS-1)]);
 }
-#endif
 
 /* used for communication between {append,update}_prepare and 
{append,update}_execute */
 struct prep_exec_cookie {
@@ -1252,9 +1242,7 @@ dup_storage( sql_trans *tr, storage *oba
        if (temp) {
                bat->segs = new_segments(tr, 0);
        } else {
-               //MT_lock_set(&segs_lock);
                bat->segs = dup_segments(obat->segs);
-               //MT_lock_unset(&segs_lock);
        }
        return dup_cs(tr, &obat->cs, &bat->cs, TYPE_msk, temp);
 }
@@ -1280,19 +1268,18 @@ static int
 append_col_execute(void *incoming_cookie, size_t offset, void *incoming_data, 
bool is_bat)
 {
        struct prep_exec_cookie *cookie = incoming_cookie;
-       int ok;
-
-       //lock_table(c->t->base.id);
+       int ok = LOG_OK;
+
+       lock_table(cookie->tr->store, cookie->table->base.id);
        if (is_bat) {
                BAT *bat = incoming_data;
 
-               if (!BATcount(bat))
-                       return LOG_OK;
-               ok = delta_append_bat(cookie->delta, offset, bat);
+               if (BATcount(bat))
+                       ok = delta_append_bat(cookie->delta, offset, bat);
        } else {
                ok = delta_append_val(cookie->delta, offset, incoming_data);
        }
-       //unlock_table(c->t->base.id);
+       unlock_table(cookie->tr->store, cookie->table->base.id);
        return ok;
 }
 
@@ -3107,23 +3094,16 @@ claim_segment(sql_trans *tr, sql_table *
 static size_t
 claim_tab(sql_trans *tr, sql_table *t, size_t cnt)
 {
-       storage *s;/*, *ps = ATOMIC_PTR_GET(&t->data);*/
-       BUN slot = 0;
-
-       /* we have a single segment structure for each persistent table */
-       /* for temporary tables each has its own */
-       if ((s = bind_del_data(tr, t)) == NULL) /* TODO fix bind_del_data for 
this */
+       storage *s;
+
+       /* we have a single segment structure for each persistent table
+        * for temporary tables each has its own */
+       if ((s = bind_del_data(tr, t)) == NULL)
                return BUN_NONE;
 
-       /* use (resizeable) array of locks like BBP */
-       //lock_table(t->base.id);
-       /* make lockless ? */
-       /*
-       if (isTempTable(t))
-               ps = s;
-               */
-       /* find slot */
-       slot = claim_segment(tr, t, s, cnt);
+       lock_table(tr->store, t->base.id);
+       BUN slot = claim_segment(tr, t, s, cnt); /* find slot */
+       unlock_table(tr->store, t->base.id);
        if (slot == BUN_NONE)
                return BUN_NONE;
        return (size_t)slot;
@@ -3248,10 +3228,6 @@ bat_storage_init( store_functions *sf)
        sf->clear_table = &clear_table;
 
        sf->cleanup = &cleanup;
-       /*
-       for(int i=0;i<NR_TABLE_LOCKS;i++)
-               MT_lock_init(&table_locks[i], "table_lock");
-               */
 }
 
 #if 0
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
@@ -441,6 +441,7 @@ extern sql_key *sql_trans_copy_key(sql_t
 extern sql_idx *sql_trans_copy_idx(sql_trans *tr, sql_table *t, sql_idx *i);
 extern sql_trigger *sql_trans_copy_trigger(sql_trans *tr, sql_table *t, 
sql_trigger *tri);
 
+#define NR_TABLE_LOCKS 64
 #define TRANSACTION_ID_BASE    (1ULL<<63)
 
 typedef struct sqlstore {
@@ -449,6 +450,7 @@ typedef struct sqlstore {
        sql_schema *tmp;                /* keep pointer to default (empty) tmp 
schema */
        MT_Lock lock;                   /* lock protecting concurrent writes 
(not reads, ie use rcu) */
        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 */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1895,6 +1895,8 @@ store_init(sql_allocator *pa, int debug,
        (void)store_timestamp(store); /* increment once */
        MT_lock_init(&store->lock, "sqlstore_lock");
        MT_lock_init(&store->flush, "sqlstore_flush");
+       for(int i = 0; i<NR_TABLE_LOCKS; i++)
+               MT_lock_init(&store->table_locks[i], "sqlstore_table");
 
        MT_lock_set(&store->lock);
        MT_lock_set(&store->flush);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to