Changeset: ef251ffa8457 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef251ffa8457 Added Files: sql/backends/monet5/Tests/dbextra_lock_test.py sql/backends/monet5/Tests/dbextra_lock_test.stable.err sql/backends/monet5/Tests/dbextra_lock_test.stable.out sql/test/BugTracker-2016/Tests/storagemodel.stable.out.Darwin sql/test/BugTracker-2016/Tests/storagemodel.stable.out.FreeBSD sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.sql sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.err sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.out sql/test/BugTracker-2017/Tests/crash_correlated_subqueries_not_in_select.Bug-6290.sql sql/test/BugTracker-2017/Tests/crash_correlated_subqueries_not_in_select.Bug-6290.stable.err sql/test/BugTracker-2017/Tests/crash_correlated_subqueries_not_in_select.Bug-6290.stable.out sql/test/BugTracker-2017/Tests/crash_function_returning_sample.Bug-6291.sql sql/test/BugTracker-2017/Tests/crash_function_returning_sample.Bug-6291.stable.err sql/test/BugTracker-2017/Tests/crash_function_returning_sample.Bug-6291.stable.out sql/test/BugTracker-2017/Tests/distinct_minus_count_distinct.Bug-6296.sql sql/test/BugTracker-2017/Tests/distinct_minus_count_distinct.Bug-6296.stable.err sql/test/BugTracker-2017/Tests/distinct_minus_count_distinct.Bug-6296.stable.out sql/test/BugTracker-2017/Tests/nestedoperators.Bug-6292.stable.err sql/test/BugTracker-2017/Tests/nestedoperators.Bug-6292.stable.out sql/test/BugTracker-2017/Tests/not_plus.Bug-6294.sql sql/test/BugTracker-2017/Tests/not_plus.Bug-6294.stable.err sql/test/BugTracker-2017/Tests/not_plus.Bug-6294.stable.out sql/test/orderidx/Tests/simpletable.stable.out.32bit.Windows sql/test/orderidx/Tests/smalltable.stable.out.32bit.Windows Modified Files: clients/Tests/exports.stable.out clients/mapiclient/dump.c clients/mapiclient/mclient.c common/stream/stream.c common/stream/stream.h gdk/gdk_atoms.c gdk/gdk_logger.c gdk/gdk_posix.c gdk/gdk_private.h gdk/gdk_utils.c sql/backends/monet5/sql.c sql/backends/monet5/sql_upgrades.c sql/scripts/25_debug.sql sql/scripts/51_sys_schema_extension.sql sql/test/BugTracker-2016/Tests/storagemodel.sql sql/test/BugTracker-2016/Tests/storagemodel.stable.out sql/test/BugTracker-2016/Tests/storagemodel.stable.out.Windows sql/test/BugTracker-2017/Tests/All sql/test/BugTracker-2017/Tests/nestedoperators.Bug-6292.sql sql/test/Tests/systemfunctions.stable.out sql/test/Tests/systemfunctions.stable.out.int128 sql/test/emptydb-upgrade-chain-hge/Tests/check.stable.out.int128 sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/check.stable.out sql/test/emptydb-upgrade-chain/Tests/check.stable.out.32bit sql/test/emptydb-upgrade-chain/Tests/check.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-hge/Tests/check.stable.out.int128 sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade/Tests/check.stable.out sql/test/emptydb-upgrade/Tests/check.stable.out.32bit sql/test/emptydb-upgrade/Tests/check.stable.out.int128 sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128 sql/test/emptydb/Tests/check.SQL.py sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.sql sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.sql sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.stable.out sql/test/sys-schema/Tests/check_PrimaryKey_uniqueness.sql sql/test/sys-schema/Tests/check_PrimaryKey_uniqueness.stable.out sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 testing/process.py tools/merovingian/ChangeLog.Jul2017 tools/merovingian/daemon/forkmserver.c Branch: default Log Message:
Merge with Jul2017 branch. diffs (truncated from 49796 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 @@ -2618,6 +2618,7 @@ stream *file_rstream(FILE *fp, const cha stream *file_wastream(FILE *fp, const char *name); stream *file_wstream(FILE *fp, const char *name); FILE *getFile(stream *s); +int getFileNo(stream *s); size_t getFileSize(stream *s); stream *iconv_rstream(stream *ss, const char *charset, const char *name); stream *iconv_wstream(stream *ss, const char *charset, const char *name); diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -1231,7 +1231,7 @@ dump_functions(Mapi mid, stream *toConso "s.id = f.schema_id " "%s%s" "%s%s%s%s%s%s" - "ORDER BY f.id"; + "ORDER BY f.func"; MapiHdl hdl; char *q; size_t l; diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -2208,7 +2208,7 @@ doFile(Mapi mid, stream *fp, int useinse #endif (void) save_history; /* not used if no readline */ - if (getFile(fp) && isatty(fileno(getFile(fp))) + if (isatty(getFileNo(fp)) /* fails if not a FILE* */ #ifdef WIN32 /* isatty may not give expected result */ && formatter != TESTformatter #endif diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -129,6 +129,7 @@ #ifdef NATIVE_WIN32 #define pclose _pclose +#define fileno(fd) _fileno(fd) #endif #define UTF8BOM "\xEF\xBB\xBF" /* UTF-8 encoding of Unicode BOM */ @@ -821,7 +822,7 @@ file_fsync(stream *s) if (fp == NULL || (s->access == ST_WRITE #ifdef NATIVE_WIN32 - && _commit(_fileno(fp)) < 0 + && _commit(fileno(fp)) < 0 #else #ifdef HAVE_FDATASYNC && fdatasync(fileno(fp)) < 0 @@ -877,10 +878,6 @@ file_fsetpos(stream *s, lng p) return res; } -#ifdef NATIVE_WIN32 -#define fileno(fd) _fileno(fd) -#endif - size_t getFileSize(stream *s) { @@ -2978,7 +2975,7 @@ file_rastream(FILE *fp, const char *name } } #ifdef _MSC_VER - if (_fileno(fp) == 0 && _isatty(0)) { + if (fileno(fp) == 0 && isatty(0)) { struct console *c = malloc(sizeof(struct console)); s->stream_data.p = c; c->h = GetStdHandle(STD_INPUT_HANDLE); @@ -3015,7 +3012,7 @@ file_wastream(FILE *fp, const char *name s->access = ST_WRITE; s->type = ST_ASCII; #ifdef _MSC_VER - if ((_fileno(fp) == 1 || _fileno(fp) == 2) && _isatty(_fileno(fp))) { + if ((fileno(fp) == 1 || fileno(fp) == 2) && isatty(fileno(fp))) { struct console *c = malloc(sizeof(struct console)); s->stream_data.p = c; c->h = GetStdHandle(STD_OUTPUT_HANDLE); @@ -5393,6 +5390,17 @@ getFile(stream *s) return (FILE *) s->stream_data.p; } +int +getFileNo(stream *s) +{ + FILE *f; + + f = getFile(s); + if (f == NULL) + return -1; + return fileno(f); +} + static ssize_t stream_blackhole_write(stream *s, const void *buf, size_t elmsize, size_t cnt) { diff --git a/common/stream/stream.h b/common/stream/stream.h --- a/common/stream/stream.h +++ b/common/stream/stream.h @@ -189,6 +189,7 @@ stream_export stream *file_rastream(FILE stream_export stream *file_wastream(FILE *fp, const char *name); stream_export FILE *getFile(stream *s); +stream_export int getFileNo(stream *s); /* fileno(getFile(s)) */ stream_export size_t getFileSize(stream *s); stream_export stream *iconv_rstream(stream *ss, const char *charset, const char *name); diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -1131,7 +1131,13 @@ strCleanHash(Heap *h, int rebuild) } #endif /* only set dirty flag if the hash table actually changed */ - h->dirty |= memcmp(oldhash, h->base, sizeof(oldhash)) != 0; + if (!h->dirty && + memcmp(oldhash, h->base, sizeof(oldhash)) != 0) { + if (h->storage == STORE_MMAP) + (void) MT_msync(h->base, GDK_STRHASHSIZE); + else + h->dirty = 1; + } } /* diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -950,7 +950,7 @@ logger_readlog(logger *lg, char *filenam GDKdebug = dbg; return GDK_SUCCEED; } - if (fstat(fileno(getFile(lg->log)), &sb) < 0) { + if (fstat(getFileNo(lg->log), &sb) < 0) { fprintf(stderr, "!ERROR: logger_readlog: fstat on opened file %s failed\n", filename); mnstr_destroy(lg->log); lg->log = NULL; @@ -2557,7 +2557,7 @@ pre_allocate(logger *lg) if (p + DBLKSZ > lg->end) { p &= ~(DBLKSZ - 1); p += SEGSZ; - if (GDKextendf(fileno(getFile(lg->log)), (size_t) p, "WAL file") != GDK_SUCCEED) + if (GDKextendf(getFileNo(lg->log), (size_t) p, "WAL file") != GDK_SUCCEED) return GDK_FAIL; lg->end = p; } diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c --- a/gdk/gdk_posix.c +++ b/gdk/gdk_posix.c @@ -891,15 +891,6 @@ MT_msync(void *p, size_t len) return 0; } -#ifndef _HEAPOK /* MinGW */ -#define _HEAPEMPTY (-1) -#define _HEAPOK (-2) -#define _HEAPBADBEGIN (-3) -#define _HEAPBADNODE (-4) -#define _HEAPEND (-5) -#define _HEAPBADPTR (-6) -#endif - int MT_path_absolute(const char *pathname) { diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -130,8 +130,8 @@ void BBPdump(void); /* never called: fo __attribute__((__visibility__("hidden"))); __hidden char *GDKload(int farmid, const char *nme, const char *ext, size_t size, size_t *maxsize, storage_t mode) __attribute__((__visibility__("hidden"))); -__hidden void GDKlog(_In_z_ _Printf_format_string_ const char *format, ...) - __attribute__((__format__(__printf__, 1, 2))) +__hidden void GDKlog(_In_z_ _Printf_format_string_ FILE * fl, const char *format, ...) + __attribute__((__format__(__printf__, 2, 3))) __attribute__((__visibility__("hidden"))); __hidden gdk_return GDKmove(int farmid, const char *dir1, const char *nme1, const char *ext1, const char *dir2, const char *nme2, const char *ext2) __attribute__ ((__warn_unused_result__)) @@ -267,6 +267,7 @@ typedef char long_str[IDLENGTH]; /* stan extern struct BBPfarm_t { unsigned int roles; /* bitmask of allowed roles */ const char *dirname; /* farm directory */ + FILE *lock_file; } BBPfarms[MAXFARMS]; extern int BBP_dirty; /* BBP table dirty? */ diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -50,7 +50,7 @@ static char THRprintbuf[BUFSIZ]; #endif static volatile ATOMIC_FLAG GDKstopped = ATOMIC_FLAG_INIT; -static void GDKunlockHome(void); +static void GDKunlockHome(int farmid); #undef malloc #undef calloc @@ -164,7 +164,7 @@ GDKsetenv(const char *name, const char * */ #define GDKLOCK ".gdk_lock" -static FILE *GDKlockFile = 0; +#define GET_GDKLOCK(x) BBPfarms[BBPselectfarm((x), 0, offheap)].lock_file #define GDKLOGOFF "LOGOFF" #define GDKFOUNDDEAD "FOUND DEAD" @@ -176,7 +176,7 @@ static FILE *GDKlockFile = 0; * process, thread and user ID, and the current time. */ void -GDKlog(const char *format, ...) +GDKlog(FILE *lockFile, const char *format, ...) { va_list ap; char *p = 0, buf[1024]; @@ -186,7 +186,7 @@ GDKlog(const char *format, ...) #endif char *ctm; - if (MT_pagesize() == 0 || GDKlockFile == NULL) + if (MT_pagesize() == 0 || lockFile == NULL) return; va_start(ap, format); @@ -199,7 +199,7 @@ GDKlog(const char *format, ...) for (p = buf; (p = strchr(p, '@')) != NULL; *p = ' ') ; - fseek(GDKlockFile, 0, SEEK_END); + fseek(lockFile, 0, SEEK_END); #ifndef HAVE_GETUID #define getuid() 0 #endif @@ -212,8 +212,8 @@ GDKlog(const char *format, ...) ctm = ctime(&tm); #endif #endif - fprintf(GDKlockFile, "USR=%d PID=%d TIME=%.24s @ %s\n", (int) getuid(), (int) getpid(), ctm, buf); - fflush(GDKlockFile); + fprintf(lockFile, "USR=%d PID=%d TIME=%.24s @ %s\n", (int) getuid(), (int) getpid(), ctm, buf); + fflush(lockFile); } /* @@ -424,7 +424,7 @@ MT_init(void) #define CATNAP 50 /* time to sleep in ms for catnaps */ static void THRinit(void); -static void GDKlockHome(void); +static void GDKlockHome(int farmid); #ifndef NDEBUG static MT_Lock mallocsuccesslock MT_LOCK_INITIALIZER("mallocsuccesslock"); @@ -437,6 +437,7 @@ GDKinit(opt *set, int setlen) char *p; opt *n; int i, nlen = 0; + int persistent_farmid, transient_farmid; char buf[16]; /* some sanity checks (should also find if symbols are not defined) */ @@ -496,7 +497,16 @@ GDKinit(opt *set, int setlen) #endif #endif /* now try to lock the database */ - GDKlockHome(); + /* type and hptype are unused for now */ + persistent_farmid = BBPselectfarm(PERSISTENT, 0, 0); + GDKlockHome(persistent_farmid); + transient_farmid = BBPselectfarm(TRANSIENT, 0, 0); + if (persistent_farmid != transient_farmid) { + /* Only lock the transient farm if it is different than the + * persistent one. + */ + GDKlockHome(transient_farmid); + } /* Mserver by default takes 80% of all memory as a default */ GDK_mem_maxsize = (size_t) ((double) MT_npages() * (double) MT_pagesize() * 0.815); @@ -679,6 +689,7 @@ GDKreset(int status, int exit) MT_Id pid = MT_getpid(); Thread t, s; struct serverthread *st; + int persistent_farmid, transient_farmid; if( GDKkey){ BBPunfix(GDKkey->batCacheid); @@ -726,8 +737,14 @@ GDKreset(int status, int exit) /* we can't clean up after killing threads */ BBPexit(); } - GDKlog(GDKLOGOFF); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list