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