Changeset: 98231866abe1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/98231866abe1 Modified Files: gdk/ChangeLog.Jan2022 gdk/gdk_logger.c gdk/gdk_posix.c sql/include/sql_catalog.h sql/storage/bat/bat_storage.c sql/storage/objectset.c sql/storage/sql_storage.h sql/storage/store.c tools/merovingian/daemon/handlers.c Branch: Jan2022 Log Message:
Merge with Jul2021 branch. diffs (131 lines): diff --git a/gdk/ChangeLog.Jan2022 b/gdk/ChangeLog.Jan2022 --- a/gdk/ChangeLog.Jan2022 +++ b/gdk/ChangeLog.Jan2022 @@ -1,6 +1,13 @@ # ChangeLog file for GDK # This file is updated with Maddlog +* Mon Feb 20 2023 Sjoerd Mullender <sjo...@acm.org> +- A race condition was fixed where certain write-ahead log messages + could get intermingled, resulting in a corrupted WAL file. +- If opening of a file failed when it was supposed to get memory mapped, + an incorrect value was returned to indicate the failure, causing + crashes later on. This has been fixed. + * Mon Feb 13 2023 Sjoerd Mullender <sjo...@acm.org> - When saving a bat failed for some reason during a low-level commit, this was logged in the log file, but the error was then subsequently diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -2430,15 +2430,18 @@ log_constant(logger *lg, int type, ptr v if (is_row) l.flag = tpe; + logger_lock(lg); if (log_write_format(lg, &l) != GDK_SUCCEED || (!is_row && !mnstr_writeLng(lg->output_log, nr)) || (!is_row && mnstr_write(lg->output_log, &tpe, 1, 1) != 1) || (!is_row && !mnstr_writeLng(lg->output_log, offset))) { + logger_unlock(lg); ok = GDK_FAIL; goto bailout; } ok = wt(val, lg->output_log, 1); + logger_unlock(lg); if (lg->debug & 1) fprintf(stderr, "#Logged %d " LLFMT " inserts\n", id, nr); @@ -2780,7 +2783,7 @@ new_logfile(logger *lg) p = (lng) getfilepos(getFile(lg->output_log)); if (p == -1) return GDK_FAIL; - if (lg->drops > 100000 || p > log_large || (lg->end*1024) > log_large) { + if (((!lg->pending || !lg->pending->next) && lg->drops > 100000) || p > log_large || (lg->end*1024) > log_large) { lg->id++; logger_close_output(lg); return logger_open_output(lg); diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c --- a/gdk/gdk_posix.c +++ b/gdk/gdk_posix.c @@ -330,7 +330,7 @@ MT_mmap(const char *path, int mode, size fd = open(path, O_CREAT | ((mode & MMAP_WRITE) ? O_RDWR : O_RDONLY) | O_CLOEXEC, MONETDB_MODE); if (fd < 0) { GDKsyserror("open %s failed\n", path); - return MAP_FAILED; + return NULL; } ret = mmap(NULL, len, @@ -341,9 +341,10 @@ MT_mmap(const char *path, int mode, size if (ret == MAP_FAILED) { GDKsyserror("mmap(%s,%zu) failed\n", path, len); ret = NULL; + } else { + VALGRIND_MALLOCLIKE_BLOCK(ret, len, 0, 1); } close(fd); - VALGRIND_MALLOCLIKE_BLOCK(ret, len, 0, 1); return ret; } diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3632,7 +3632,7 @@ sql_trans_rollback(sql_trans *tr, bool c if (!c->cleanup) { _DELETE(c); } else if (c->cleanup && !c->cleanup(store, c, oldest)) { - /* TODO change too node stealing (no allocs here) */ + /* TODO change to node stealing (no allocs here) */ store->changes = sa_list_append(tr->sa, store->changes, c); } else _DELETE(c); diff --git a/tools/merovingian/client/Tests/monetdb_snapshot.py b/tools/merovingian/client/Tests/monetdb_snapshot.py --- a/tools/merovingian/client/Tests/monetdb_snapshot.py +++ b/tools/merovingian/client/Tests/monetdb_snapshot.py @@ -2,7 +2,7 @@ import locale import os -import pipes +import shlex import re import subprocess import sys @@ -97,7 +97,7 @@ with Runner(False) as run: header('CUSTOM FILENAME') custom_name = os.path.join(m.snapdir, 'snap.tar') - qcustom_name = pipes.quote(custom_name) + qcustom_name = shlex.quote(custom_name) m.run_monetdb('snapshot', 'create', '-t', qcustom_name, 'foo1') assert os.path.exists(custom_name) note("""os.path.exists(custom_name)""") diff --git a/tools/merovingian/daemon/handlers.c b/tools/merovingian/daemon/handlers.c --- a/tools/merovingian/daemon/handlers.c +++ b/tools/merovingian/daemon/handlers.c @@ -304,7 +304,7 @@ childhandler(void) if (WIFEXITED(wstatus)) { Mfprintf(stdout, "database '%s' (%lld) has exited with " "exit status %d\n", p->dbname, - (long long int)p->pid, WEXITSTATUS(wstatus)); + (long long int)pid, WEXITSTATUS(wstatus)); } else if (WIFSIGNALED(wstatus)) { const char *sigstr = sigtostr(WTERMSIG(wstatus)); char signum[8]; @@ -315,11 +315,11 @@ childhandler(void) if (WCOREDUMP(wstatus)) { Mfprintf(stdout, "database '%s' (%lld) has crashed " "with signal %s (dumped core)\n", - p->dbname, (long long int)p->pid, sigstr); + p->dbname, (long long int)pid, sigstr); } else { Mfprintf(stdout, "database '%s' (%lld) was killed " "by signal %s\n", - p->dbname, (long long int)p->pid, sigstr); + p->dbname, (long long int)pid, sigstr); } } break; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org