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