Changeset: 65dc106455c4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/65dc106455c4
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: default
Log Message:

Do not merge unreachable delta's.


diffs (96 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
@@ -4506,18 +4506,6 @@ commit_update_del( sql_trans *tr, sql_ch
        return ok;
 }
 
-static int
-gc_delta( sql_store Store, sql_change *change, ulng oldest)
-{
-       sqlstore *store = Store;
-       sql_delta *n = change->data;
-       (void)store;
-       (void)oldest;
-
-       destroy_delta(n, true);
-       return 1;
-}
-
 /* only rollback (content version) case for now */
 static int
 gc_col( sqlstore *store, sql_change *change, ulng oldest, bool cleanup)
@@ -4534,26 +4522,20 @@ gc_col( sqlstore *store, sql_change *cha
                return 0;
        sql_delta *d = (sql_delta*)change->data;
        if (d->next) {
-               int ok = LOG_OK;
 
                assert(!cleanup);
                if (d->cs.ts > oldest)
-                       return ok; /* cannot cleanup yet */
-
-               sql_delta *n = d->next;
-               if (n->cs.ucnt && !n->cs.merged) {
-                       lock_column(store, c->base.id); /* lock for concurrent 
updates (appends) */
-                       ok = merge_delta(n);
-                       unlock_column(store, c->base.id);
-               } else if (d && d->cs.ucnt && !d->cs.merged) {
-                       lock_column(store, c->base.id); /* lock for concurrent 
updates (appends) */
-                       ok = merge_delta(d);
-                       unlock_column(store, c->base.id);
-               }
+                       return LOG_OK; /* cannot cleanup yet */
+
+               // d is oldest reachable delta
+               if (d->next) // Unreachable can immediately be destroyed.
+                       destroy_delta(d->next, true);
+
                d->next = NULL;
-               change->cleanup = &gc_delta;
-               change->data = n;
-               return ok;
+               lock_column(store, c->base.id); /* lock for concurrent updates 
(appends) */
+               (void) merge_delta(d);
+               unlock_column(store, c->base.id);
+               return LOG_OK;
        }
        if (cleanup)
                column_destroy(store, c);
@@ -4588,26 +4570,20 @@ gc_idx( sqlstore *store, sql_change *cha
                return 0;
        sql_delta *d = (sql_delta*)change->data;
        if (d->next) {
-               int ok = LOG_OK;
 
                assert(!cleanup);
                if (d->cs.ts > oldest)
-                       return ok; /* cannot cleanup yet */
-
-               sql_delta *n = d->next;
-               if (n->cs.ucnt && !n->cs.merged) {
-                       lock_column(store, i->base.id); /* lock for concurrent 
updates (appends) */
-                       ok = merge_delta(n);
-                       unlock_column(store, i->base.id);
-               } else if (d && d->cs.ucnt && !d->cs.merged) {
-                       lock_column(store, i->base.id); /* lock for concurrent 
updates (appends) */
-                       ok = merge_delta(d);
-                       unlock_column(store, i->base.id);
-               }
+                       return LOG_OK; /* cannot cleanup yet */
+
+               // d is oldest reachable delta
+               if (d->next) // Unreachable can immediately be destroyed.
+                       destroy_delta(d->next, true);
+
                d->next = NULL;
-               change->cleanup = &gc_delta;
-               change->data = n;
-               return ok;
+               lock_column(store, i->base.id); /* lock for concurrent updates 
(appends) */
+               (void) merge_delta(d);
+               unlock_column(store, i->base.id);
+               return LOG_OK;
        }
        if (cleanup)
                idx_destroy(store, i);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to