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