Changeset: f67368fd291e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f67368fd291e
Modified Files:
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
Branch: Jan2022
Log Message:

revert some changes in strheapvacuum logic


diffs (117 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -4918,15 +4918,34 @@ static str
 do_str_column_vacuum(sql_trans *tr, sql_column *c, char *sname, char *tname, 
char *cname)
 {
        int res;
+       int access = 0;
+       BAT* b = NULL;
+       BAT* bn = NULL;
        sqlstore *store = tr->store;
 
-       if ((res = store->storage_api.swap_bats(tr, c)) != LOG_OK) {
-               if (res == LOG_CONFLICT)
-                       throw(SQL, "do_str_column_vacuum", SQLSTATE(25S01) 
"TRANSACTION CONFLICT in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
-               if (res == LOG_ERR)
-                       throw(SQL, "do_str_column_vacuum", SQLSTATE(HY000) "LOG 
ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
-               throw(SQL, "do_str_column_vacuum", SQLSTATE(HY000) "ERROR in 
storage_api.swap_bats %s.%s.%s", sname, tname, cname);
-       }
+       if ((b = store->storage_api.bind_col(tr, c, access)) == NULL)
+               throw(SQL, "do_str_column_vacuum", SQLSTATE(42S22) 
"storage_api.bind_col failed for %s.%s.%s", sname, tname, cname);
+       // vacuum varsized bats
+       if (ATOMvarsized(c->type.type->localtype)) {
+               // TODO check for num of updates on the BAT against some 
threshold
+               // and decide whether to proceed
+               if ((bn = COLcopy(b, b->ttype, true, PERSISTENT)) == NULL) {
+                       BBPunfix(b->batCacheid);
+                       throw(SQL, "do_str_column_vacuum", SQLSTATE(42S22) 
"COLcopy failed for %s.%s.%s", sname, tname, cname);
+               }
+               if ((res = (int) store->storage_api.swap_bats(tr, c, bn)) != 
LOG_OK) {
+                       BBPreclaim(bn);
+                       BBPunfix(b->batCacheid);
+                       if (res == LOG_CONFLICT)
+                               throw(SQL, "do_str_column_vacuum", 
SQLSTATE(25S01) "TRANSACTION CONFLICT in storage_api.swap_bats %s.%s.%s", 
sname, tname, cname);
+                       if (res == LOG_ERR)
+                               throw(SQL, "do_str_column_vacuum", 
SQLSTATE(HY000) "LOG ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, 
cname);
+                       throw(SQL, "do_str_column_vacuum", SQLSTATE(HY000) 
"ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
+               }
+       }
+       BBPunfix(b->batCacheid);
+       if (bn)
+               BBPunfix(bn->batCacheid);
        return MAL_SUCCEED;
 }
 
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
@@ -4357,46 +4357,32 @@ temp_del_tab(sql_trans *tr, sql_table *t
 }
 
 static int
-swap_bats(sql_trans *tr, sql_column *col)
+swap_bats(sql_trans *tr, sql_column *col, BAT *bn)
 {
-       BAT *b = NULL, *bn = NULL;
        bool update_conflict = false;
-       int in_transaction = 0;
-       sql_delta *d = NULL, *odelta;
-
-       if (!ATOMvarsized(col->type.type->localtype)) /* only varsized types */
-               return LOG_OK;
-
-       if ((in_transaction = segments_in_transaction(tr, col->t)))
+       int in_transaction = segments_in_transaction(tr, col->t);
+
+       if (in_transaction)
                return LOG_CONFLICT;
 
+       sql_delta *d = NULL, *odelta = ATOMIC_PTR_GET(&col->data);
+
        if ((d = bind_col_data(tr, col, &update_conflict)) == NULL)
                return update_conflict ? LOG_CONFLICT : LOG_ERR;
        assert(d && d->cs.ts == tr->tid);
-       odelta = ATOMIC_PTR_GET(&col->data);
        if ((!inTransaction(tr, col->t) && (odelta != d || isTempTable(col->t)) 
&& isGlobal(col->t)) || (!isNew(col->t) && isLocalTemp(col->t)))
                trans_add(tr, &col->base, d, &tc_gc_col, &commit_update_col, 
&log_update_col);
-
-       if (!(b = temp_descriptor(d->cs.bid)))
-               return LOG_ERR;
-       // TODO check for num of updates on the BAT against some threshold
-       // and decide whether to proceed
-       if (!(bn = COLcopy(b, b->ttype, true, b->batRole))) {
-               bat_destroy(b);
-               return LOG_ERR;
-       }
-       bat_destroy(b);
-       temp_destroy(d->cs.bid);
-       d->cs.bid = temp_create(bn);
-       bat_destroy(bn);
+       if (d->cs.bid)
+               temp_destroy(d->cs.bid);
        if (d->cs.uibid)
                temp_destroy(d->cs.uibid);
        if (d->cs.uvbid)
                temp_destroy(d->cs.uvbid);
+       d->cs.bid = temp_create(bn);
        d->cs.uibid = 0;
        d->cs.uvbid = 0;
        d->cs.ucnt = 0;
-       d->cs.cleared = 0;
+       d->cs.cleared = true;
        d->cs.ts = tr->tid;
        d->cs.refcnt = 1;
        return LOG_OK;
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
@@ -176,7 +176,7 @@ typedef void *(*del_dup_fptr) (sql_table
 typedef int (*upgrade_col_fptr) (sql_trans *tr, sql_column *c);
 typedef int (*upgrade_idx_fptr) (sql_trans *tr, sql_idx *i);
 typedef int (*upgrade_del_fptr) (sql_trans *tr, sql_table *t);
-typedef int (*swap_bats_fptr) (sql_trans *tr, sql_column *c);
+typedef int (*swap_bats_fptr) (sql_trans *tr, sql_column *c, BAT *b);
 
 /*
 -- free the storage resources for columns, indices and tables
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to