Changeset: e1d9561c8fa1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e1d9561c8fa1
Modified Files:
        gdk/gdk_bbp.c
        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
        tools/merovingian/utils/control.c
        tools/merovingian/utils/database.c
Branch: Jan2022
Log Message:

Merge with Jul2021 branch.


diffs (truncated from 344 to 300 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1385,17 +1385,20 @@ 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 &&
-                   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) /*&&
-                   (BBP_status(bid) & BBPPERSISTENT ||
-                   (b->batRole == PERSISTENT && BBP_lrefs(bid) == 1)) */) {
-                       BBP_status_on(bid, BBPUNLOADING);
-                       swap = true;
+                   (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) & BBPPERSISTENT ||
+                            (b->batRole == PERSISTENT && BBP_lrefs(bid) == 1)) 
*/) {
+                               BBP_status_on(bid, BBPUNLOADING);
+                               swap = true;
+                       }
+                       MT_lock_unset(&b->theaplock);
                }
                MT_lock_unset(&GDKswapLock(bid));
                if (swap) {
@@ -2666,12 +2669,16 @@ bbpclear(bat i, int idx, 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(idx));
+               MT_lock_set(&GDKswapLock(idx));
+       }
 
        BBP_status_set(i, BBPUNLOADING);
        BBP_refs(i) = 0;
        BBP_lrefs(i) = 0;
+       if (lock)
+               MT_lock_unset(&GDKswapLock(idx));
        if (!BBPtmpcheck(BBP_logical(i))) {
                MT_lock_set(&BBPnameLock);
                BBP_delete(i);
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
@@ -528,6 +528,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 */
                                Mfprintf(_mero_ctlerr, "error during accept: 
%s",
                                                strerror(errno));
+                               sleep_ms(500);
+                               break;
+                       case EINTR:
+                               /* interrupted */
+                               break;
+                       default:
+                               /* anything else */
+                               Mfprintf(_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) {
                Mfprintf(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);
 
@@ -114,8 +125,8 @@ terminateProcess(char *dbname, pid_t pid
                         "TERM signal\n", (long long int)pid, dbname);
        if (kill(pid, SIGTERM) < 0) {
                /* barf */
-               Mfprintf(stderr, "cannot send TERM signal to process (database 
'%s')\n",
-                                dbname);
+               Mfprintf(stderr, "cannot send TERM signal to process (database 
'%s'): %s\n",
+                                dbname, strerror(errno));
                msab_freeStatus(&stats);
                return false;
        }
@@ -337,14 +348,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
@@ -388,10 +407,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);
@@ -432,6 +454,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));
@@ -443,6 +469,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);
        }
 
@@ -685,15 +715,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");
 
                write_error = write(1, "arguments:", 10);
                for (c = 0; argv[c] != NULL; c++) {
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
@@ -251,10 +251,20 @@ void reinitialize(void)
                                mytime, (long long int)_mero_topdp->next->pid);
                fflush(_mero_logfile);
                _mero_topdp->out = _mero_topdp->err = t;
-               _mero_logfile = fdopen(t, "a");
-               Mfprintf(_mero_logfile, "%s BEG merovingian[%lld]: "
-                               "reopening logfile\n",
-                               mytime, (long long int)_mero_topdp->next->pid);
+               FILE *f = _mero_logfile;
+               if ((_mero_logfile = fdopen(t, "a")) == NULL) {
+                       /* revert to old log so that we have something */
+                       Mfprintf(f, "%s ERR merovingian[%lld]: "
+                                        "failed to reopen logfile",
+                                        mytime, (long long 
int)_mero_topdp->next->pid);
+                       _mero_topdp->out = _mero_topdp->err = fileno(f);
+                       _mero_logfile = f;
+               } else {
+                       fclose(f);
+                       Mfprintf(_mero_logfile, "%s BEG merovingian[%lld]: "
+                                        "reopening logfile\n",
+                                        mytime, (long long 
int)_mero_topdp->next->pid);
+               }
        }
 
        /* logger go ahead! */
diff --git a/tools/merovingian/daemon/merovingian.c 
b/tools/merovingian/daemon/merovingian.c
--- a/tools/merovingian/daemon/merovingian.c
+++ b/tools/merovingian/daemon/merovingian.c
@@ -517,6 +517,8 @@ main(int argc, char *argv[])
                                /* oops, forking went wrong! */
                                Mfprintf(stderr, "unable to fork into 
background: %s\n",
                                                strerror(errno));
+                               close(pfd[0]);
+                               close(pfd[1]);
                                return(1);
                        case 0:
                                /* detach client from controlling tty, we only 
write to the
@@ -549,6 +551,7 @@ main(int argc, char *argv[])
                                freeConfFile(ckv); /* make debug tools happy */
                                if (read(pfd[0], &buf, 1) != 1) {
                                        Mfprintf(stderr, "unable to retrieve 
startup status\n");
+                                       close(pfd[0]);
                                        return(1);
                                }
                                close(pfd[0]);
diff --git a/tools/merovingian/daemon/multiplex-funnel.c 
b/tools/merovingian/daemon/multiplex-funnel.c
--- a/tools/merovingian/daemon/multiplex-funnel.c
+++ b/tools/merovingian/daemon/multiplex-funnel.c
@@ -317,6 +317,8 @@ multiplexInit(const char *name, const ch
                                free(m->dbcv[i]->user);
                                free(m->dbcv[i]);
                        }
+                       fclose(m->sout);
+                       fclose(m->serr);
                        free(m->dbcv);
                        free(m->pool);
                        free(m);
@@ -331,6 +333,8 @@ multiplexInit(const char *name, const ch
                                free(m->dbcv[i]->user);
                                free(m->dbcv[i]);
                        }
+                       fclose(m->sout);
+                       fclose(m->serr);
                        free(m->dbcv);
                        free(m->pool);
                        free(m);
@@ -353,6 +357,8 @@ multiplexInit(const char *name, const ch
                        free(m->dbcv[i]->user);
                        free(m->dbcv[i]);
                }
+               fclose(m->sout);
+               fclose(m->serr);
                free(m->dbcv);
                free(m->pool);
                free(m);
@@ -367,6 +373,8 @@ multiplexInit(const char *name, const ch
                                free(m->dbcv[i]->user);
                                free(m->dbcv[i]);
                        }
+                       fclose(m->sout);
+                       fclose(m->serr);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to