Changeset: d63c5153b378 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d63c5153b378
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Nov2019
Log Message:

delay destruction of delta and dbat structures. Its now handled within the
manager loop (outside of the bs_lock).


diffs (145 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
@@ -15,6 +15,10 @@
 
 #define SNAPSHOT_MINSIZE ((BUN) 1024*128)
 
+static MT_Lock destroy_lock = MT_LOCK_INITIALIZER("destroy_lock");
+sql_dbat *tobe_destroyed_dbat = NULL;
+sql_delta *tobe_destroyed_delta = NULL;
+
 static sql_trans *
 oldest_active_transaction(void)
 {
@@ -1880,6 +1884,56 @@ destroy_dbat(sql_trans *tr, sql_dbat *ba
 }
 
 static int
+cleanup(void)
+{
+       int ok = LOG_OK;
+
+       MT_lock_set(&destroy_lock);
+       if (tobe_destroyed_delta) {
+               ok = destroy_bat(tobe_destroyed_delta);
+               tobe_destroyed_delta = NULL;
+       }
+       if (ok == LOG_OK && tobe_destroyed_dbat) {
+               ok = destroy_dbat(NULL, tobe_destroyed_dbat);
+               tobe_destroyed_dbat = NULL;
+       }
+       MT_lock_unset(&destroy_lock);
+       return ok;
+}
+
+static int
+delayed_destroy_bat(sql_delta *b)
+{
+       sql_delta *n = b;
+
+       if (!n)
+               return LOG_OK;
+       while(n->next) 
+               n = n->next;
+       MT_lock_set(&destroy_lock);
+       n->next = tobe_destroyed_delta;
+       tobe_destroyed_delta = b;
+       MT_lock_unset(&destroy_lock);
+       return LOG_OK;
+}
+
+static int
+delayed_destroy_dbat(sql_dbat *b)
+{
+       sql_dbat *n = b;
+
+       if (!n)
+               return LOG_OK;
+       while(n->next) 
+               n = n->next;
+       MT_lock_set(&destroy_lock);
+       n->next = tobe_destroyed_dbat;
+       tobe_destroyed_dbat = b;
+       MT_lock_unset(&destroy_lock);
+       return LOG_OK;
+}
+
+static int
 destroy_del(sql_trans *tr, sql_table *t)
 {
        int ok = LOG_OK;
@@ -2663,7 +2717,7 @@ update_table(sql_trans *tr, sql_table *f
                        ot = tr_find_table(oldest, tt);
                        if (b && ot && b->wtime < ot->base.stime) {
                                /* anything older can go */
-                               destroy_dbat(tr, b->next);
+                               delayed_destroy_dbat(b->next);
                                b->next = NULL;
                        }
                } else if (tt->data && ft->base.allocated) {
@@ -2714,7 +2768,7 @@ update_table(sql_trans *tr, sql_table *f
                                        oldc = o->data;
                                if (oldc && b && oldc->base.id == cc->base.id 
&& b->wtime < oldc->base.stime) {
                                        /* anything older can go */
-                                       destroy_bat(b->next);
+                                       delayed_destroy_bat(b->next);
                                        b->next = NULL;
                                }
                        } else if (oc->data && cc->base.allocated) {
@@ -2799,7 +2853,7 @@ update_table(sql_trans *tr, sql_table *f
                                                oldi = o->data;
                                        if (oldi && b && oldi->base.id == 
ci->base.id && b->wtime < oldi->base.stime) {
                                                /* anything older can go */
-                                               destroy_bat(b->next);
+                                               delayed_destroy_bat(b->next);
                                                b->next = NULL;
                                        }
                                } else if (oi->data && ci->base.allocated) {
@@ -3107,4 +3161,6 @@ bat_storage_init( store_functions *sf)
        sf->snapshot_table = (update_table_fptr)&snapshot_table;
        sf->gtrans_update = (gtrans_update_fptr)&gtr_update;
        sf->gtrans_minmax = (gtrans_update_fptr)&gtr_minmax;
+
+       sf->cleanup = (cleanup_fptr)&cleanup;
 }
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
@@ -211,6 +211,7 @@ typedef int (*idx_upd_fptr) (sql_trans *
 */
 typedef int (*del_fptr) (sql_trans *tr, sql_table *c, void *rows);
 typedef int (*snapshot_fptr) ( sql_table *t ); 
+typedef int (*cleanup_fptr) (); 
 
 /* backing struct for this interface */
 typedef struct store_functions {
@@ -288,6 +289,8 @@ typedef struct store_functions {
        idx_upd_fptr idx_upd;
 
        del_fptr del;
+
+       cleanup_fptr cleanup;
 } store_functions;
 
 sqlstore_export store_functions store_funcs;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2290,6 +2290,8 @@ idle_manager(void)
                        if (GDKexiting())
                                return;
                }
+               /* cleanup any collected intermediate storage */
+               store_funcs.cleanup();
                MT_lock_set(&bs_lock);
                if (ATOMIC_GET(&store_nr_active) || GDKexiting() || 
!store_needs_vacuum(gtrans)) {
                        MT_lock_unset(&bs_lock);
@@ -4384,7 +4386,6 @@ sql_trans_commit(sql_trans *tr)
        return (ok==LOG_OK)?SQL_OK:SQL_ERR;
 }
 
-
 static int
 sql_trans_drop_all_dependencies(sql_trans *tr, sql_schema *s, sqlid id, sht 
type)
 {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to