Changeset: f6f475325902 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f6f475325902
Modified Files:
sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:
on errors still add changes too the list, then they get properly cleaned
diffs (97 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
@@ -1374,8 +1374,6 @@ storage_delete_bat(sql_trans *tr, sql_ta
}
if (i != oi)
bat_destroy(i);
- if (ok != LOG_OK)
- return ok;
if ((!inTransaction(tr, t) && !in_transaction && isGlobal(t)) ||
(!isNew(t) && isLocalTemp(t)))
trans_add(tr, &t->base, s, &tc_gc_del, &commit_update_del,
isLocalTemp(t)?NULL:&log_update_del);
return ok;
@@ -2358,27 +2356,24 @@ clear_storage(sql_trans *tr, storage *s)
static BUN
clear_del(sql_trans *tr, sql_table *t)
{
- int in_transaction = segments_in_transaction(tr, t), ok;
+ int in_transaction = segments_in_transaction(tr, t), ok = LOG_OK;
storage *bat;
if ((bat = bind_del_data(tr, t)) == NULL)
return BUN_NONE;
if (!isTempTable(t)) {
lock_table(tr->store, t->base.id);
- if ((ok = delete_range(tr, bat, 0, bat->segs->t->end)) !=
LOG_OK) {
- unlock_table(tr->store, t->base.id);
- if (ok == LOG_ERR)
- return BUN_NONE;
- if (ok == LOG_CONFLICT)
- return BUN_NONE - 1;
- assert(0);
- }
+ ok = delete_range(tr, bat, 0, bat->segs->t->end);
unlock_table(tr->store, t->base.id);
}
if ((!inTransaction(tr, t) && !in_transaction && isGlobal(t)) ||
(!isNew(t) && isLocalTemp(t)))
trans_add(tr, &t->base, bat, &tc_gc_del, &commit_update_del,
isLocalTemp(t)?NULL:&log_update_del);
- if (isTempTable(t))
+ if (ok == LOG_OK && isTempTable(t))
return clear_storage(tr, bat);
+ if (ok == LOG_ERR)
+ return BUN_NONE;
+ if (ok == LOG_CONFLICT)
+ return BUN_NONE - 1;
return LOG_OK;
}
@@ -2969,7 +2964,7 @@ tc_gc_del( sql_store Store, sql_change *
static BUN
claim_segment(sql_trans *tr, sql_table *t, storage *s, size_t cnt)
{
- int in_transaction = segments_in_transaction(tr, t);
+ int in_transaction = segments_in_transaction(tr, t), ok = LOG_OK;
assert(s->segs);
ulng oldest = store_oldest(tr->store);
BUN slot = 0;
@@ -2978,7 +2973,7 @@ claim_segment(sql_trans *tr, sql_table *
/* naive vacuum approach, iterator through segments, check for large
enough deleted segments
* or create new segment at the end */
/* when claiming an segment use atomic CAS */
- for (segment *seg = s->segs->h, *p = NULL; seg; p = seg, seg =
seg->next) {
+ for (segment *seg = s->segs->h, *p = NULL; seg && ok == LOG_OK; p =
seg, seg = seg->next) {
if (seg->deleted && seg->ts < oldest && (seg->end-seg->start)
>= cnt) { /* re-use old deleted or rolledback append */
if ((seg->end - seg->start) >= cnt) {
@@ -2992,9 +2987,8 @@ claim_segment(sql_trans *tr, sql_table *
break;
}
/* we claimed part of the old segment, the
split off part needs too stay deleted */
- if ((seg=split_segment(s->segs, seg, p, tr,
seg->start, cnt, false)) == NULL) {
- return BUN_NONE;
- }
+ if ((seg=split_segment(s->segs, seg, p, tr,
seg->start, cnt, false)) == NULL)
+ ok = LOG_ERR;
}
seg->ts = tr->tid;
seg->deleted = false;
@@ -3003,7 +2997,7 @@ claim_segment(sql_trans *tr, sql_table *
break;
}
}
- if (!reused) {
+ if (ok == LOG_OK && !reused) {
if (s->segs->t && s->segs->t->ts == tr->tid &&
!s->segs->t->deleted) {
slot = s->segs->t->end;
s->segs->t->end += cnt;
@@ -3021,7 +3015,9 @@ claim_segment(sql_trans *tr, sql_table *
if (!isLocalTemp(t))
tr->logchanges += (int) cnt;
}
- return slot;
+ if (ok == LOG_OK)
+ return slot;
+ return BUN_NONE;
}
/*
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list