Changeset: c8369de328be for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c8369de328be
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger.h
        sql/server/rel_updates.c
        sql/test/leaks/Tests/check0_bam.stable.out.int128
        sql/test/leaks/Tests/check1_bam.stable.out
        sql/test/leaks/Tests/check1_bam.stable.out.int128
        sql/test/leaks/Tests/check2_bam.stable.out
        sql/test/leaks/Tests/check2_bam.stable.out.int128
        sql/test/leaks/Tests/check3_bam.stable.out
        sql/test/leaks/Tests/check3_bam.stable.out.int128
        sql/test/leaks/Tests/check4_bam.stable.out
        sql/test/leaks/Tests/check4_bam.stable.out.int128
        sql/test/leaks/Tests/check5_bam.stable.out
        sql/test/leaks/Tests/check5_bam.stable.out.int128
        sql/test/leaks/Tests/drop3_bam.stable.out.int128
        sql/test/leaks/Tests/select1_bam.stable.out.int128
        sql/test/leaks/Tests/select2_bam.stable.out.int128
        sql/test/leaks/Tests/temp1_bam.stable.out.int128
        sql/test/leaks/Tests/temp2_bam.stable.out.int128
        sql/test/leaks/Tests/temp3_bam.stable.out.int128
Branch: default
Log Message:

made log headless


diffs (truncated from 1275 to 300 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -102,26 +102,32 @@ static int bm_commit(logger *lg);
 static int tr_grow(trans *tr);
 
 static BUN
-logbat_find_int(BAT *b, int val)
+log_find_int(BAT *b, BAT *d, int val)
 {
        BUN p, q;
        int *t = (int *) Tloc(b, BUNfirst(b));
 
-       for (p = 0, q = BATcount(b); p < q; p++)
-               if (t[p] == val)
-                       return p + BUNfirst(b);
+       for (p = 0, q = BATcount(b); p < q; p++) {
+               BUN pos = p + BUNfirst(b);
+
+               if (t[p] == val && BUNfnd(d, &pos) == BUN_NONE)
+                       return pos;
+       }
        return BUN_NONE;
 }
 
 static BUN
-logbat_find_bid(BAT *b, log_bid val)
+log_find_bid(BAT *b, BAT *d, log_bid val)
 {
        BUN p, q;
        log_bid *t = (log_bid *) Tloc(b, BUNfirst(b));
 
-       for (p = 0, q = BATcount(b); p < q; p++)
-               if (t[p] == val)
-                       return p + BUNfirst(b);
+       for (p = 0, q = BATcount(b); p < q; p++) {
+               BUN pos = p + BUNfirst(b);
+
+               if (t[p] == val && BUNfnd(d, &pos) == BUN_NONE)
+                       return pos;
+       }
        return BUN_NONE;
 }
 
@@ -224,6 +230,22 @@ log_read_clear(logger *lg, trans *tr, ch
        }
 }
 
+static int
+avoid_snapshot( logger *lg, log_bid bid ) 
+{
+       if (BATcount(lg->snapshots_bid)-BATcount(lg->dsnapshots)) {
+               BUN p = log_find_bid(lg->snapshots_bid, lg->dsnapshots, bid);
+
+               if (p != BUN_NONE) {
+                       int tid = *(int *) Tloc(lg->snapshots_tid, p);
+
+                       if (lg->tid <= tid)
+                               return 1;
+               }
+       }
+       return 0;
+}
+
 static void
 la_bat_clear(logger *lg, logaction *la)
 {
@@ -232,17 +254,10 @@ la_bat_clear(logger *lg, logaction *la)
 
        if (lg->debug & 1)
                fprintf(stderr, "#la_bat_clear %s\n", la->name);
+
        /* do we need to skip these old updates */
-       if (BATcount(lg->snapshots_bid)) {
-               BUN p = logbat_find_bid(lg->snapshots_bid, bid);
-
-               if (p != BUN_NONE) {
-                       int tid = *(int *) Tloc(lg->snapshots_tid, p);
-
-                       if (lg->tid <= tid)
-                               return;
-               }
-       }
+       if (avoid_snapshot(lg, bid)) 
+               return;
 
        b = BATdescriptor(bid);
        if (b) {
@@ -267,12 +282,12 @@ log_read_seq(logger *lg, logformat *l)
                return LOG_ERR;
        }
 
-       if ((p = logbat_find_int(lg->seqs_id, seq)) != BUN_NONE) {
-               BUNdelete(lg->seqs_id, p, FALSE);
-               BUNdelete(lg->seqs_val, p, FALSE);
+       if ((p = log_find_int(lg->seqs_id, lg->dseqs, seq)) != BUN_NONE) {
+               BUNinplace(lg->seqs_val, p, &seq, &val, FALSE);
+       } else {
+               BUNappend(lg->seqs_id, &seq, FALSE);
+               BUNappend(lg->seqs_val, &val, FALSE);
        }
-       BUNappend(lg->seqs_id, &seq, FALSE);
-       BUNappend(lg->seqs_val, &val, FALSE);
        return LOG_OK;
 }
 
@@ -454,16 +469,8 @@ la_bat_updates(logger *lg, logaction *la
                return;         /* ignore bats no longer in the catalog */
 
        /* do we need to skip these old updates */
-       if (BATcount(lg->snapshots_bid)) {
-               BUN p = logbat_find_bid(lg->snapshots_bid, bid);
-
-               if (p != BUN_NONE) {
-                       int tid = *(int *) Tloc(lg->snapshots_tid, p);
-
-                       if (lg->tid <= tid)
-                               return;
-               }
-       }
+       if (avoid_snapshot(lg, bid)) 
+               return;
 
        b = BATdescriptor(bid);
        assert(b);
@@ -530,7 +537,8 @@ la_bat_destroy(logger *lg, logaction *la
                BUN p;
 
                logger_del_bat(lg, bid);
-               if ((p = logbat_find_bid(lg->snapshots_bid, bid)) != BUN_NONE) {
+
+               if ((p = log_find_bid(lg->snapshots_bid, lg->dsnapshots, bid)) 
!= BUN_NONE) {
 #ifndef NDEBUG
                        assert(BBP_desc(bid)->S.role == PERSISTENT);
                        assert(0 <= BBP_desc(bid)->H.heap.farmid && 
BBP_desc(bid)->H.heap.farmid < MAXFARMS);
@@ -546,11 +554,7 @@ la_bat_destroy(logger *lg, logaction *la
                                
assert(BBPfarms[BBP_desc(bid)->T.vheap->farmid].roles & (1 << PERSISTENT));
                        }
 #endif
-                       BUNdelete(lg->snapshots_bid, p, FALSE);
-                       BUNdelete(lg->snapshots_tid, p, FALSE);
-                       /* move to the dirty new part of the snapshots list */
-                       BUNappend(lg->snapshots_bid, &bid, FALSE);
-                       BUNappend(lg->snapshots_tid, &lg->tid, FALSE);
+                       BUNappend(lg->dsnapshots, &p, FALSE);
                }
        }
 }
@@ -644,10 +648,8 @@ la_bat_use(logger *lg, logaction *la)
                return;
        }
        logger_add_bat(lg, b, la->name);
-       if ((p = logbat_find_bid(lg->snapshots_bid, b->batCacheid)) != 
BUN_NONE) {
-               BUNdelete(lg->snapshots_bid, p, FALSE);
-               BUNdelete(lg->snapshots_tid, p, FALSE);
-       }
+       if ((p = log_find_bid(lg->snapshots_bid, lg->dsnapshots, 
b->batCacheid)) != BUN_NONE) 
+               BUNinplace(lg->snapshots_tid, p, &b->batCacheid, &lg->tid, 
FALSE);
 #ifndef NDEBUG
        assert(b->batRole == PERSISTENT);
        assert(0 <= b->H->heap.farmid && b->H->heap.farmid < MAXFARMS);
@@ -664,8 +666,10 @@ la_bat_use(logger *lg, logaction *la)
        }
 #endif
        /* move to the dirty new part of the snapshots list, new snapshots will 
get flushed to disk */
-       BUNappend(lg->snapshots_bid, &b->batCacheid, FALSE);
-       BUNappend(lg->snapshots_tid, &lg->tid, FALSE);
+       if (p == BUN_NONE) {
+               BUNappend(lg->snapshots_bid, &b->batCacheid, FALSE);
+               BUNappend(lg->snapshots_tid, &lg->tid, FALSE);
+       }
        logbat_destroy(b);
 }
 
@@ -999,18 +1003,17 @@ logger_commit(logger *lg)
        if (lg->debug & 1)
                fprintf(stderr, "#logger_commit\n");
 
-       p = logbat_find_int(lg->seqs_id, id);
-       BUNdelete(lg->seqs_id, p, FALSE);
-       BUNdelete(lg->seqs_val, p, FALSE);
-       BUNappend(lg->seqs_id, &id, FALSE);
-       BUNappend(lg->seqs_val, &lg->id, FALSE);
+       p = log_find_int(lg->seqs_id, lg->dseqs, id);
+       BUNinplace(lg->seqs_val, p, &id, &lg->id, FALSE);
 
        /* cleanup old snapshots */
        if (BATcount(lg->snapshots_bid)) {
                BATclear(lg->snapshots_bid, FALSE);
                BATclear(lg->snapshots_tid, FALSE);
+               BATclear(lg->dsnapshots, FALSE);
                BATcommit(lg->snapshots_bid);
                BATcommit(lg->snapshots_tid);
+               BATcommit(lg->dsnapshots);
        }
        return bm_commit(lg);
 }
@@ -1045,34 +1048,26 @@ check_version(logger *lg, FILE *fp)
 }
 
 static int
-bm_subcommit(BAT *list_bid, BAT *list_nme, BAT *catalog_bid, BAT *catalog_nme, 
BAT *extra, int debug)
+bm_subcommit(BAT *list_bid, BAT *list_nme, BAT *catalog_bid, BAT *catalog_nme, 
BAT *dcatalog, BAT *extra, int debug)
 {
        BUN p, q;
-       BUN nn = 3 + (list_bid->batFirst > list_bid->batDeleted ? 
list_bid->batFirst - list_bid->batDeleted : 0) + BATcount(list_bid) + (extra ? 
BATcount(extra) : 0);
+       BUN nn = 4 + BATcount(list_bid) + (extra ? BATcount(extra) : 0);
        bat *n = GDKmalloc(sizeof(bat) * nn);
        int i = 0;
        BATiter iter = (list_nme)?bat_iterator(list_nme):bat_iterator(list_bid);
        int res;
 
        n[i++] = 0;             /* n[0] is not used */
-
-       /* first loop over deleted then over current and new */
-       for (p = list_bid->batDeleted; p < list_bid->batFirst; p++) {
-               bat col = *(log_bid *) Tloc(list_bid, p);
-
-               if (debug & 1)
-                       fprintf(stderr, "#commit deleted %s (%d) %s\n",
-                               BBPname(col), col,
-                               (list_bid == catalog_bid) ? BUNtail(iter, p) : 
"snapshot");
-               n[i++] = abs(col);
-       }
        BATloop(list_bid, p, q) {
                bat col = *(log_bid *) Tloc(list_bid, p);
 
+               if (list_bid == catalog_bid && BUNfnd(dcatalog, &p) != BUN_NONE)
+                       continue;
                if (debug & 1)
                        fprintf(stderr, "#commit new %s (%d) %s\n",
                                BBPname(col), col,
                                (list_bid == catalog_bid) ? BUNtail(iter, p) : 
"snapshot");
+               assert(col);
                n[i++] = abs(col);
        }
        if (extra) {
@@ -1084,15 +1079,18 @@ bm_subcommit(BAT *list_bid, BAT *list_nm
                                fprintf(stderr, "#commit extra %s %s\n",
                                        name,
                                        (list_bid == catalog_bid) ? 
BUNtail(iter, p) : "snapshot");
+                       assert(BBPindex(name));
                        n[i++] = abs(BBPindex(name));
                }
        }
        /* now commit catalog, so it's also up to date on disk */
        n[i++] = abs(catalog_bid->batCacheid);
        n[i++] = abs(catalog_nme->batCacheid);
+       n[i++] = abs(dcatalog->batCacheid);
        assert((BUN) i <= nn);
        BATcommit(catalog_bid);
        BATcommit(catalog_nme);
+       BATcommit(dcatalog);
        res = TMsubcommit_list(n, i);
        GDKfree(n);
        if (res < 0)
@@ -1123,7 +1121,7 @@ logger_new(int debug, const char *fn, co
        char filename[BUFSIZ];
        char bak[BUFSIZ];
        log_bid snapshots_bid = 0;
-       bat catalog_bid, catalog_nme, bid;
+       bat catalog_bid, catalog_nme, dcatalog, bid;
 
        /* if the path is absolute, it means someone is still calling
         * logger_create/logger_new "manually" */
@@ -1162,10 +1160,13 @@ logger_new(int debug, const char *fn, co
        lg->end = 0;
        lg->catalog_bid = NULL;
        lg->catalog_nme = NULL;
+       lg->dcatalog = NULL;
        lg->snapshots_bid = NULL;
        lg->snapshots_tid = NULL;
+       lg->dsnapshots = NULL;
        lg->seqs_id = NULL;
        lg->seqs_val = NULL;
+       lg->dseqs = NULL;
 
        snprintf(filename, BUFSIZ, "%s%s", lg->dir, LOGFILE);
        snprintf(bak, BUFSIZ, "%s.bak", filename);
@@ -1210,7 +1211,8 @@ logger_new(int debug, const char *fn, co
 
                lg->catalog_bid = logbat_new(TYPE_int, BATSIZE, PERSISTENT);
                lg->catalog_nme = logbat_new(TYPE_str, BATSIZE, PERSISTENT);
-               if (lg->catalog_bid == NULL || lg->catalog_nme == NULL)
+               lg->dcatalog = logbat_new(TYPE_oid, BATSIZE, PERSISTENT);
+               if (lg->catalog_bid == NULL || lg->catalog_nme == NULL || 
lg->dcatalog == NULL)
                        logger_fatal("Logger_new: cannot create catalog bats",
                                     0, 0, 0);
                if (debug & 1)
@@ -1232,6 +1234,13 @@ logger_new(int debug, const char *fn, co
                        logger_fatal("Logger_new: BBPrename to %s failed",
                                     bak, 0, 0);
 
+               bid = lg->dcatalog->batCacheid;
+               BBPincref(bid, TRUE);
+               snprintf(bak, BUFSIZ, "%s_dcatalog", fn);
+               if (BBPrename(lg->dcatalog->batCacheid, bak) < 0)
+                       logger_fatal("Logger_new: BBPrename to %s failed",
+                                    bak, 0, 0);
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to