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

update deleted mask after logging.


diffs (211 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
@@ -239,76 +239,12 @@ rollback_segments(segments *segs, sql_tr
        }
 }
 
-static void
-merge_segments(segments *segs, sql_trans *tr, sql_change *change, ulng 
commit_ts, ulng oldest)
-{
-       segment *cur = segs->h, *seg = NULL;
-       for (; cur; cur = cur->next) {
-               if (cur->ts == tr->tid) {
-                       if (!cur->deleted)
-                               cur->oldts = 0;
-                       cur->ts = commit_ts;
-               }
-               if (cur->ts <= oldest && cur->ts < TRANSACTION_ID_BASE) { /* 
possibly merge range */
-                       if (!seg) { /* skip first */
-                               seg = cur;
-                       } else if (seg->end == cur->start && seg->deleted == 
cur->deleted) {
-                               /* merge with previous */
-                               seg->end = cur->end;
-                               seg->next = cur->next;
-                               if (cur == segs->t)
-                                       segs->t = seg;
-                               if (commit_ts == oldest)
-                                       _DELETE(cur);
-                               else
-                                       mark4destroy(cur, change, commit_ts);
-                               cur = seg;
-                       } else {
-                               seg = cur; /* begin of new merge */
-                       }
-               }
-       }
-}
-
-static int
-segments_in_transaction(sql_trans *tr, sql_table *t)
-{
-       storage *s = ATOMIC_PTR_GET(&t->data);
-       segment *seg = s->segs->h;
-
-       if (seg && s->segs->t->ts == tr->tid)
-               return 1;
-       for (; seg ; seg=seg->next) {
-               if (seg->ts == tr->tid)
-                       return 1;
-       }
-       return 0;
-}
-
-static size_t
-segs_end( segments *segs, sql_trans *tr, sql_table *table)
-{
-       size_t cnt = 0;
-
-       lock_table(tr->store, table->base.id);
-       segment *s = segs->h, *l = NULL;
-
-       for(;s; s = s->next) {
-               if (SEG_IS_VALID(s, tr))
-                               l = s;
-       }
-       if (l)
-               cnt = l->end;
-       unlock_table(tr->store, table->base.id);
-       return cnt;
-}
-
 static size_t
 segs_end_include_deleted( segments *segs, sql_trans *tr, sql_table *table)
 {
        size_t cnt = 0;
-
-       lock_table(tr->store, table->base.id);
+(void)table;
+//     lock_table(tr->store, table->base.id);
        segment *s = segs->h, *l = NULL;
 
        for(;s; s = s->next) {
@@ -317,7 +253,7 @@ segs_end_include_deleted( segments *segs
        }
        if (l)
                cnt = l->end;
-       unlock_table(tr->store, table->base.id);
+//     unlock_table(tr->store, table->base.id);
        return cnt;
 }
 
@@ -408,6 +344,71 @@ segments2cs(sql_trans *tr, segments *seg
        return LOG_OK;
 }
 
+/* TODO return LOG_OK/ERR */
+static void
+merge_segments(storage *s, sql_trans *tr, sql_change *change, ulng commit_ts, 
ulng oldest)
+{
+       segment *cur = s->segs->h, *seg = NULL;
+       for (; cur; cur = cur->next) {
+               if (cur->ts == tr->tid) {
+                       if (!cur->deleted)
+                               cur->oldts = 0;
+                       cur->ts = commit_ts;
+               }
+               if (cur->ts <= oldest && cur->ts < TRANSACTION_ID_BASE) { /* 
possibly merge range */
+                       if (!seg) { /* skip first */
+                               seg = cur;
+                       } else if (seg->end == cur->start && seg->deleted == 
cur->deleted) {
+                               /* merge with previous */
+                               seg->end = cur->end;
+                               seg->next = cur->next;
+                               if (cur == s->segs->t)
+                                       s->segs->t = seg;
+                               if (commit_ts == oldest)
+                                       _DELETE(cur);
+                               else
+                                       mark4destroy(cur, change, commit_ts);
+                               cur = seg;
+                       } else {
+                               seg = cur; /* begin of new merge */
+                       }
+               }
+       }
+}
+
+static int
+segments_in_transaction(sql_trans *tr, sql_table *t)
+{
+       storage *s = ATOMIC_PTR_GET(&t->data);
+       segment *seg = s->segs->h;
+
+       if (seg && s->segs->t->ts == tr->tid)
+               return 1;
+       for (; seg ; seg=seg->next) {
+               if (seg->ts == tr->tid)
+                       return 1;
+       }
+       return 0;
+}
+
+static size_t
+segs_end( segments *segs, sql_trans *tr, sql_table *table)
+{
+       size_t cnt = 0;
+
+       lock_table(tr->store, table->base.id);
+       segment *s = segs->h, *l = NULL;
+
+       for(;s; s = s->next) {
+               if (SEG_IS_VALID(s, tr))
+                               l = s;
+       }
+       if (l)
+               cnt = l->end;
+       unlock_table(tr->store, table->base.id);
+       return cnt;
+}
+
 static segments *
 new_segments(sql_trans *tr, size_t cnt)
 {
@@ -2649,7 +2650,11 @@ commit_create_del( sql_trans *tr, sql_ch
                return ok;
        if(!isTempTable(t)) {
                storage *dbat = ATOMIC_PTR_GET(&t->data);
-               merge_segments(dbat->segs, tr, change, commit_ts, commit_ts/* 
create is we are alone */ /*oldest*/);
+               ok = segments2cs(tr, dbat->segs, &dbat->cs, t);
+               assert(ok == LOG_OK);
+               if (ok != LOG_OK)
+                       return ok;
+               merge_segments(dbat, tr, change, commit_ts, commit_ts/* create 
is we are alone */ /*oldest*/);
                assert(dbat->cs.ts == tr->tid);
                dbat->cs.ts = commit_ts;
                if (ok == LOG_OK) {
@@ -3087,13 +3092,13 @@ log_table_append(sql_trans *tr, sql_tabl
 static int
 log_storage(sql_trans *tr, sql_table *t, storage *s, sqlid id)
 {
-       int ok = segments2cs(tr, s->segs, &s->cs, t);
+       int ok = LOG_OK;
        if (ok == LOG_OK && s->cs.cleared)
                return tr_log_cs(tr, t, &s->cs, s->segs->h, t->base.id);
        if (ok == LOG_OK)
-               ok = log_table_append(tr, t, s->segs);
+               ok = log_segments(tr, s->segs, id);
        if (ok == LOG_OK)
-               return log_segments(tr, s->segs, id);
+               ok = log_table_append(tr, t, s->segs);
        return ok;
 }
 
@@ -3482,11 +3487,15 @@ commit_update_del( sql_trans *tr, sql_ch
                storage *d = dbat;
                if (dbat->cs.ts == tr->tid) /* cleared table */
                        dbat->cs.ts = commit_ts;
-               merge_segments(dbat->segs, tr, change, commit_ts, oldest);
+
+               ok = segments2cs(tr, dbat->segs, &dbat->cs, t);
+               assert(ok == LOG_OK);
+               if (ok == LOG_OK)
+                       merge_segments(dbat, tr, change, commit_ts, oldest);
                if (ok == LOG_OK && dbat == d && oldest == commit_ts)
                        ok = merge_storage(dbat);
        } else if (ok == LOG_OK && tr->parent) {/* cleanup older save points */
-               merge_segments(dbat->segs, tr, change, commit_ts, oldest);
+               merge_segments(dbat, tr, change, commit_ts, oldest);
                ATOMIC_PTR_SET(&t->data, savepoint_commit_storage(dbat, 
commit_ts));
        }
        unlock_table(tr->store, t->base.id);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to