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)>r_update; sf->gtrans_minmax = (gtrans_update_fptr)>r_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