Changeset: 399842235c7c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/399842235c7c
Modified Files:
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/server/rel_select.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/objectset.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/transactions/Tests/All
Branch: Dec2023
Log Message:

added refcounting during change creation/destruction in the bat_storage part.
Made all refcounts atomics


diffs (truncated from 810 to 300 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -164,9 +164,9 @@ base_init(sql_allocator *sa, sql_base * 
        *b = (sql_base) {
                .id = id,
                .new = isnew,
-               .refcnt = 1,
                .name = (name) ? SA_STRDUP(sa, name) : NULL,
        };
+       ATOMIC_INIT(&b->refcnt, 1);
 }
 
 void
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
@@ -195,8 +195,8 @@ typedef void *sql_store;
 typedef struct sql_base {
        unsigned int
                new:1,
-               deleted:1,
-               refcnt:30;
+               deleted:1;
+       ATOMIC_TYPE refcnt;
        sqlid id;
        char *name;
 } sql_base;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1251,7 +1251,7 @@ rel_column_ref(sql_query *query, sql_rel
                        sql_rel *gp = inner;
                        while (gp && is_select(gp->op))
                                gp = gp->l;
-                       if (gp && gp->l && !(exp = rel_bind_column(sql, gp->l, 
name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS)
+                       if (gp && !is_basetable(gp->op) && gp->l && !(exp = 
rel_bind_column(sql, gp->l, name, f, 0)) && sql->session->status == 
-ERR_AMBIGUOUS)
                                return NULL;
                }
                if (!exp && query && query_has_outer(query)) {
@@ -1347,7 +1347,7 @@ rel_column_ref(sql_query *query, sql_rel
                        sql_rel *gp = inner;
                        while (gp && is_select(gp->op))
                                gp = gp->l;
-                       if (gp && gp->l && !(exp = rel_bind_column3(sql, gp->l, 
sname, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
+                       if (gp && !is_basetable(gp->op) && gp->l && !(exp = 
rel_bind_column3(sql, gp->l, sname, tname, cname, f)) && sql->session->status 
== -ERR_AMBIGUOUS)
                                return NULL;
                }
                if (!exp && query && query_has_outer(query)) {
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
@@ -36,8 +36,8 @@ static int commit_create_del(sql_trans *
 static int tc_gc_col( sql_store Store, sql_change *c, ulng oldest);
 static int tc_gc_idx( sql_store Store, sql_change *c, ulng oldest);
 static int tc_gc_del( sql_store Store, sql_change *c, ulng oldest);
-static int tc_gc_drop_col( sql_store Store, sql_change *c, ulng oldest);
-static int tc_gc_drop_idx( sql_store Store, sql_change *c, ulng oldest);
+static int tc_gc_upd_col( sql_store Store, sql_change *c, ulng oldest);
+static int tc_gc_upd_idx( sql_store Store, sql_change *c, ulng oldest);
 
 static void merge_delta( sql_delta *obat);
 
@@ -123,11 +123,24 @@ unlock_column(sqlstore *store, sqlid id)
        MT_lock_unset(&store->column_locks[id&(NR_COLUMN_LOCKS-1)]);
 }
 
+static void
+trans_add_obj(sql_trans *tr, sql_base *b, void *data, tc_cleanup_fptr cleanup, 
tc_commit_fptr commit, tc_log_fptr log)
+{
+       assert(cleanup);
+       trans_add(tr, dup_base(b), data, cleanup, commit, log);
+}
+
+static void
+trans_add_table(sql_trans *tr, sql_base *b, sql_table *t, void *data, 
tc_cleanup_fptr cleanup, tc_commit_fptr commit, tc_log_fptr log)
+{
+       assert(cleanup);
+       dup_base(&t->base);
+       trans_add(tr, b, data, cleanup, commit, log);
+}
 
 static int
 tc_gc_seg( sql_store Store, sql_change *change, ulng oldest)
 {
-       (void)Store;
        segment *s = change->data;
 
        if (s->ts <= oldest) {
@@ -137,6 +150,8 @@ tc_gc_seg( sql_store Store, sql_change *
                        _DELETE(s);
                        s = n;
                }
+               sqlstore *store = Store;
+               table_destroy(store, (sql_table*)change->obj);
                return 1;
        }
        return LOG_OK;
@@ -552,7 +567,7 @@ tab_timestamp_storage( sql_trans *tr, sq
 static sql_delta*
 delta_dup(sql_delta *d)
 {
-       d->cs.refcnt++;
+       ATOMIC_INC(&d->cs.refcnt);
        return d;
 }
 
@@ -573,7 +588,7 @@ idx_dup(sql_idx *i)
 static storage*
 storage_dup(storage *d)
 {
-       d->cs.refcnt++;
+       ATOMIC_INC(&d->cs.refcnt);
        return d;
 }
 
@@ -1941,7 +1956,7 @@ dup_cs(sql_trans *tr, column_storage *oc
 static void
 destroy_delta(sql_delta *b, bool recursive)
 {
-       if (--b->cs.refcnt > 0)
+       if (ATOMIC_DEC(&b->cs.refcnt) > 0)
                return;
        if (recursive && b->next)
                destroy_delta(b->next, true);
@@ -1953,6 +1968,7 @@ destroy_delta(sql_delta *b, bool recursi
                temp_destroy(b->cs.bid);
        if (b->cs.ebid)
                temp_destroy(b->cs.ebid);
+       ATOMIC_DESTROY(&b->cs.refcnt);
        b->cs.bid = b->cs.ebid = b->cs.uibid = b->cs.uvbid = 0;
        _DELETE(b);
 }
@@ -1977,7 +1993,7 @@ bind_col_data(sql_trans *tr, sql_column 
        sql_delta* bat = ZNEW(sql_delta);
        if (!bat)
                return NULL;
-       bat->cs.refcnt = 1;
+       ATOMIC_INIT(&bat->cs.refcnt, 1);
        if (dup_cs(tr, &obat->cs, &bat->cs, c->type.type->localtype, 0) != 
LOG_OK) {
                destroy_delta(bat, false);
                return NULL;
@@ -2034,7 +2050,7 @@ update_col(sql_trans *tr, sql_column *c,
        assert(delta && delta->cs.ts == tr->tid);
        assert(c->t->persistence != SQL_DECLARED_TABLE);
        if (odelta != delta)
-               trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col, 
NOT_TO_BE_LOGGED(c->t) ? NULL : &log_update_col);
+               trans_add_table(tr, &c->base, c->t, delta, &tc_gc_upd_col, 
&commit_update_col, NOT_TO_BE_LOGGED(c->t) ? NULL : &log_update_col);
 
        odelta = delta;
        if ((res = update_col_execute(tr, &delta, c->t, isNew(c), tids, upd, 
tpe == TYPE_bat)) != LOG_OK)
@@ -2063,7 +2079,7 @@ bind_idx_data(sql_trans *tr, sql_idx *i,
        sql_delta* bat = ZNEW(sql_delta);
        if (!bat)
                return NULL;
-       bat->cs.refcnt = 1;
+       ATOMIC_INIT(&bat->cs.refcnt, 1);
        if (dup_cs(tr, &obat->cs, &bat->cs, 
(oid_index(i->type))?TYPE_oid:TYPE_lng, 0) != LOG_OK) {
                destroy_delta(bat, false);
                return NULL;
@@ -2102,7 +2118,7 @@ update_idx(sql_trans *tr, sql_idx * i, v
 
        assert(delta && delta->cs.ts == tr->tid);
        if (odelta != delta)
-               trans_add(tr, &i->base, delta, &tc_gc_idx, &commit_update_idx, 
NOT_TO_BE_LOGGED(i->t) ? NULL : &log_update_idx);
+               trans_add_table(tr, &i->base, i->t, delta, &tc_gc_upd_idx, 
&commit_update_idx, NOT_TO_BE_LOGGED(i->t) ? NULL : &log_update_idx);
 
        odelta = delta;
        res = update_col_execute(tr, &delta, i->t, isNew(i), tids, upd, tpe == 
TYPE_bat);
@@ -2421,7 +2437,7 @@ storage_delete_val(sql_trans *tr, sql_ta
        }
        unlock_table(tr->store, t->base.id);
        if (!in_transaction)
-               trans_add(tr, &t->base, s, &tc_gc_del, &commit_update_del, 
NOT_TO_BE_LOGGED(t) ? NULL : &log_update_del);
+               trans_add_obj(tr, &t->base, s, &tc_gc_del, &commit_update_del, 
NOT_TO_BE_LOGGED(t) ? NULL : &log_update_del);
        return LOG_OK;
 }
 
@@ -2540,7 +2556,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
                bat_destroy(i);
        // assert
        if (!in_transaction)
-               trans_add(tr, &t->base, s, &tc_gc_del, &commit_update_del, 
NOT_TO_BE_LOGGED(t) ? NULL : &log_update_del);
+               trans_add_obj(tr, &t->base, s, &tc_gc_del, &commit_update_del, 
NOT_TO_BE_LOGGED(t) ? NULL : &log_update_del);
        return ok;
 }
 
@@ -2562,7 +2578,7 @@ destroy_segments(segments *s)
 static void
 destroy_storage(storage *bat)
 {
-       if (--bat->cs.refcnt > 0)
+       if (ATOMIC_DEC(&bat->cs.refcnt) > 0)
                return;
        if (bat->next)
                destroy_storage(bat->next);
@@ -2573,6 +2589,7 @@ destroy_storage(storage *bat)
                temp_destroy(bat->cs.uvbid);
        if (bat->cs.bid)
                temp_destroy(bat->cs.bid);
+       ATOMIC_DESTROY(&bat->cs.refcnt);
        bat->cs.bid = bat->cs.uibid = bat->cs.uvbid = 0;
        _DELETE(bat);
 }
@@ -2624,7 +2641,7 @@ bind_del_data(sql_trans *tr, sql_table *
        storage *bat = ZNEW(storage);
        if (!bat)
                return NULL;
-       bat->cs.refcnt = 1;
+       ATOMIC_INIT(&bat->cs.refcnt, 1);
        if (dup_storage(tr, obat, bat) != LOG_OK) {
                destroy_storage(bat);
                return NULL;
@@ -3110,7 +3127,7 @@ create_col(sql_trans *tr, sql_column *c)
                if (!bat)
                        return LOG_ERR;
                ATOMIC_PTR_SET(&c->data, bat);
-               bat->cs.refcnt = 1;
+               ATOMIC_INIT(&bat->cs.refcnt, 1);
        }
 
        if (new)
@@ -3184,7 +3201,7 @@ create_col(sql_trans *tr, sql_column *c)
                bat->cs.ucnt = 0;
 
                if (new && !isTempTable(c->t) && !isNew(c->t) /* alter */)
-                       trans_add(tr, &c->base, bat, &tc_gc_col, 
&commit_create_col, &log_create_col);
+                       trans_add_obj(tr, &c->base, bat, &tc_gc_col, 
&commit_create_col, &log_create_col);
        }
        return ok;
 }
@@ -3245,7 +3262,7 @@ create_idx(sql_trans *tr, sql_idx *ni)
                if (!bat)
                        return LOG_ERR;
                ATOMIC_PTR_SET(&ni->data, bat);
-               bat->cs.refcnt = 1;
+               ATOMIC_INIT(&bat->cs.refcnt, 1);
        }
 
        if (new)
@@ -3284,7 +3301,7 @@ create_idx(sql_trans *tr, sql_idx *ni)
                }
                bat->cs.ucnt = 0;
                if (new && !isTempTable(ni->t) && !isNew(ni->t) /* alter */)
-                       trans_add(tr, &ni->base, bat, &tc_gc_idx, 
&commit_create_idx, &log_create_idx);
+                       trans_add_obj(tr, &ni->base, bat, &tc_gc_idx, 
&commit_create_idx, &log_create_idx);
        }
        return ok;
 }
@@ -3423,7 +3440,7 @@ create_del(sql_trans *tr, sql_table *t)
                if(!bat)
                        return LOG_ERR;
                ATOMIC_PTR_SET(&t->data, bat);
-               bat->cs.refcnt = 1;
+               ATOMIC_INIT(&bat->cs.refcnt, 1);
                bat->cs.ts = tr->tid;
        }
 
@@ -3446,7 +3463,7 @@ create_del(sql_trans *tr, sql_table *t)
                        return LOG_ERR;
                }
                if (new)
-                       trans_add(tr, &t->base, bat, &tc_gc_del, 
&commit_create_del, isTempTable(t) ? NULL : &log_create_del);
+                       trans_add_obj(tr, &t->base, bat, &tc_gc_del, 
&commit_create_del, isTempTable(t) ? NULL : &log_create_del);
        }
        return ok;
 }
@@ -3717,7 +3734,7 @@ drop_del(sql_trans *tr, sql_table *t)
 
        if (!isNew(t)) {
                storage *bat = ATOMIC_PTR_GET(&t->data);
-               trans_add(tr, &t->base, bat, &tc_gc_del, &commit_destroy_del, 
NOT_TO_BE_LOGGED(t) ? NULL : &log_destroy_del);
+               trans_add_obj(tr, &t->base, bat, &tc_gc_del, 
&commit_destroy_del, NOT_TO_BE_LOGGED(t) ? NULL : &log_destroy_del);
        }
        return ok;
 }
@@ -3727,7 +3744,7 @@ drop_col(sql_trans *tr, sql_column *c)
 {
        assert(!isNew(c));
        sql_delta *d = ATOMIC_PTR_GET(&c->data);
-       trans_add(tr, &c->base, d, &tc_gc_drop_col, &commit_destroy_del, 
NOT_TO_BE_LOGGED(c->t) ? NULL : &log_destroy_col);
+       trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del, 
NOT_TO_BE_LOGGED(c->t) ? NULL : &log_destroy_col);
        return LOG_OK;
 }
 
@@ -3736,7 +3753,7 @@ drop_idx(sql_trans *tr, sql_idx *i)
 {
        assert(!isNew(i));
        sql_delta *d = ATOMIC_PTR_GET(&i->data);
-       trans_add(tr, &i->base, d, &tc_gc_drop_idx, &commit_destroy_del, 
NOT_TO_BE_LOGGED(i->t) ? NULL : &log_destroy_idx);
+       trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del, 
NOT_TO_BE_LOGGED(i->t) ? NULL : &log_destroy_idx);
        return LOG_OK;
 }
 
@@ -3804,7 +3821,7 @@ clear_col(sql_trans *tr, sql_column *c, 
                return update_conflict ? BUN_NONE - 1 : BUN_NONE;
        assert(c->t->persistence != SQL_DECLARED_TABLE);
        if (odelta != delta)
-               trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col, 
NOT_TO_BE_LOGGED(c->t) ? NULL : &log_update_col);
+               trans_add_table(tr, &c->base, c->t, delta, &tc_gc_upd_col, 
&commit_update_col, NOT_TO_BE_LOGGED(c->t) ? NULL : &log_update_col);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to