Changeset: 7e32d7be072e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7e32d7be072e
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger_internals.h
Branch: default
Log Message:

Add catalog_bid row to dcatalog during subcommit when bat is actually getting 
deleted.
All other "deletes" are administered by catalog_lid.


diffs (116 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1090,7 +1090,6 @@ log_open_output(logger *lg)
        logged_range *current = lg->current;
        assert(current && current->next == NULL);
        new_range->cnt = current->cnt;
-       new_range->deleted = current->deleted;
        current->next = new_range;
        ATOMIC_INC(&lg->nr_open_files);
        return GDK_SUCCEED;
@@ -1660,7 +1659,6 @@ cleanup_and_swap(logger *lg, int *r, con
                GDKclrerr();
        for (logged_range *p = lg->pending; p; p = p->next) {
                p->cnt -= cleanup;
-               p->deleted -= cleanup;
        }
        return rcnt;
 }
@@ -1671,7 +1669,7 @@ static gdk_return
 bm_subcommit(logger *lg, logged_range *pending, uint32_t *updated, BUN 
maxupdated)
 {
        BUN cnt = pending ? pending->cnt : BATcount(lg->catalog_bid);
-       BUN dcnt = pending ? pending->deleted : BATcount(lg->dcatalog);
+       BUN dcnt = BATcount(lg->dcatalog);
        BUN p, q;
        BAT *catalog_bid = lg->catalog_bid;
        BAT *catalog_id = lg->catalog_id;
@@ -1712,6 +1710,19 @@ bm_subcommit(logger *lg, logged_range *p
                        cleanup++;
                        if (lids[p] == -1)
                                continue;
+                       if (BUNappend(dcatalog, &(oid){p}, true) != 
GDK_SUCCEED) {
+                               while (BATcount(dcatalog) > dcnt) {
+                                       if (BUNdelete(dcatalog, 
BATcount(dcatalog) - 1) != GDK_SUCCEED) {
+                                               TRC_CRITICAL(WAL, "delete after 
failed append failed\n");
+                                               break;
+                                       }
+                               }
+                               GDKfree(n);
+                               GDKfree(r);
+                               GDKfree(sizes);
+                               log_unlock(lg);
+                               return GDK_FAIL;
+                       }
                }
                TRC_DEBUG(WAL, "new %s (%d)\n", BBP_logical(col), col);
                assert(col);
@@ -1723,7 +1734,7 @@ bm_subcommit(logger *lg, logged_range *p
        n[i++] = catalog_bid->batCacheid;
        sizes[i] = cnt;
        n[i++] = catalog_id->batCacheid;
-       sizes[i] = dcnt;
+       sizes[i] = BATcount(dcatalog);
        n[i++] = dcatalog->batCacheid;
 
        if (cleanup) {
@@ -1738,12 +1749,11 @@ bm_subcommit(logger *lg, logged_range *p
                        return GDK_FAIL;
                }
                cnt -= cleanup;
-               dcnt -= cleanup;
        }
        if (dcatalog != lg->dcatalog) {
                i = subcommit_list_add(i, n, sizes, 
lg->catalog_bid->batCacheid, cnt);
                i = subcommit_list_add(i, n, sizes, lg->catalog_id->batCacheid, 
cnt);
-               i = subcommit_list_add(i, n, sizes, lg->dcatalog->batCacheid, 
dcnt);
+               i = subcommit_list_add(i, n, sizes, lg->dcatalog->batCacheid, 
BATcount(lg->dcatalog));
        }
        if (lg->seqs_id) {
                sizes[i] = BATcount(lg->seqs_id);
@@ -2402,7 +2412,6 @@ log_create(int debug, const char *fn, co
        assert(lg->current == NULL);
        logged_range dummy = {
                .cnt = BATcount(lg->catalog_bid),
-               .deleted = BATcount(lg->dcatalog),
        };
        lg->current = &dummy;
        if (log_open_output(lg) != GDK_SUCCEED) {
@@ -3283,7 +3292,6 @@ static gdk_return
 log_del_bat(logger *lg, log_bid bid)
 {
        BUN p = log_find(lg->catalog_bid, lg->dcatalog, bid);
-       oid pos;
        lng lid = lg->tid;
 
        assert(p != BUN_NONE);
@@ -3292,16 +3300,8 @@ log_del_bat(logger *lg, log_bid bid)
                return GDK_FAIL;
        }
 
-       pos = (oid) p;
        assert(lg->catalog_lid->hseqbase == 0);
-       if (BUNreplace(lg->catalog_lid, p, &lid, false) != GDK_SUCCEED)
-               return GDK_FAIL;
-       if (BUNappend(lg->dcatalog, &pos, true) == GDK_SUCCEED) {
-               if (lg->current)
-                       lg->current->deleted++;
-               return GDK_SUCCEED;
-       }
-       return GDK_FAIL;
+       return BUNreplace(lg->catalog_lid, p, &lid, false);
 }
 
 /* returns -1 on failure, 0 when not found, > 0 when found */
diff --git a/gdk/gdk_logger_internals.h b/gdk/gdk_logger_internals.h
--- a/gdk/gdk_logger_internals.h
+++ b/gdk/gdk_logger_internals.h
@@ -22,7 +22,6 @@ typedef struct logged_range_t {
        struct logged_range_t *next;
        stream *output_log;
        BUN cnt;
-       BUN deleted;
 } logged_range;
 
 struct logger {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to