Changeset: 9e7a9b9d672d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9e7a9b9d672d Branch: unlock Log Message:
merged diffs (truncated from 829 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 @@ -550,7 +550,7 @@ void mo_free_options(opt *set, int setle void mo_print_options(opt *set, int setlen); int mo_system_config(opt **Set, int setlen); const oid oid_nil; -gdk_return old_logger_load(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp); +gdk_return old_logger_load(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void *funcdata); DIR *opendir(const char *dirname); void print_trace(void); ssize_t ptrFromStr(const char *src, size_t *len, ptr **dst, bool external); diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1093,6 +1093,7 @@ BBPheader(FILE *fp, int *lineno) return 0; } if (bbpversion != GDKLIBRARY && + bbpversion != GDKLIBRARY_MINMAX_POS && bbpversion != GDKLIBRARY_OLDDATE && bbpversion != GDKLIBRARY_BLOB_SORT) { TRC_CRITICAL(GDK, "incompatible BBP version: expected 0%o, got 0%o. " diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -857,7 +857,7 @@ logger_read_types_file(logger *lg, FILE static gdk_return -logger_create_types_file(logger *lg, char filename[FILENAME_MAX]) +logger_create_types_file(logger *lg, const char *filename) { FILE *fp; @@ -1181,7 +1181,7 @@ logger_commit(logger *lg) } static gdk_return -check_version(logger *lg, FILE *fp, char filename[FILENAME_MAX]) +check_version(logger *lg, FILE *fp, const char *fn, const char *logdir, const char *filename) { int version = 0; @@ -1190,9 +1190,9 @@ check_version(logger *lg, FILE *fp, char GDKerror("Could not read the version number from the file '%s/log'.\n", lg->dir); return GDK_FAIL; } - if (version != lg->version) { + if (version < 52300) { /* first CATALOG_VERSION for "new" log format */ fclose(fp); - if (old_logger_load(lg->debug, filename, lg->dir, lg->version, lg->prefuncp, lg->postfuncp) != GDK_SUCCEED) { + if (old_logger_load(lg->debug, fn, logdir, lg->version, lg->prefuncp, lg->postfuncp, lg->funcdata) != GDK_SUCCEED) { //loads drop no longer needed catalog, snapshots bats //convert catalog_oid -> catalog_id (lng->int) GDKerror("Incompatible database version %06d, " @@ -1209,6 +1209,7 @@ check_version(logger *lg, FILE *fp, char if (fgetc(fp) != '\n' || /* skip \n */ fgetc(fp) != '\n') { /* skip \n */ + fclose(fp); GDKerror("Badly formatted log file"); return GDK_FAIL; } @@ -1216,6 +1217,7 @@ check_version(logger *lg, FILE *fp, char fclose(fp); return GDK_FAIL; } + fclose(fp); } return GDK_SUCCEED; } @@ -1525,29 +1527,27 @@ bm_subcommit(logger *lg) return res; } -static str +static gdk_return logger_filename(logger *lg, char bak[FILENAME_MAX], char filename[FILENAME_MAX]) { str filenamestr = NULL; - int farmid = BBPselectfarm(PERSISTENT, 0, offheap); - if ((filenamestr = GDKfilepath(farmid, lg->dir, LOGFILE, NULL)) == NULL) - return NULL; - int len = snprintf(filename, FILENAME_MAX, "%s", filenamestr); - if (len == -1 || len >= FILENAME_MAX) { - GDKfree(filenamestr); + if ((filenamestr = GDKfilepath(0, lg->dir, LOGFILE, NULL)) == NULL) + return GDK_FAIL; + size_t len = strcpy_len(filename, filenamestr, FILENAME_MAX); + GDKfree(filenamestr); + if (len >= FILENAME_MAX) { GDKerror("Logger filename path is too large\n"); - return NULL; + return GDK_FAIL; } if (bak) { - len = snprintf(bak, FILENAME_MAX, "%s.bak", filename); - GDKfree(filenamestr); - if (len == -1 || len >= FILENAME_MAX) { + len = strconcat_len(bak, FILENAME_MAX, filename, ".bak", NULL); + if (len >= FILENAME_MAX) { GDKerror("Logger filename path is too large\n"); - return NULL; + return GDK_FAIL; } } - return filename; + return GDK_SUCCEED; } static gdk_return @@ -1560,8 +1560,7 @@ logger_cleanup(logger *lg, lng id) fprintf(stderr, "#logger_cleanup: log_id filename is too large\n"); return GDK_FAIL; } - int farmid = BBPselectfarm(PERSISTENT, 0, offheap); - if (GDKunlink(farmid, lg->dir, LOGFILE, log_id) != GDK_SUCCEED) { + if (GDKunlink(0, lg->dir, LOGFILE, log_id) != GDK_SUCCEED) { fprintf(stderr, "#logger_cleanup: failed to remove old WAL %s.%s\n", LOGFILE, log_id); GDKclrerr(); } @@ -1573,19 +1572,18 @@ logger_cleanup(logger *lg, lng id) * unless running in read-only mode * Load data and persist it in the BATs */ static gdk_return -logger_load(int debug, const char *fn, char filename[FILENAME_MAX], logger *lg) +logger_load(int debug, const char *fn, const char *logdir, logger *lg, char filename[FILENAME_MAX]) { FILE *fp = NULL; char bak[FILENAME_MAX]; bat catalog_bid, catalog_id, dcatalog; - int farmid = BBPselectfarm(PERSISTENT, 0, offheap); bool needcommit = false; int dbg = GDKdebug; int readlogs = 0; /* refactor */ if (!LOG_DISABLED(lg)) { - if (!logger_filename(lg, bak, filename)) + if (logger_filename(lg, bak, filename) != GDK_SUCCEED) goto error; } @@ -1610,11 +1608,18 @@ logger_load(int debug, const char *fn, c if ((fp = MT_fopen(bak, "r")) != NULL) { fclose(fp); fp = NULL; - if (GDKunlink(farmid, lg->dir, LOGFILE, NULL) != GDK_SUCCEED || - GDKmove(farmid, lg->dir, LOGFILE, "bak", lg->dir, LOGFILE, NULL) != GDK_SUCCEED) + if (GDKunlink(0, lg->dir, LOGFILE, NULL) != GDK_SUCCEED || + GDKmove(0, lg->dir, LOGFILE, "bak", lg->dir, LOGFILE, NULL) != GDK_SUCCEED) goto error; + } else if (errno != ENOENT) { + GDKsyserror("open %s failed", bak); + goto error; } fp = MT_fopen(filename, "r"); + if (fp == NULL && errno != ENOENT) { + GDKsyserror("open %s failed", filename); + goto error; + } } strconcat_len(bak, sizeof(bak), fn, "_catalog_bid", NULL); @@ -1715,7 +1720,8 @@ logger_load(int debug, const char *fn, c fn, fn, lg->dir); goto error; } - if (check_version(lg, fp, filename) != GDK_SUCCEED) { + if (check_version(lg, fp, fn, logdir, filename) != GDK_SUCCEED) { + fp = NULL; goto error; } readlogs = 1; @@ -1920,7 +1926,7 @@ logger_new(int debug, const char *fn, co fprintf(stderr, "#logger_new dir set to %s\n", lg->dir); } - if (logger_load(debug, fn, filename, lg) == GDK_SUCCEED) { + if (logger_load(debug, fn, logdir, lg, filename) == GDK_SUCCEED) { return lg; } return NULL; diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h --- a/gdk/gdk_logger.h +++ b/gdk/gdk_logger.h @@ -42,7 +42,7 @@ typedef int log_id; #define LOG_BATGROUP_ID 5 #define LOG_BATGROUP_END 6 -gdk_export gdk_return old_logger_load(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp); +gdk_export gdk_return old_logger_load(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void *funcdata); gdk_export logger *logger_create(int debug, const char *fn, const char *logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void *funcdata); gdk_export void logger_destroy(logger *lg); diff --git a/gdk/gdk_logger_old.c b/gdk/gdk_logger_old.c --- a/gdk/gdk_logger_old.c +++ b/gdk/gdk_logger_old.c @@ -77,6 +77,7 @@ struct logger { char *local_dir; /* the directory in which the log is written */ preversionfix_fptr prefuncp; postversionfix_fptr postfuncp; + void *funcdata; stream *log; lng end; /* end of pre-allocated blocks for faster f(data)sync */ /* Store log_bids (int) to circumvent trouble with reference counting */ @@ -138,7 +139,7 @@ struct logger { #define NAME(name,tpe,id) (name?name:"tpe id") -#define LOG_DISABLED(lg) ((lg)->debug&128) +#define LOG_DISABLED(lg) ((lg)->debug&128 || (lg)->inmemory) static gdk_return logger_exit(logger *lg); static gdk_return logger_cleanup(logger *lg); @@ -254,7 +255,7 @@ logbat_new(int tt, BUN size, role_t role if (role == PERSISTENT) BATmode(nb, false); } else { - fprintf(stderr, "!ERROR: logbat_new: creating new BAT[void:%s]#" BUNFMT " failed\n", ATOMname(tt), size); + TRC_CRITICAL(GDK, "creating new BAT[void:%s]#" BUNFMT " failed\n", ATOMname(tt), size); } return nb; } @@ -277,7 +278,7 @@ log_read_string(logger *l) assert(!l->inmemory); if (mnstr_readInt(l->log, &len) != 1) { - fprintf(stderr, "!ERROR: log_read_string: read failed\n"); + TRC_CRITICAL(GDK, "read failed\n"); //MK This leads to non-repeatable log structure? return NULL; } @@ -285,14 +286,14 @@ log_read_string(logger *l) return NULL; buf = GDKmalloc(len); if (buf == NULL) { - fprintf(stderr, "!ERROR: log_read_string: malloc failed\n"); + TRC_CRITICAL(GDK, "malloc failed\n"); /* this is bad */ return (char *) -1; } if ((nr = mnstr_read(l->log, buf, 1, len)) != (ssize_t) len) { buf[len - 1] = 0; - fprintf(stderr, "!ERROR: log_read_string: couldn't read name (%s) %zd\n", buf, nr); + TRC_CRITICAL(GDK, "couldn't read name (%s) %zd\n", buf, nr); GDKfree(buf); return NULL; } @@ -401,7 +402,7 @@ log_read_seq(logger *lg, logformat *l) assert(!lg->inmemory); assert(l->nr <= (lng) INT_MAX); if (mnstr_readLng(lg->log, &val) != 1) { - fprintf(stderr, "!ERROR: log_read_seq: read failed\n"); + TRC_CRITICAL(GDK, "read failed\n"); return LOG_EOF; } @@ -430,7 +431,7 @@ log_read_id(logger *lg, char *tpe, oid * assert(!lg->inmemory); if (mnstr_readChr(lg->log, tpe) != 1 || mnstr_readLng(lg->log, &lid) != 1) { - fprintf(stderr, "!ERROR: log_read_id: read failed\n"); + TRC_CRITICAL(GDK, "read failed\n"); return LOG_EOF; } *id = (oid)lid; @@ -508,8 +509,12 @@ log_read_updates(logger *lg, trans *tr, int ht = -1, tt = -1, tseq = 0; assert(!lg->inmemory); - if (lg->debug & 1) - fprintf(stderr, "#logger found log_read_updates %s %s " LLFMT "\n", name, l->flag == LOG_INSERT ? "insert" : "update", l->nr); + if (lg->debug & 1) { + if (name) + fprintf(stderr, "#logger found log_read_updates %s %s " LLFMT "\n", name, l->flag == LOG_INSERT ? "insert" : "update", l->nr); + else + fprintf(stderr, "#logger found log_read_updates " OIDFMT " %s " LLFMT "\n", id, l->flag == LOG_INSERT ? "insert" : "update", l->nr); + } if (b) { ht = TYPE_void; @@ -521,7 +526,7 @@ log_read_updates(logger *lg, trans *tr, for (i = 0; i < tr->nr; i++) { if (tr->changes[i].type == LOG_CREATE && - (tpe == 0 + (tpe == 0 && name != NULL ? strcmp(tr->changes[i].name, name) == 0 : tr->changes[i].tpe == tpe && tr->changes[i].cid == id)) { ht = tr->changes[i].ht; @@ -535,7 +540,7 @@ log_read_updates(logger *lg, trans *tr, } break; } else if (tr->changes[i].type == LOG_USE && - (tpe == 0 + (tpe == 0 && name != NULL _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list