Changeset: b8524835ed5e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b8524835ed5e
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: Jul2021
Log Message:
Delete delta structures for tmp tables and columns when transaction is
destroyed.
This requires a second pair of eyes.
diffs (91 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
@@ -3996,6 +3996,42 @@ bind_cands(sql_trans *tr, sql_table *t,
return segments2cands(s->segs->h, tr, t, start, end);
}
+static void
+temp_del_tab(sql_table *t, ulng tid)
+{
+ for (storage *d = ATOMIC_PTR_GET(&t->data), *p = NULL, *n = NULL; d; d
= n) {
+ n = d->next;
+ if (d->cs.ts == tid) {
+ if (p == NULL) {
+ ATOMIC_PTR_SET(&t->data, n);
+ } else {
+ p->next = n;
+ }
+ d->next = NULL;
+ destroy_storage(d);
+ } else {
+ p = d;
+ }
+ }
+ for (node *nd = t->columns->l->h; nd; nd = nd->next) {
+ sql_column *c = nd->data;
+ for (sql_delta *d = ATOMIC_PTR_GET(&c->data), *p = NULL, *n =
NULL; d; d = n) {
+ n = d->next;
+ if (d->cs.ts == tid) {
+ if (p == NULL) {
+ ATOMIC_PTR_SET(&c->data, n);
+ } else {
+ p->next = n;
+ }
+ d->next = NULL;
+ destroy_delta(d, false);
+ } else {
+ p = d;
+ }
+ }
+ }
+}
+
void
bat_storage_init( store_functions *sf)
{
@@ -4040,6 +4076,8 @@ bat_storage_init( store_functions *sf)
sf->drop_del = &drop_del;
sf->clear_table = &clear_table;
+
+ sf->temp_del_tab = &temp_del_tab;
}
#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
@@ -198,6 +198,8 @@ typedef BUN (*clear_table_fptr) (sql_tra
*/
typedef int (*update_table_fptr) (sql_trans *tr, sql_table *ft, sql_table *tt);
+typedef void (*temp_del_tab_fptr) (sql_table *ft, ulng tid);
+
/* backing struct for this interface */
typedef struct store_functions {
@@ -245,6 +247,8 @@ typedef struct store_functions {
upgrade_col_fptr upgrade_col;
upgrade_idx_fptr upgrade_idx;
upgrade_del_fptr upgrade_del;
+
+ temp_del_tab_fptr temp_del_tab;
} store_functions;
typedef int (*logger_create_fptr) (struct sqlstore *store, int debug, const
char *logdir, int catalog_version);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3553,6 +3553,11 @@ sql_trans_destroy(sql_trans *tr)
sqlstore *store = tr->store;
store_lock(store);
cs_destroy(&tr->localtmps, tr->store);
+ struct os_iter oi;
+ os_iterator(&oi, tr->tmp->tables, tr, NULL);
+ for (sql_table *t = (sql_table *) oi_next(&oi); t; t = (sql_table *)
oi_next(&oi)) {
+ store->storage_api.temp_del_tab(t, tr->tid);
+ }
store_unlock(store);
MT_lock_destroy(&tr->lock);
_DELETE(tr);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list