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

Reply via email to