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

Reply via email to