Changeset: 8d38ce3d6879 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8d38ce3d6879
Modified Files:
gdk/gdk_bbp.c
sql/common/sql_types.c
sql/include/sql_catalog.h
sql/server/rel_select.c
sql/storage/bat/bat_storage.c
sql/storage/objectset.c
sql/storage/store.c
Branch: default
Log Message:
Merge with Dec2023 branch.
diffs (truncated from 844 to 300 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2940,7 +2940,7 @@ BBPclear(bat i)
}
void
-BBPrelinquish(void)
+BBPrelinquishbats(void)
{
struct freebats *t = MT_thread_getfreebats();
if (t == NULL || t->nfreebats == 0)
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -769,7 +769,7 @@ thread_starter(void *arg)
(*self->thread_funcs[i].destroy)(self->thread_funcs[i].data);
}
free(self->thread_funcs);
- BBPrelinquish();
+ BBPrelinquishbats();
ATOMIC_SET(&self->exited, 1);
TRC_DEBUG(THRD, "Exit thread \"%s\"\n", self->threadname);
return 0; /* NULL for pthreads, 0 for Windows */
diff --git a/gdk/gdk_system_private.h b/gdk/gdk_system_private.h
--- a/gdk/gdk_system_private.h
+++ b/gdk/gdk_system_private.h
@@ -45,5 +45,5 @@ struct freebats {
};
struct freebats *MT_thread_getfreebats(void)
__attribute__((__visibility__("hidden")));
-void BBPrelinquish(void)
+void BBPrelinquishbats(void)
__attribute__((__visibility__("hidden")));
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
@@ -210,9 +210,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
@@ -1306,7 +1306,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)) {
@@ -1402,7 +1402,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);
@@ -120,11 +120,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) {
@@ -134,6 +147,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;
@@ -549,7 +564,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;
}
@@ -570,7 +585,7 @@ idx_dup(sql_idx *i)
static storage*
storage_dup(storage *d)
{
- d->cs.refcnt++;
+ ATOMIC_INC(&d->cs.refcnt);
return d;
}
@@ -1938,7 +1953,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);
@@ -1950,6 +1965,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);
}
@@ -1974,7 +1990,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;
@@ -2031,7 +2047,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)
@@ -2060,7 +2076,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;
@@ -2099,7 +2115,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);
@@ -2424,7 +2440,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;
}
@@ -2543,7 +2559,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;
}
@@ -2565,7 +2581,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);
@@ -2576,6 +2592,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);
}
@@ -2627,7 +2644,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;
@@ -3113,7 +3130,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)
@@ -3187,7 +3204,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;
}
@@ -3248,7 +3265,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)
@@ -3287,7 +3304,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;
}
@@ -3426,7 +3443,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;
}
@@ -3449,7 +3466,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;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]