Changeset: 27a4f366a14c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/27a4f366a14c
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:

v1 of deletes vs update conflicts


diffs (153 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
@@ -1533,6 +1533,25 @@ append_idx(sql_trans *tr, sql_idx * i, v
 }
 
 static int
+deletes_conflict_updates(sql_trans *tr, sql_table *t, oid rid, size_t cnt)
+{
+       int err = 0;
+
+       /* TODO check for conflicting updates */
+       (void)rid;
+       (void)cnt;
+       for(node *n = ol_first_node(t->columns); n && !err; n = n->next) {
+               sql_column *c = n->data;
+               sql_delta *d = ATOMIC_PTR_GET(&c->data);
+
+               /* check for active updates */
+               if (!VALID_4_READ(d->cs.ts, tr) && d->cs.ucnt)
+                       return 1;
+       }
+       return 0;
+}
+
+static int
 storage_delete_val(sql_trans *tr, sql_table *t, storage *s, oid rid)
 {
        int in_transaction = segments_in_transaction(tr, t);
@@ -1543,7 +1562,8 @@ storage_delete_val(sql_trans *tr, sql_ta
                if (seg->start <= rid && seg->end > rid) {
                        if (!SEG_VALID_4_DELETE(seg,tr))
                                return LOG_CONFLICT;
-                       /* TODO check for conflicting updates */
+                       if (deletes_conflict_updates( tr, t, rid, 1))
+                               return LOG_CONFLICT;
                        (void)split_segment(s->segs, seg, p, tr, rid, 1, true);
                        break;
                }
@@ -1554,7 +1574,7 @@ storage_delete_val(sql_trans *tr, sql_ta
 }
 
 static int
-delete_range(sql_trans *tr, storage *s, size_t start, size_t cnt)
+delete_range(sql_trans *tr, sql_table *t, storage *s, size_t start, size_t cnt)
 {
        segment *seg = s->segs->h, *p = NULL;
        for (; seg; p = seg, seg = seg->next) {
@@ -1568,7 +1588,8 @@ delete_range(sql_trans *tr, storage *s, 
                                continue;
                        } else if (!SEG_VALID_4_DELETE(seg, tr))
                                return LOG_CONFLICT;
-                       /* TODO check for conflicting updates */
+                       if (deletes_conflict_updates( tr, t, start, lcnt))
+                               return LOG_CONFLICT;
                        seg = split_segment(s->segs, seg, p, tr, start, lcnt, 
true);
                        start += lcnt;
                        cnt -= lcnt;
@@ -1592,7 +1613,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
                if (BATtdense(i)) {
                        size_t start = i->tseqbase;
                        size_t cnt = BATcount(i);
-                       ok = delete_range(tr, s, start, cnt);
+                       ok = delete_range(tr, t, s, start, cnt);
                } else if (complex_cand(i)) {
                        struct canditer ci;
                        oid f = 0, l = 0, cur = 0;
@@ -1605,11 +1626,11 @@ storage_delete_bat(sql_trans *tr, sql_ta
                                                cur++;
                                                continue;
                                        }
-                                       ok = delete_range(tr, s, f, cur-f);
+                                       ok = delete_range(tr, t, s, f, cur-f);
                                        f = cur = l;
                                }
                                if (ok == LOG_OK)
-                                       ok = delete_range(tr, s, f, cur-f);
+                                       ok = delete_range(tr, t, s, f, cur-f);
                        }
                } else {
                        if (!BATtordered(i)) {
@@ -1629,7 +1650,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
                                        lcnt++;
                                        n++;
                                } else {
-                                       ok = delete_range(tr, s, n-lcnt, lcnt);
+                                       ok = delete_range(tr, t, s, n-lcnt, 
lcnt);
                                        lcnt = 0;
                                }
                                if (!lcnt) {
@@ -1638,7 +1659,7 @@ storage_delete_bat(sql_trans *tr, sql_ta
                                }
                        }
                        if (lcnt && ok == LOG_OK)
-                               ok = delete_range(tr, s, n-lcnt, lcnt);
+                               ok = delete_range(tr, t, s, n-lcnt, lcnt);
                }
        }
        if (i != oi)
@@ -2178,7 +2199,7 @@ commit_create_idx( sql_trans *tr, sql_ch
 }
 
 static int
-load_storage(sql_trans *tr, storage *s, sqlid id)
+load_storage(sql_trans *tr, sql_table *t, storage *s, sqlid id)
 {
        int ok = load_cs(tr, &s->cs, TYPE_msk, id);
        BAT *b = NULL, *ib = NULL;
@@ -2198,7 +2219,7 @@ load_storage(sql_trans *tr, storage *s, 
                if (BATtdense(b)) {
                        size_t start = b->tseqbase;
                        size_t cnt = BATcount(b);
-                       ok = delete_range(tr, s, start, cnt);
+                       ok = delete_range(tr, t, s, start, cnt);
                } else {
                        assert(BATtordered(b));
                        BUN icnt = BATcount(b);
@@ -2209,7 +2230,7 @@ load_storage(sql_trans *tr, storage *s, 
                                        lcnt++;
                                        n++;
                                } else {
-                                       if ((ok = delete_range(tr, s, n-lcnt, 
lcnt)) != LOG_OK)
+                                       if ((ok = delete_range(tr, t, s, 
n-lcnt, lcnt)) != LOG_OK)
                                                break;
                                        lcnt = 0;
                                }
@@ -2219,7 +2240,7 @@ load_storage(sql_trans *tr, storage *s, 
                                }
                        }
                        if (lcnt && ok == LOG_OK)
-                               ok = delete_range(tr, s, n-lcnt, lcnt);
+                               ok = delete_range(tr, t, s, n-lcnt, lcnt);
                }
                if (ok == LOG_OK)
                        for (segment *seg = s->segs->h; seg; seg = seg->next)
@@ -2260,7 +2281,7 @@ create_del(sql_trans *tr, sql_table *t)
 
        if (!isNew(t) && !isTempTable(t)) {
                bat->cs.ts = tr->ts;
-               return load_storage(tr, bat, t->base.id);
+               return load_storage(tr, t, bat, t->base.id);
        } else if (bat->cs.bid && !isTempTable(t)) {
                return ok;
        } else if (!bat->cs.bid) {
@@ -2655,7 +2676,7 @@ clear_del(sql_trans *tr, sql_table *t, i
 
        if (!clear) {
                lock_table(tr->store, t->base.id);
-               ok = delete_range(tr, bat, 0, bat->segs->t->end);
+               ok = delete_range(tr, t, 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)))
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to