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

Reply via email to