Changeset: 8ecd046e7584 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8ecd046e7584
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk_batop.c
gdk/gdk_logger.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_upgrades.c
sql/server/rel_exp.c
sql/server/rel_optimizer.c
sql/server/rel_rel.h
sql/server/rel_unnest.c
sql/server/sql_mvc.h
sql/storage/bat/bat_logger.c
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: default
Log Message:
Merged with Oct2020
diffs (truncated from 1648 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);
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);
return GDK_SUCCEED;
}
@@ -3253,6 +3328,7 @@ logger_del_bat(logger *lg, log_bid bid)
BAT *b = BATdescriptor(bid);
BUN p = log_find(lg->catalog_bid, lg->dcatalog, bid), q;
oid pos;
+ lng lid = lg->tid;
assert(p != BUN_NONE);
if (p == BUN_NONE) {
@@ -3274,14 +3350,16 @@ logger_del_bat(logger *lg, log_bid bid)
fprintf(stderr,
"#logger_del_bat release snapshot %d (%d)\n",
bid, BBP_lrefs(bid));
- if (BUNappend(lg->freed, &bid, false) != GDK_SUCCEED) {
+ if (BUNappend(lg->freed, &bid, false) != GDK_SUCCEED ||
+ BUNappend(lg->freed_lid, &lid, false) != GDK_SUCCEED) {
logbat_destroy(b);
return GDK_FAIL;
}
- } else if (p >= lg->catalog_bid->batInserted) {
+ } else if (p >= lg->catalog_bid->batInserted) { /* never became
persistent */
BBPrelease(bid);
} else {
- if (BUNappend(lg->freed, &bid, false) != GDK_SUCCEED) {
+ if (BUNappend(lg->freed, &bid, false) != GDK_SUCCEED ||
+ BUNappend(lg->freed_lid, &lid, false) != GDK_SUCCEED) {
logbat_destroy(b);
return GDK_FAIL;
}
@@ -3368,3 +3446,9 @@ geomversion_get(void)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list