Changeset: 2e917211713a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2e917211713a
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger_internals.h
        gdk/gdk_logger_old.c
        sql/storage/bat/bat_logger.c
Branch: sqlfuncfix
Log Message:

Fix some upgrade issues.


diffs (199 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -774,34 +774,36 @@ la_bat_create(logger *lg, logaction *la)
 }
 
 static gdk_return
-logger_write_new_types(logger *lg, FILE *fp)
+logger_write_new_types(logger *lg, FILE *fp, bool append)
 {
        bte id = 0;
 
        /* write types and insert into bats */
        /* first the fixed sized types */
-       for (int i=0;i<GDKatomcnt; i++) {
+       for (int i = 0; i < GDKatomcnt; i++) {
                if (ATOMvarsized(i))
                        continue;
-               if (BUNappend(lg->type_id, &id, false) != GDK_SUCCEED ||
-                   BUNappend(lg->type_nme, BATatoms[i].name, false) != 
GDK_SUCCEED ||
-                   BUNappend(lg->type_nr, &i, false) != GDK_SUCCEED ||
-                   fprintf(fp, "%d,%s\n", id, BATatoms[i].name) < 0) {
+               if (append &&
+                   (BUNappend(lg->type_id, &id, false) != GDK_SUCCEED ||
+                    BUNappend(lg->type_nme, BATatoms[i].name, false) != 
GDK_SUCCEED ||
+                    BUNappend(lg->type_nr, &i, false) != GDK_SUCCEED))
                        return GDK_FAIL;
-               }
+               if (fprintf(fp, "%d,%s\n", id, BATatoms[i].name) < 0)
+                       return GDK_FAIL;
                id++;
        }
        /* second the var sized types */
-       id=-127; /* start after nil */
-       for (int i=0;i<GDKatomcnt; i++) {
+       id = -127; /* start after nil */
+       for (int i = 0; i < GDKatomcnt; i++) {
                if (!ATOMvarsized(i))
                        continue;
-               if (BUNappend(lg->type_id, &id, false) != GDK_SUCCEED ||
-                   BUNappend(lg->type_nme, BATatoms[i].name, false) != 
GDK_SUCCEED ||
-                   BUNappend(lg->type_nr, &i, false) != GDK_SUCCEED ||
-                   fprintf(fp, "%d,%s\n", id, BATatoms[i].name) < 0) {
+               if (append &&
+                   (BUNappend(lg->type_id, &id, false) != GDK_SUCCEED ||
+                    BUNappend(lg->type_nme, BATatoms[i].name, false) != 
GDK_SUCCEED ||
+                    BUNappend(lg->type_nr, &i, false) != GDK_SUCCEED))
                        return GDK_FAIL;
-               }
+               if (fprintf(fp, "%d,%s\n", id, BATatoms[i].name) < 0)
+                       return GDK_FAIL;
                id++;
        }
        return GDK_SUCCEED;
@@ -957,7 +959,7 @@ logger_read_types_file(logger *lg, FILE 
 
 
 gdk_return
-logger_create_types_file(logger *lg, const char *filename)
+logger_create_types_file(logger *lg, const char *filename, bool append)
 {
        FILE *fp;
 
@@ -972,7 +974,7 @@ logger_create_types_file(logger *lg, con
                return GDK_FAIL;
        }
 
-       if (logger_write_new_types(lg, fp) != GDK_SUCCEED) {
+       if (logger_write_new_types(lg, fp, append) != GDK_SUCCEED) {
                fclose(fp);
                MT_remove(filename);
                GDKerror("writing log file %s failed", filename);
@@ -1306,7 +1308,7 @@ logger_commit(logger *lg)
 }
 
 static gdk_return
-check_version(logger *lg, FILE *fp, const char *fn, const char *logdir, const 
char *filename)
+check_version(logger *lg, FILE *fp, const char *fn, const char *logdir, const 
char *filename, bool *needsnew)
 {
        int version = 0;
 
@@ -1335,6 +1337,7 @@ check_version(logger *lg, FILE *fp, cons
                                 version < lg->version ? "Maybe you need to 
upgrade to an intermediate release first.\n" : "");
                        return GDK_FAIL;
                }
+               *needsnew = false; /* already written a new log file */
                return GDK_SUCCEED;
        } else if (version != lg->version) {
                if (lg->prefuncp == NULL ||
@@ -1346,11 +1349,13 @@ check_version(logger *lg, FILE *fp, cons
                        fclose(fp);
                        return GDK_FAIL;
                }
+               *needsnew = true;       /* we need to write a new log file */
        } else {
-               lg->postfuncp = NULL;    /* don't call */
+               lg->postfuncp = NULL;   /* don't call */
+               *needsnew = false;      /* log file already up-to-date */
        }
-       if (fgetc(fp) != '\n' ||         /* skip \n */
-           fgetc(fp) != '\n') {         /* skip \n */
+       if (fgetc(fp) != '\n' ||        /* skip \n */
+           fgetc(fp) != '\n') {        /* skip \n */
                GDKerror("Badly formatted log file");
                fclose(fp);
                return GDK_FAIL;
@@ -1771,6 +1776,7 @@ logger_load(int debug, const char *fn, c
        bool needcommit = false;
        int dbg = GDKdebug;
        bool readlogs = false;
+       bool needsnew = false;  /* need to write new log file? */
 
        /* refactor */
        if (!LOG_DISABLED(lg)) {
@@ -1873,7 +1879,7 @@ logger_load(int debug, const char *fn, c
                                GDKerror("cannot create directory for log file 
%s\n", filename);
                                goto error;
                        }
-                       if (logger_create_types_file(lg, filename) != 
GDK_SUCCEED)
+                       if (logger_create_types_file(lg, filename, true) != 
GDK_SUCCEED)
                                goto error;
                }
 
@@ -1905,7 +1911,7 @@ logger_load(int debug, const char *fn, c
                }
                if (fp != NULL) {
                        /* check_version always closes fp */
-                       if (check_version(lg, fp, fn, logdir, filename) != 
GDK_SUCCEED) {
+                       if (check_version(lg, fp, fn, logdir, filename, 
&needsnew) != GDK_SUCCEED) {
                                fp = NULL;
                                goto error;
                        }
@@ -2019,6 +2025,16 @@ logger_load(int debug, const char *fn, c
                }
                if (lg->postfuncp && (*lg->postfuncp)(lg->funcdata, lg) != 
GDK_SUCCEED)
                        goto error;
+               if (needsnew) {
+                       if (GDKmove(0, lg->dir, LOGFILE, NULL, lg->dir, 
LOGFILE, "bak", true) != GDK_SUCCEED) {
+                               TRC_CRITICAL(GDK, "couldn't move log to 
log.bak\n");
+                               return GDK_FAIL;
+                       }
+                       if (logger_create_types_file(lg, filename, false) != 
GDK_SUCCEED) {
+                               TRC_CRITICAL(GDK, "couldn't write new log\n");
+                               return GDK_FAIL;
+                       }
+               }
                dbg = GDKdebug;
                GDKdebug &= ~(CHECKMASK|PROPMASK);
                if (logger_commit(lg) != GDK_SUCCEED) {
@@ -2027,6 +2043,11 @@ logger_load(int debug, const char *fn, c
                GDKdebug = dbg;
                for( ; log_id <= lg->saved_id; log_id++)
                        (void)logger_cleanup(lg, log_id);  /* ignore error of 
removing file */
+               if (needsnew &&
+                   GDKunlink(0, lg->dir, LOGFILE, "bak") != GDK_SUCCEED) {
+                       TRC_CRITICAL(GDK, "couldn't remove old log.bak file\n");
+                       return GDK_FAIL;
+               }
        } else {
                lg->id = lg->saved_id+1;
        }
diff --git a/gdk/gdk_logger_internals.h b/gdk/gdk_logger_internals.h
--- a/gdk/gdk_logger_internals.h
+++ b/gdk/gdk_logger_internals.h
@@ -96,6 +96,6 @@ struct old_logger {
        BAT *del;               /* bat ids of bats being deleted by upgrade */
 };
 
-gdk_return logger_create_types_file(logger *lg, const char *filename);
+gdk_return logger_create_types_file(logger *lg, const char *filename, bool 
append);
 
 #endif /* _LOGGER_INTERNALS_H_ */
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
@@ -1764,7 +1764,7 @@ old_logger_destroy(old_logger *lg)
                GDKfree(subcommit);
                return rc;
        }
-       if ((rc = logger_create_types_file(lg->lg, lg->filename)) != 
GDK_SUCCEED) {
+       if ((rc = logger_create_types_file(lg->lg, lg->filename, true)) != 
GDK_SUCCEED) {
                TRC_CRITICAL(GDK, "logger_destroy failed\n");
                GDKfree(subcommit);
                return rc;
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -2701,9 +2701,10 @@ bl_postversion(void *Store, void *Lg)
                                if ((rc = BUNappend(lg->catalog_id, 
&(int){2021}, false)) == GDK_SUCCEED &&
                                        (rc = BUNappend(lg->catalog_bid, 
&b2->batCacheid, false)) == GDK_SUCCEED &&
                                        (rc = BUNappend(lg->catalog_lid, 
&lng_nil, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_cnt, 
&(lng){0}, false)) == GDK_SUCCEED) {
+                                       (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(b2)}, false)) == GDK_SUCCEED) {
                                        BBPretain(b2->batCacheid);
                                }
+                               lg->cnt++;
                        }
                }
                bat_destroy(b2);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to