Changeset: 38ab253c7fab for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/38ab253c7fab
Modified Files:
monetdb5/mal/mal_client.c
monetdb5/mal/mal_runtime.c
monetdb5/optimizer/opt_mitosis.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_user.c
sql/common/sql_backend.c
sql/common/sql_backend.h
sql/server/sql_scan.c
Branch: Mar2025
Log Message:
Clean up setting the "idle" property in the client record.
A client is now only deemed idle while it is reading from the client
connection.
diffs (truncated from 608 to 300 lines):
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
@@ -256,7 +256,8 @@ MCinitClientRecord(Client c, oid user, b
c->usermodule = c->curmodule = 0;
c->father = NULL;
- c->idle = c->login = c->lastcmd = time(0);
+ c->idle = 0;
+ c->login = c->lastcmd = time(0);
c->session = GDKusec();
strcpy_len(c->optimizer, "default_pipe", sizeof(c->optimizer));
c->workerlimit = 0;
diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c
--- a/monetdb5/mal/mal_runtime.c
+++ b/monetdb5/mal/mal_runtime.c
@@ -267,9 +267,6 @@ runtimeProfileInit(Client cntxt, MalBlkP
}
}
MT_lock_unset(&mal_delayLock);
- MT_lock_set(&mal_contextLock);
- cntxt->idle = 0;
- MT_lock_unset(&mal_contextLock);
}
/*
@@ -306,9 +303,6 @@ runtimeProfileFinish(Client cntxt, MalBl
QRYqueue[i].finished,
QRYqueue[i].query);
// assume that the user is now idle
MT_lock_unset(&mal_delayLock);
- MT_lock_set(&mal_contextLock);
- cntxt->idle = time(0);
- MT_lock_unset(&mal_contextLock);
found = true;
break;
}
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -162,9 +162,6 @@ OPTmitosisImplementation(Client cntxt, M
* Take into account the number of client connections,
* because all user together are responsible for resource contentions
*/
- MT_lock_set(&mal_contextLock);
- cntxt->idle = 0; // this one is definitely not
idle
- MT_lock_unset(&mal_contextLock);
/* improve memory usage estimation */
if (nr_cols > 1 || nr_aggrs > 1 || nr_maps > 1)
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -271,7 +271,6 @@ SQLrun(Client c, mvc *m)
if((msg = SQLsetTrace(c,mb)) == MAL_SUCCEED) {
setVariableScope(mb);
MT_lock_set(&mal_contextLock);
- c->idle = 0;
c->lastcmd = time(0);
MT_lock_unset(&mal_contextLock);
msg = runMAL(c, mb, 0, 0);
@@ -280,7 +279,6 @@ SQLrun(Client c, mvc *m)
} else {
setVariableScope(mb);
MT_lock_set(&mal_contextLock);
- c->idle = 0;
c->lastcmd = time(0);
MT_lock_unset(&mal_contextLock);
msg = runMAL(c, mb, 0, 0);
@@ -289,7 +287,6 @@ SQLrun(Client c, mvc *m)
}
/* after the query has been finished we enter the idle state */
MT_lock_set(&mal_contextLock);
- c->idle = time(0);
c->lastcmd = 0;
MT_lock_unset(&mal_contextLock);
MT_thread_setworking(NULL);
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
@@ -1100,6 +1100,7 @@ SQLreader(Client c, backend *be)
MT_lock_unset(&mal_contextLock);
return MAL_SUCCEED;
}
+ c->idle = time(0);
MT_lock_unset(&mal_contextLock);
language = be->language; /* 'S', 's' or 'X' */
m = be->mvc;
@@ -1125,11 +1126,6 @@ SQLreader(Client c, backend *be)
break;
commit_done = true;
}
- if (m->session->tr && m->session->tr->active) {
- MT_lock_set(&mal_contextLock);
- c->idle = 0;
- MT_lock_unset(&mal_contextLock);
- }
if (go && in->pos >= in->len) {
ssize_t rd;
@@ -1151,12 +1147,6 @@ SQLreader(Client c, backend *be)
if (msg)
break;
commit_done = true;
- MT_lock_set(&mal_contextLock);
- if (c->idle == 0 && (m->session->tr ==
NULL || !m->session->tr->active)) {
- /* now the session is idle */
- c->idle = time(0);
- }
- MT_lock_unset(&mal_contextLock);
}
if (go && ((!blocked && mnstr_write(c->fdout,
c->prompt, c->promptlength, 1) != 1) || mnstr_flush(c->fdout,
MNSTR_FLUSH_DATA))) {
@@ -1202,6 +1192,9 @@ SQLreader(Client c, backend *be)
MT_lock_unset(&mal_contextLock);
return msg;
}
+ MT_lock_set(&mal_contextLock);
+ c->idle = 0;
+ MT_lock_unset(&mal_contextLock);
return msg;
}
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -698,6 +698,15 @@ monet5_schema_user_dependencies(ptr _tra
return A;
}
+static void
+SQLsetIdle(int clientid, time_t t)
+{
+ Client c = mal_clients + clientid;
+ MT_lock_set(&mal_contextLock);
+ c->idle = t;
+ MT_lock_unset(&mal_contextLock);
+}
+
void
monet5_user_init(backend_functions *be_funcs)
{
@@ -710,6 +719,7 @@ monet5_user_init(backend_functions *be_f
be_funcs->fauser = &monet5_alter_user;
be_funcs->fruser = &monet5_rename_user;
be_funcs->fschuserdep = &monet5_schema_user_dependencies;
+ be_funcs->setIdle = SQLsetIdle;
}
int
diff --git a/sql/common/sql_backend.c b/sql/common/sql_backend.c
--- a/sql/common/sql_backend.c
+++ b/sql/common/sql_backend.c
@@ -126,3 +126,10 @@ backend_find_role(ptr mvc, char *name, s
return be_funcs.ffrole(mvc, name, role_id);
return 0;
}
+
+void
+backend_set_idle(int clientid, time_t t)
+{
+ if (be_funcs.setIdle != NULL)
+ be_funcs.setIdle(clientid, t);
+}
diff --git a/sql/common/sql_backend.h b/sql/common/sql_backend.h
--- a/sql/common/sql_backend.h
+++ b/sql/common/sql_backend.h
@@ -48,6 +48,7 @@ typedef struct _backend_functions {
resolve_function fresolve_function;
has_module_function fhas_module_function;
create_sub_backend sub_backend;
+ void (*setIdle)(int, time_t);
} backend_functions;
extern void backend_freecode(const char *mod, int clientid, const char *name);
@@ -63,6 +64,7 @@ extern void* backend_schema_user_depende
extern int backend_resolve_function(ptr trans, sql_func *f, const char
*fimp, bool *side_effect);
extern int backend_has_module(ptr M, char *name);
extern int backend_find_role(ptr mp, char *role, sqlid *role_id);
+extern void backend_set_idle(int clientid, time_t t);
extern backend_functions be_funcs;
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -750,8 +750,9 @@ utf8_putchar(struct scanner *lc, int ch)
}
static inline int
-scanner_read_more(struct scanner *lc, size_t n)
+scanner_read_more(mvc *c, size_t n)
{
+ struct scanner *lc = &c->scanner;
bstream *b = lc->rs;
bool more = false;
@@ -769,13 +770,16 @@ scanner_read_more(struct scanner *lc, si
lc->aborted = true;
return EOF;
}
+ backend_set_idle(c->clientid, time(NULL));
if (mnstr_write(lc->ws, PROMPT2, sizeof(PROMPT2) - 1,
1) == 1)
mnstr_flush(lc->ws, MNSTR_FLUSH_DATA);
b->eof = false;
more = true;
}
/* we need more query text */
- if (bstream_next(b) < 0) {
+ ssize_t s = bstream_next(b);
+ backend_set_idle(c->clientid, 0);
+ if (s < 0) {
if (mnstr_errnr(b->s) == MNSTR_INTERRUPT) {
// now what?
lc->errstr = "Query aborted";
@@ -797,13 +801,14 @@ scanner_read_more(struct scanner *lc, si
}
static inline int
-scanner_getc(struct scanner *lc)
+scanner_getc(mvc *sql)
{
+ struct scanner *lc = &sql->scanner;
bstream *b = lc->rs;
unsigned char *s = NULL;
int c, m, n, mask;
- if (scanner_read_more(lc, 1) == EOF) {
+ if (scanner_read_more(sql, 1) == EOF) {
//lc->errstr = SQLSTATE(42000) "end of input stream";
return EOF;
}
@@ -825,7 +830,7 @@ scanner_getc(struct scanner *lc)
goto error;
}
- if (scanner_read_more(lc, (size_t) n) == EOF)
+ if (scanner_read_more(sql, (size_t) n) == EOF)
return EOF;
s = (unsigned char *) b->buf + b->pos + lc->yycur;
@@ -911,9 +916,9 @@ scanner_string(mvc *c, int quote, bool e
(void) sql_error(c, 2, SQLSTATE(42000) "NULL
byte in string");
return LEX_ERROR;
}
- cur = scanner_read_more(lc, 1);
+ cur = scanner_read_more(c, 1);
} else {
- cur = scanner_getc(lc);
+ cur = scanner_getc(c);
}
}
(void) sql_error(c, 2, "%s", lc->errstr ? lc->errstr : SQLSTATE(42000)
"Unexpected end of input");
@@ -958,9 +963,9 @@ scanner_body(mvc *c)
(void) sql_error(c, 2, SQLSTATE(42000) "NULL
byte in string");
return LEX_ERROR;
}
- cur = scanner_read_more(lc, 1);
+ cur = scanner_read_more(c, 1);
} else {
- cur = scanner_getc(lc);
+ cur = scanner_getc(c);
}
}
(void) sql_error(c, 2, SQLSTATE(42000) "Unexpected end of input");
@@ -978,7 +983,7 @@ keyword_or_ident(mvc * c, int cur)
utf8_putchar(lc, cur);
s = lc->yycur;
lc->yyval = IDENT;
- while ((cur = scanner_getc(lc)) != EOF) {
+ while ((cur = scanner_getc(c)) != EOF) {
if (!iswalnum(cur) && cur != '_') {
utf8_putchar(lc, cur);
(void)scanner_token(lc, IDENT);
@@ -996,26 +1001,28 @@ keyword_or_ident(mvc * c, int cur)
}
static int
-skip_white_space(struct scanner * lc)
+skip_white_space(mvc * c)
{
+ struct scanner *lc = &c->scanner;
int cur;
do {
lc->yysval = lc->yycur;
- } while ((cur = scanner_getc(lc)) != EOF && iswspace(cur));
+ } while ((cur = scanner_getc(c)) != EOF && iswspace(cur));
return cur;
}
static int
-skip_c_comment(struct scanner * lc)
+skip_c_comment(mvc *c)
{
+ struct scanner *lc = &c->scanner;
int cur;
int prev = 0;
int started = lc->started;
int depth = 1;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]