Changeset: b37bb160cc9a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b37bb160cc9a
Modified Files:
sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:
small fix of the transaction isolation, ie make sure we still read segments
which are deleted by some active transaction, but not commited yet.
diffs (74 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
@@ -140,31 +140,31 @@ split_segment(segments *segs, segment *o
if (start == o->start) {
n->start = o->start;
n->end = n->start + cnt;
- o->start = n->end;
n->next = o;
if (segs->h == o)
segs->h = n;
if (p)
p->next = n;
+ o->start = n->end;
return n;
} else if (start+cnt == o->end) {
n->start = o->end - cnt;
n->end = o->end;
- o->end = n->start;
n->next = o->next;
o->next = n;
if (segs->t == o)
segs->t = n;
+ o->end = n->start;
return n;
}
/* 3 way split */
n->start = start;
n->end = o->end;
- o->end = n->start;
n->next = o->next;
o->next = n;
if (segs->t == o)
segs->t = n;
+ o->end = n->start;
segment *oo = o;
o = n;
@@ -177,11 +177,11 @@ split_segment(segments *segs, segment *o
n->deleted = oo->deleted;
n->start = start+cnt;
n->end = o->end;
- o->end = n->start;
n->next = o->next;
o->next = n;
if (segs->t == o)
segs->t = n;
+ o->end = n->start;
return o;
}
@@ -517,7 +517,7 @@ segs_end( segments *segs, sql_trans *tr)
segment *s = segs->h, *l = NULL;
for(;s; s = s->next) {
- if (VALID_4_READ(s->ts, tr))
+ if (VALID_4_READ(s->ts, tr) || (s->deleted && s->oldts && s->ts
> TRANSACTION_ID_BASE && s->oldts < tr->ts))
l = s;
}
if (!l)
@@ -2301,8 +2301,12 @@ clear_del(sql_trans *tr, sql_table *t)
if ((bat = bind_del_data(tr, t)) == NULL)
return BUN_NONE;
if (!isTempTable(t)) {
- if (delete_range(tr, bat, 0, bat->segs->t->end) == LOG_ERR)
+ lock_table(tr->store, t->base.id);
+ if (delete_range(tr, bat, 0, bat->segs->t->end) == LOG_ERR) {
+ unlock_table(tr->store, t->base.id);
return LOG_ERR;
+ }
+ 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);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list