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