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