Changeset: 1fe857da00de for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1fe857da00de Modified Files: sql/server/rel_optimizer.c Branch: mtest Log Message:
Merged with default diffs (truncated from 3436 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -516,6 +516,7 @@ gdk_return log_bat_clear(logger *lg, con gdk_return log_bat_persists(logger *lg, BAT *b, const char *n, char tpe, oid id); gdk_return log_bat_transient(logger *lg, const char *n, char tpe, oid id); gdk_return log_delta(logger *lg, BAT *uid, BAT *uval, const char *n, char tpe, oid id); +lng log_save_id(logger *lg); gdk_return log_sequence(logger *lg, int seq, lng id); gdk_return log_tend(logger *lg); gdk_return log_tstart(logger *lg); @@ -525,9 +526,8 @@ gdk_return logger_cleanup(logger *lg); logger *logger_create(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp); gdk_return logger_del_bat(logger *lg, log_bid bid) __attribute__((__warn_unused_result__)); void logger_destroy(logger *lg); -gdk_return logger_exit(logger *lg); log_bid logger_find_bat(logger *lg, const char *name, char tpe, oid id); -gdk_return logger_restart(logger *lg); +gdk_return logger_flush(logger *lg, lng save_id); int logger_sequence(logger *lg, int seq, lng *id); gdk_return logger_upgrade_bat(logger *lg, const char *name, char tpe, oid id) __attribute__((__warn_unused_result__)); void logger_with_ids(logger *lg); @@ -1166,6 +1166,7 @@ str connectRef; str contextRef; str convertConstant(malType type, ValPtr vr); InstrPtr copyInstruction(InstrPtr p); +InstrPtr copyInstructionArgs(InstrPtr p, int args); MalBlkPtr copyMalBlk(MalBlkPtr mb); str copyRef; str copy_fromRef; @@ -1467,11 +1468,14 @@ str multicolumnRef; str multiplexRef; str mvcRef; InstrPtr newAssignment(MalBlkPtr mb); +InstrPtr newAssignmentArgs(MalBlkPtr mb, int args); InstrPtr newCatchStmt(MalBlkPtr mb, str nme); InstrPtr newComment(MalBlkPtr mb, const char *val); InstrPtr newExitStmt(MalBlkPtr mb, str nme); InstrPtr newFcnCall(MalBlkPtr mb, char *mod, char *fcn); +InstrPtr newFcnCallArgs(MalBlkPtr mb, char *mod, char *fcn, int args); Symbol newFunction(str mod, str nme, int kind); +Symbol newFunctionArgs(str mod, str nme, int kind, int args); MalStkPtr newGlobalStack(int size); InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); @@ -1495,7 +1499,6 @@ str not_uniqueRef; str nth_valueRef; str ntileRef; str oidRef; -void oldmoveInstruction(InstrPtr dst, InstrPtr src); str oltpRef; str openProfilerStream(Client cntxt); str openRef; diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -160,7 +160,7 @@ typedef enum {LOG_OK, LOG_EOF, LOG_ERR} * indicate that to the function wkbREAD during reading of the log. */ static bool geomisoldversion; -static gdk_return bm_commit(logger *lg); +static gdk_return bm_commit(logger *lg, lng save_id); static gdk_return tr_grow(trans *tr); static BUN @@ -1401,7 +1401,7 @@ logger_readlogs(logger *lg, FILE *fp, ch } static gdk_return -logger_commit(logger *lg) +logger_commit(logger *lg, lng save_id) { if (lg->debug & 1) fprintf(stderr, "#logger_commit\n"); @@ -1416,7 +1416,7 @@ logger_commit(logger *lg) BATcommit(lg->snapshots_tid); BATcommit(lg->dsnapshots); } - return bm_commit(lg); + return bm_commit(lg, save_id); } static gdk_return @@ -1721,6 +1721,7 @@ logger_load(int debug, const char *fn, c lg->snapshots_tid = NULL; lg->dsnapshots = NULL; lg->freed = NULL; + lg->freed_lid = NULL; lg->seqs_id = NULL; lg->seqs_val = NULL; lg->dseqs = NULL; @@ -2006,6 +2007,15 @@ logger_load(int debug, const char *fn, c if (BBPrename(lg->freed->batCacheid, bak) < 0) { goto error; } + lg->freed_lid = logbat_new(TYPE_lng, 1, TRANSIENT); + if (lg->freed_lid == NULL) { + GDKerror("Logger_new: failed to create freed_lid bat"); + goto error; + } + strconcat_len(bak, sizeof(bak), fn, "_freed_lid", NULL); + if (BBPrename(lg->freed_lid->batCacheid, bak) < 0) { + goto error; + } snapshots_bid = logger_find_bat(lg, "snapshots_bid", 0, 0); if (snapshots_bid == 0) { lg->snapshots_bid = logbat_new(TYPE_int, 1, PERSISTENT); @@ -2129,7 +2139,7 @@ logger_load(int debug, const char *fn, c needcommit = true; } GDKdebug &= ~CHECKMASK; - if (needcommit && bm_commit(lg) != GDK_SUCCEED) { + if (needcommit && bm_commit(lg, lg->tid+1) != GDK_SUCCEED) { GDKerror("Logger_new: commit failed"); goto error; } @@ -2303,6 +2313,7 @@ logger_load(int debug, const char *fn, c logbat_destroy(lg->snapshots_tid); logbat_destroy(lg->dsnapshots); logbat_destroy(lg->freed); + logbat_destroy(lg->freed_lid); logbat_destroy(lg->seqs_id); logbat_destroy(lg->seqs_val); logbat_destroy(lg->dseqs); @@ -2392,6 +2403,12 @@ logger_new(int debug, const char *fn, co return NULL; } +static gdk_return +logger_restart(logger *lg) +{ + return logger_flush(lg, lg->tid); +} + /* Create a new logger */ logger * logger_create(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) @@ -2456,6 +2473,7 @@ logger_destroy(logger *lg) logbat_destroy(lg->catalog_oid); logbat_destroy(lg->dcatalog); logbat_destroy(lg->freed); + logbat_destroy(lg->freed_lid); } GDKfree(lg->fn); GDKfree(lg->dir); @@ -2463,8 +2481,8 @@ logger_destroy(logger *lg) GDKfree(lg); } -gdk_return -logger_exit(logger *lg) +static gdk_return +logger_exit(logger *lg, lng save_id) { FILE *fp; char filename[FILENAME_MAX]; @@ -2472,7 +2490,7 @@ logger_exit(logger *lg) if (LOG_DISABLED(lg)) { logger_close(lg); - if (logger_commit(lg) != GDK_SUCCEED) { + if (logger_commit(lg, save_id) != GDK_SUCCEED) { TRC_CRITICAL(GDK, "logger_commit failed\n"); return GDK_FAIL; } @@ -2503,7 +2521,7 @@ logger_exit(logger *lg) } lg->id ++; - if (logger_commit(lg) != GDK_SUCCEED) { + if (logger_commit(lg, save_id) != GDK_SUCCEED) { (void) fclose(fp); TRC_CRITICAL(GDK, "logger_commit failed\n"); return GDK_FAIL; @@ -2557,9 +2575,9 @@ logger_exit(logger *lg) } gdk_return -logger_restart(logger *lg) +logger_flush(logger *lg, lng save_id) { - if (logger_exit(lg) == GDK_SUCCEED && + if (logger_exit(lg, save_id) == GDK_SUCCEED && logger_open(lg) == GDK_SUCCEED) return GDK_SUCCEED; return GDK_FAIL; @@ -3114,24 +3132,39 @@ log_sequence(logger *lg, int seq, lng va } static gdk_return -bm_commit(logger *lg) +bm_commit(logger *lg, lng save_id) { BUN p, q; - BAT *b = lg->catalog_bid; + BAT *b = lg->catalog_bid, *nfreed = NULL, *nfreed_lid = NULL; BAT *n = logbat_new(TYPE_str, BATcount(lg->freed), TRANSIENT); gdk_return res; const log_bid *bids; + const lng *lids; + BUN leftover = 0; if (n == NULL) return GDK_FAIL; /* subcommit the freed bats */ bids = (const log_bid *) Tloc(lg->freed, 0); + lids = (const lng *) Tloc(lg->freed_lid, 0); BATloop(lg->freed, p, q) { bat bid = bids[p]; + lng lid = lids[p]; BAT *lb = BATdescriptor(bid); str name = BBPname(bid); + if (lid > save_id) { + leftover++; + continue; + } + + if (lg->debug & 1) { + if (BBP_lrefs(bid) != 2) { + fprintf(stderr, "release %d %d\n", bid, BBP_lrefs(bid)); + assert(0); + } + } if (lb == NULL || BATmode(lb, true) != GDK_SUCCEED) { logbat_destroy(lb); @@ -3150,6 +3183,29 @@ bm_commit(logger *lg) } BBPrelease(bid); } + if (leftover) { + nfreed = logbat_new(TYPE_int, leftover, TRANSIENT); + nfreed_lid = logbat_new(TYPE_lng, leftover, TRANSIENT); + + if (!nfreed || !nfreed_lid) { + logbat_destroy(n); + logbat_destroy(nfreed); + logbat_destroy(nfreed_lid); + return GDK_FAIL; + } + BATloop(lg->freed, p, q) { + lng lid = lids[p]; + + if (lid < save_id && ( + BUNappend(nfreed, bids+p, false) != GDK_SUCCEED || + BUNappend(nfreed_lid, &lid, false) != GDK_SUCCEED)) { + logbat_destroy(n); + logbat_destroy(nfreed); + logbat_destroy(nfreed_lid); + return GDK_FAIL; + } + } + } bids = (log_bid *) Tloc(b, 0); for (p = b->batInserted; p < BUNlast(b); p++) { @@ -3167,6 +3223,8 @@ bm_commit(logger *lg) BATmode(lb, false) != GDK_SUCCEED) { logbat_destroy(lb); logbat_destroy(n); + logbat_destroy(nfreed); + logbat_destroy(nfreed_lid); return GDK_FAIL; } @@ -3180,8 +3238,24 @@ bm_commit(logger *lg) res = bm_subcommit(lg, lg->catalog_bid, lg->catalog_nme, lg->catalog_bid, lg->catalog_nme, lg->catalog_tpe, lg->catalog_oid, lg->dcatalog, n, lg->debug); BBPreclaim(n); if (res == GDK_SUCCEED) { - BATclear(lg->freed, false); - BATcommit(lg->freed); + /* switch */ + if (nfreed && nfreed_lid) { + if (logger_switch_bat(lg->freed, nfreed, lg->fn, "freed") != GDK_SUCCEED || + logger_switch_bat(lg->freed_lid, nfreed_lid, lg->fn, "freed_lid") != GDK_SUCCEED) { + logbat_destroy(nfreed); + logbat_destroy(nfreed_lid); + return GDK_FAIL; + } + logbat_destroy(lg->freed); + logbat_destroy(lg->freed_lid); + lg->freed = nfreed; + lg->freed_lid = nfreed_lid; + } else { + BATclear(lg->freed, true); + BATclear(lg->freed_lid, true); + BATcommit(lg->freed); + BATcommit(lg->freed_lid); + } return GDK_SUCCEED; } return GDK_FAIL; @@ -3224,6 +3298,7 @@ logger_add_bat(logger *lg, BAT *b, const BUNappend(lg->catalog_tpe, &tpe, false) != GDK_SUCCEED || BUNappend(lg->catalog_oid, &lid, false) != GDK_SUCCEED) return GDK_FAIL; + BBPretain(bid); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list