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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list