Changeset: 3e50b87e9b2e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3e50b87e9b2e Modified Files: gdk/gdk_bbp.c testing/Mtest.py.in tools/merovingian/daemon/client.c tools/merovingian/daemon/controlrunner.c tools/merovingian/daemon/forkmserver.c tools/merovingian/daemon/handlers.c tools/merovingian/daemon/merovingian.c tools/merovingian/daemon/multiplex-funnel.c tools/merovingian/daemon/proxy.c Branch: default Log Message:
Merge with Jan2022 branch. diffs (truncated from 431 to 300 lines): diff --git a/clients/ChangeLog.Jan2022 b/clients/ChangeLog.Jan2022 --- a/clients/ChangeLog.Jan2022 +++ b/clients/ChangeLog.Jan2022 @@ -1,6 +1,11 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Fri Jun 10 2022 Sjoerd Mullender <sjo...@acm.org> +- Implemented dump of global grants, that is to say, grants for COPY INTO + and COPY FROM which grant permission to users to write to or read from + files on the server (COPY INTO queries without the ON CLIENT option). + * Tue May 31 2022 Sjoerd Mullender <sjo...@acm.org> - Fixed a bug where when the semicolon at the end of a COPY INTO query that reads from STDIN is at exactly a 10240 byte boundary in a file, diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1403,16 +1403,16 @@ BBPtrim(bool aggressive) MT_lock_set(&GDKswapLock(bid)); BAT *b = NULL; bool swap = false; - if (BBP_refs(bid) == 0 && + if (!(BBP_status(bid) & flag) && + BBP_refs(bid) == 0 && BBP_lrefs(bid) != 0 && (b = BBP_cache(bid)) != NULL) { MT_lock_set(&b->theaplock); if (b->batSharecnt == 0 && !isVIEW(b) && - (!BATdirty(b) || (aggressive && b->theap->storage == STORE_MMAP && (b->tvheap == NULL || b->tvheap->storage == STORE_MMAP))) && - !(BBP_status(bid) & flag) /*&& + (!BATdirty(b) || (aggressive && b->theap->storage == STORE_MMAP && (b->tvheap == NULL || b->tvheap->storage == STORE_MMAP))) /*&& (BBP_status(bid) & BBPPERSISTENT || - (b->batRole == PERSISTENT && BBP_lrefs(bid) == 1)) */) { + (b->batRole == PERSISTENT && BBP_lrefs(bid) == 1)) */) { BBP_status_on(bid, BBPUNLOADING); swap = true; } @@ -2595,12 +2595,12 @@ bbpclear(bat i, bool lock) TRC_DEBUG(BAT_, "clear %d (%s)\n", (int) i, BBP_logical(i)); BBPuncacheit(i, true); TRC_DEBUG(BAT_, "set to unloading %d\n", i); - if (lock) + if (lock) { MT_lock_set(&GDKcacheLock); + MT_lock_set(&GDKswapLock(i)); + } BBP_status_set(i, BBPUNLOADING); - if (lock) - MT_lock_set(&GDKswapLock(i)); BBP_refs(i) = 0; BBP_lrefs(i) = 0; if (lock) diff --git a/sql/backends/monet5/Tests/All b/sql/backends/monet5/Tests/All --- a/sql/backends/monet5/Tests/All +++ b/sql/backends/monet5/Tests/All @@ -9,6 +9,7 @@ HAVE_LIBR&NOT_WIN32?rapi06 HAVE_LIBR&NOT_WIN32?rapi07 #HAVE_LIBR&NOT_WIN32?rapi08 HAVE_LIBR&NOT_WIN32?rapi09 +HAVE_LIBR&NOT_WIN32&!R_VERSION>=4.2.0?rapi09a HAVE_LIBR&NOT_WIN32?rapi10 HAVE_LIBR&NOT_WIN32?rapi12 HAVE_LIBR&NOT_WIN32?rapi13 diff --git a/sql/backends/monet5/Tests/rapi09.test b/sql/backends/monet5/Tests/rapi09.test --- a/sql/backends/monet5/Tests/rapi09.test +++ b/sql/backends/monet5/Tests/rapi09.test @@ -63,18 +63,6 @@ SELECT * FROM suicide2() statement ok ROLLBACK -statement ok -START TRANSACTION - -statement ok -CREATE FUNCTION suicide3() RETURNS TABLE (i integer) LANGUAGE R {.Internal(quit("no", 0,F))} - -statement error -SELECT * FROM suicide3() - -statement ok -ROLLBACK - query I rowsort SELECT 1 ---- diff --git a/sql/backends/monet5/Tests/rapi09a.test b/sql/backends/monet5/Tests/rapi09a.test new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/rapi09a.test @@ -0,0 +1,17 @@ +statement ok +START TRANSACTION + +statement ok +CREATE FUNCTION suicide3() RETURNS TABLE (i integer) LANGUAGE R {.Internal(quit("no", 0,F))} + +statement error +SELECT * FROM suicide3() + +statement ok +ROLLBACK + +query I rowsort +SELECT 1 +---- +1 + diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in --- a/testing/Mtest.py.in +++ b/testing/Mtest.py.in @@ -2042,6 +2042,25 @@ def RunTest(env, TST, COND, oktests, len break if reason is not None: break + elif cond.startswith('R_VERSION>='): + rversion = os.path.join('@LIBR_INCLUDE_DIRS@', 'Rversion.h') + if os.path.exists(rversion): + with openutf8(rversion, 'r') as f: + res = re.search('#define R_VERSION (?P<rversion>\d+)', f.read()) + if res is not None: + r_version = res.group('rversion') + req_version = cond[11:].split('.') + req_version = int(req_version[0]) * 65536 + int(req_version[1]) * 256 + int(req_version[2]) + if not negate: + if int(r_version) < req_version: + reason = "R version too low" + elem = SkipTest(env, TST, EXT, reason, length) + break + else: + if int(r_version) >= req_version: + reason = "R version too high" + elem = SkipTest(env, TST, EXT, reason, length) + break elif cond not in CONDITIONALS: reason = "as conditional '%s' is unknown." % cond elem = SkipTest(env, TST, EXT, reason, length) diff --git a/tools/merovingian/daemon/client.c b/tools/merovingian/daemon/client.c --- a/tools/merovingian/daemon/client.c +++ b/tools/merovingian/daemon/client.c @@ -526,6 +526,7 @@ acceptConnections(int socks[3]) case ENOBUFS: case ENOMEM: /* transient failures */ + sleep_ms(500); /* wait a little, maybe it goes away */ break; case ECONNABORTED: /* connection aborted before we began */ diff --git a/tools/merovingian/daemon/controlrunner.c b/tools/merovingian/daemon/controlrunner.c --- a/tools/merovingian/daemon/controlrunner.c +++ b/tools/merovingian/daemon/controlrunner.c @@ -1215,9 +1215,24 @@ controlRunner(void *d) free(p); if (_mero_keep_listening == 0) break; - if (errno != EINTR) { + switch (errno) { + case EMFILE: + case ENFILE: + case ENOBUFS: + case ENOMEM: + /* transient failure, wait a little and continue */ Mlevelfprintf(ERROR, _mero_ctlerr, "error during accept: %s", strerror(errno)); + sleep_ms(500); + break; + case EINTR: + /* interrupted */ + break; + default: + /* anything else */ + Mlevelfprintf(ERROR, _mero_ctlerr, "error during accept: %s", + strerror(errno)); + break; } continue; } diff --git a/tools/merovingian/daemon/forkmserver.c b/tools/merovingian/daemon/forkmserver.c --- a/tools/merovingian/daemon/forkmserver.c +++ b/tools/merovingian/daemon/forkmserver.c @@ -57,6 +57,12 @@ terminateProcess(char *dbname, pid_t pid return false; } + if (pid == -1) { + /* it's already dead */ + msab_freeStatus(&stats); + return true; + } + if (stats->pid != pid) { Mlevelfprintf(ERROR, stderr, "strange, trying to kill process %lld to stop database '%s' " @@ -65,8 +71,13 @@ terminateProcess(char *dbname, pid_t pid dbname, (long long int)pid ); - msab_freeStatus(&stats); - return false; + if (stats->pid >= 1 && pid < 1) { + /* assume the server was started by a previous merovingian */ + pid = stats->pid; + } else { + msab_freeStatus(&stats); + return false; + } } assert(stats->pid == pid); @@ -113,8 +124,8 @@ terminateProcess(char *dbname, pid_t pid "TERM signal\n", (long long int)pid, dbname); if (kill(pid, SIGTERM) < 0) { /* barf */ - Mlevelfprintf(ERROR, stderr, "cannot send TERM signal to process (database '%s')\n", - dbname); + Mlevelfprintf(ERROR, stderr, "cannot send TERM signal to process (database '%s'): %s\n", + dbname, strerror(errno)); msab_freeStatus(&stats); return false; } @@ -328,14 +339,22 @@ forkMserver(const char *database, sabdb* break; default: /* this also includes SABdbStarting, which we shouldn't ever - * see due to the global starting lock */ + * see due to the global starting lock + * + * if SABdbStarting: a process (presumably mserver5) has locked + * the database (i.e. the .gdk_lock file), but the server is not + * ready to accept connections (i.e. there is no .started + * file) */ state = (*stats)->state; msab_freeStatus(stats); freeConfFile(ckv); free(ckv); pthread_mutex_unlock(&dp->fork_lock); - return(newErr("unknown or impossible state: %d", - (int)state)); + if (state == SABdbStarting) + return(newErr("unexpected state: database is locked but not yet started")); + else + return(newErr("unknown or impossible state: %d", + (int)state)); } /* create the pipes (filedescriptors) now, such that we and the @@ -379,10 +398,13 @@ forkMserver(const char *database, sabdb* freeConfFile(ckv); free(ckv); pthread_mutex_unlock(&dp->fork_lock); + close(pfdo[1]); + close(pfde[1]); return newErr("Failed to open file descriptor\n"); } if (!(f2 = fdopen(pfde[1], "a"))) { fclose(f1); + close(pfde[1]); msab_freeStatus(stats); freeConfFile(ckv); free(ckv); @@ -423,6 +445,10 @@ forkMserver(const char *database, sabdb* freeConfFile(ckv); free(ckv); pthread_mutex_unlock(&dp->fork_lock); + close(pfdo[0]); + close(pfdo[1]); + close(pfde[0]); + close(pfde[1]); return(newErr("cannot start database '%s': no .vaultkey found " "(did you create the database with `monetdb create %s`?)", database, database)); @@ -434,6 +460,10 @@ forkMserver(const char *database, sabdb* freeConfFile(ckv); free(ckv); pthread_mutex_unlock(&dp->fork_lock); + close(pfdo[0]); + close(pfdo[1]); + close(pfde[0]); + close(pfde[1]); return(er); } @@ -638,15 +668,15 @@ forkMserver(const char *database, sabdb* int dup_err; close(pfdo[0]); dup_err = dup2(pfdo[1], 1); + if (dup_err == -1) + perror("dup2"); close(pfdo[1]); close(pfde[0]); + dup_err = dup2(pfde[1], 2); if (dup_err == -1) perror("dup2"); - dup_err = dup2(pfde[1], 2); close(pfde[1]); - if (dup_err == -1) - perror("dup2"); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org