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 -- [email protected]
To unsubscribe send an email to [email protected]