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