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]

Reply via email to