Changeset: 957365bf81e3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/957365bf81e3
Modified Files:
monetdb5/mal/mal.c
monetdb5/mal/mal_client.c
monetdb5/mal/mal_private.h
sql/backends/monet5/sql_scenario.c
tools/merovingian/daemon/merovingian.h
Branch: Aug2024
Log Message:
Merge with Dec2023 branch.
diffs (truncated from 318 to 300 lines):
diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -721,9 +721,15 @@ msab_getSingleStatus(const char *pathbuf
};
/* store the database name */
- snprintf(buf, sizeof(buf), "%s/%s", pathbuf, dbname);
+ int dbnamestart;
+#ifdef _MSC_VER
+ dbnamestart = snprintf(buf, sizeof(buf), "%s/", pathbuf);
+ snprintf(buf + dbnamestart, sizeof(buf) - dbnamestart, "%s", dbname);
+#else
+ snprintf(buf, sizeof(buf), "%s/%n%s", pathbuf, &dbnamestart, dbname);
+#endif
sdb->path = strdup(buf);
- sdb->dbname = sdb->path + strlen(sdb->path) - strlen(dbname);
+ sdb->dbname = sdb->path + dbnamestart;
/* check the state of the server by looking at its gdk lock:
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -53,12 +53,6 @@ mal_version(void)
return MONETDB5_VERSION;
}
-static void
-MALprintinfo(void)
-{
- MCprintinfo();
-}
-
/*
* Initialization of the MAL context
*/
@@ -100,8 +94,6 @@ mal_init(char *modules[], bool embedded,
return -1;
initNamespace();
- GDKprintinforegister(MALprintinfo);
-
err = malBootstrap(modules, embedded, initpasswd);
if (err != MAL_SUCCEED) {
mal_client_reset();
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -616,40 +616,6 @@ MCvalid(Client tc)
}
void
-MCprintinfo(void)
-{
- int nrun = 0, nfinish = 0, nblock = 0;
-
- MT_lock_set(&mal_contextLock);
- for (Client c = mal_clients; c < mal_clients + MAL_MAXCLIENTS; c++) {
- switch (c->mode) {
- case RUNCLIENT:
- /* running */
- nrun++;
- if (c->idle)
- printf("client %d, user %s, using %"PRIu64"
bytes of transient space, idle since %s", c->idx, c->username, (uint64_t)
ATOMIC_GET(&c->qryctx.datasize), ctime(&c->idle));
- else
- printf("client %d, user %s, using %"PRIu64"
bytes of transient space\n", c->idx, c->username, (uint64_t)
ATOMIC_GET(&c->qryctx.datasize));
- break;
- case FINISHCLIENT:
- /* finishing */
- nfinish++;
- break;
- case BLOCKCLIENT:
- /* blocked */
- nblock++;
- break;
- case FREECLIENT:
- break;
- }
- }
- MT_lock_unset(&mal_contextLock);
- printf("%d active clients, %d finishing clients, %d blocked clients\n",
- nrun, nfinish, nblock);
-}
-
-
-void
MCsetClientInfo(Client c, const char *property, const char *value)
{
if (strlen(property) < 7)
diff --git a/monetdb5/mal/mal_private.h b/monetdb5/mal/mal_private.h
--- a/monetdb5/mal/mal_private.h
+++ b/monetdb5/mal/mal_private.h
@@ -81,9 +81,6 @@ void mal_runtime_reset(void)
char *dupError(const char *err)
__attribute__((__visibility__("hidden"), __returns_nonnull__));
-void MCprintinfo(void)
- __attribute__((__visibility__("hidden")));
-
void
setPoly(mel_func *f, malType tpe)
__attribute__((__visibility__("hidden")));
diff --git a/sql/backends/monet5/UDF/pyapi3/pytypes3.c
b/sql/backends/monet5/UDF/pyapi3/pytypes3.c
--- a/sql/backends/monet5/UDF/pyapi3/pytypes3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pytypes3.c
@@ -243,8 +243,10 @@ bool PyType_IsNumpyMaskedArray(PyObject
{
PyObject *type = PyObject_Type(object);
PyObject *str = PyObject_Str(type);
- bool ret = strcmp(PyUnicode_AsUTF8(str),
- "<class
'numpy.ma.core.MaskedArray'>") == 0;
+ bool ret = strcmp(PyUnicode_AsUTF8(str), /* numpy < 2.0 */
+ "<class
'numpy.ma.core.MaskedArray'>") == 0 ||
+ strcmp(PyUnicode_AsUTF8(str), /* numpy >= 2.0 */
+ "<class 'numpy.ma.MaskedArray'>") == 0;
Py_DECREF(str);
Py_DECREF(type);
return ret;
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -87,10 +87,60 @@ static MT_Lock sql_contextLock = MT_LOCK
static str SQLinit(Client c, const char *initpasswd);
static str master_password = NULL;
+#include "mal.h"
+#include "mal_client.h"
+
+static void
+CLIENTprintinfo(void)
+{
+ int nrun = 0, nfinish = 0, nblock = 0;
+ char mmbuf[64];
+ char tmbuf[64];
+ char trbuf[64];
+ struct tm tm;
+
+ MT_lock_set(&mal_contextLock);
+ for (Client c = mal_clients; c < mal_clients + MAL_MAXCLIENTS; c++) {
+ switch (c->mode) {
+ case RUNCLIENT:
+ /* running */
+ nrun++;
+ if (c->qryctx.maxmem)
+ snprintf(mmbuf, sizeof(mmbuf), " (max
%"PRIu64")", (uint64_t) c->qryctx.maxmem);
+ else
+ mmbuf[0] = 0;
+ if (c->idle) {
+ localtime_r(&c->idle, &tm);
+ strftime(tmbuf, sizeof(tmbuf), ", idle since %F
%H:%M:%S%z", &tm);
+ } else
+ tmbuf[0] = 0;
+ if (c->sqlcontext && ((backend *) c->sqlcontext)->mvc
&& ((backend *) c->sqlcontext)->mvc->session && ((backend *)
c->sqlcontext)->mvc->session->tr && ((backend *)
c->sqlcontext)->mvc->session->tr->active)
+ snprintf(trbuf, sizeof(trbuf), ", active
transaction, ts: "ULLFMT, ((backend *) c->sqlcontext)->mvc->session->tr->ts);
+ else
+ trbuf[0] = 0;
+ printf("client %d, user %s, thread %s, using %"PRIu64"
bytes of transient space%s%s%s\n", c->idx, c->username, c->mythread ?
c->mythread : "?", (uint64_t) ATOMIC_GET(&c->qryctx.datasize), mmbuf, tmbuf,
trbuf);
+ break;
+ case FINISHCLIENT:
+ /* finishing */
+ nfinish++;
+ break;
+ case BLOCKCLIENT:
+ /* blocked */
+ nblock++;
+ break;
+ case FREECLIENT:
+ break;
+ }
+ }
+ MT_lock_unset(&mal_contextLock);
+ printf("%d active clients, %d finishing clients, %d blocked clients;
max: %d\n",
+ nrun, nfinish, nblock, MAL_MAXCLIENTS);
+}
+
static void
SQLprintinfo(void)
{
- /* we need to start printing SQL info here... */
+ CLIENTprintinfo();
store_printinfo(SQLstore);
}
diff --git a/tools/merovingian/daemon/discoveryrunner.c
b/tools/merovingian/daemon/discoveryrunner.c
--- a/tools/merovingian/daemon/discoveryrunner.c
+++ b/tools/merovingian/daemon/discoveryrunner.c
@@ -189,21 +189,21 @@ getRemoteDB(const char *database)
} else {
walk = stats = malloc(sizeof(sabdb));
}
- walk->dbname = strdup(rdb->dbname);
+ *walk = (sabdb) {
+ .dbname = strdup(rdb->dbname),
+ .locked = false,
+ .state = SABdbRunning,
+ .pid = -1,
+ .scens = malloc(sizeof(sablist)),
+ .conns = malloc(sizeof(sablist)),
+ };
+ *walk->scens = (sablist) {
+ .val = strdup("sql"),
+ };
+ *walk->conns = (sablist) {
+ .val = strdup(rdb->conn),
+ };
walk->path = walk->dbname; /* only freed by sabaoth */
- walk->locked = false;
- walk->state = SABdbRunning;
- walk->pid = 0;
- walk->scens = malloc(sizeof(sablist));
- walk->scens->val = strdup("sql");
- walk->scens->next = NULL;
- walk->conns = malloc(sizeof(sablist));
- walk->conns->val = strdup(rdb->conn);
- walk->conns->next = NULL;
- walk->uri = NULL;
- walk->secret = NULL;
- walk->next = NULL;
- walk->uplog = NULL;
/* cut out first returned entry, put it down the list
* later, as to implement a round-robin DNS-like
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
@@ -236,6 +236,10 @@ forkMserver(const char *database, sabdb*
*dp = (struct _dpair) {
.dbname = strdup(database),
.fork_lock = PTHREAD_MUTEX_INITIALIZER,
+ .input[0].fd = -1,
+ .input[1].fd = -1,
+ .type = NODB,
+ .pid = -1,
};
break;
}
@@ -723,7 +727,6 @@ forkMserver(const char *database, sabdb*
(void) fcntl(pfdo[0], F_SETFD, FD_CLOEXEC);
(void) fcntl(pfde[0], F_SETFD, FD_CLOEXEC);
#endif
- pthread_mutex_unlock(&_mero_topdp_lock);
while (argv[freec] != NULL) {
free(argv[freec++]);
@@ -735,6 +738,8 @@ forkMserver(const char *database, sabdb*
* and if it hangs, we're just doomed, with the drawback that we
* completely kill the functionality of monetdbd too */
do {
+ pthread_mutex_unlock(&_mero_topdp_lock);
+
/* give the database a break */
sleep_ms(500);
@@ -756,12 +761,7 @@ forkMserver(const char *database, sabdb*
* waited for), the pid will have been set to -1, so
check
* that. */
pthread_mutex_lock(&_mero_topdp_lock);
- if (dp->pid == -1) {
- pthread_mutex_unlock(&_mero_topdp_lock);
- break;
- }
- pthread_mutex_unlock(&_mero_topdp_lock);
- } while ((*stats)->state != SABdbRunning);
+ } while (dp->pid != -1 && (*stats)->state != SABdbRunning);
/* check if the SQL scenario was loaded */
if (dp->pid != -1 && (*stats)->state == SABdbRunning &&
@@ -777,14 +777,18 @@ forkMserver(const char *database, sabdb*
if (scen == NULL) {
/* we don't know what it's doing, but we don't
like it
* any case, so kill it */
- (void) terminateProcess(dp->dbname, dp->pid,
MERODB);
+ pid_t pid = dp->pid;
+ pthread_mutex_unlock(&_mero_topdp_lock);
+ (void) terminateProcess(dp->dbname, pid,
MERODB);
msab_freeStatus(stats);
pthread_mutex_unlock(&dp->fork_lock);
return(newErr("database '%s' did not initialise
the sql "
"scenario",
database));
}
} else if (dp->pid != -1) {
- (void) terminateProcess(dp->dbname, dp->pid, MERODB);
+ pid_t pid = dp->pid;
+ pthread_mutex_unlock(&_mero_topdp_lock);
+ (void) terminateProcess(dp->dbname, pid, MERODB);
msab_freeStatus(stats);
pthread_mutex_unlock(&dp->fork_lock);
return(newErr(
@@ -796,6 +800,7 @@ forkMserver(const char *database, sabdb*
if (dp->pid == -1) {
state = (*stats)->state;
+ pthread_mutex_unlock(&_mero_topdp_lock);
pthread_mutex_unlock(&dp->fork_lock);
/* starting failed */
@@ -837,6 +842,7 @@ forkMserver(const char *database, sabdb*
}
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]