Changeset: ce42cdf8f913 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ce42cdf8f913
Modified Files:
        monetdb5/mal/mal_client.h
        monetdb5/mal/mal_embedded.c
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_session.c
        monetdb5/modules/mal/clients.c
        sql/backends/monet5/sql_scenario.c
        tools/monetdbe/monetdbe.c
Branch: default
Log Message:

Use query timeout implementation also for session timeout.
Also, the sessiontimeout field in the client context is now the end time
for the session when a session timeout was specified.


diffs (143 lines):

diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -76,7 +76,7 @@ typedef struct CLIENT {
        int maxworkers;                         /* max_workers from 
db_user_info table */
        int memorylimit;                        /* maximum memory currently 
allowed in MB */
        lng maxmem;                                     /* max_memory from 
db_user_info table */
-       lng sessiontimeout;                     /* session abort after x usec, 
0 = no limit */
+       lng sessiontimeout;                     /* GDKusec() time when session 
should abort, 0 = no limit */
        int logical_sessiontimeout;     /* logical session timeout, client 
defined */
        lng idletimeout;                        /* idle in active transaction 
timeout */
        lng querytimeout;                       /* timeout per query in usec, 0 
= no limit */
diff --git a/monetdb5/mal/mal_embedded.c b/monetdb5/mal/mal_embedded.c
--- a/monetdb5/mal/mal_embedded.c
+++ b/monetdb5/mal/mal_embedded.c
@@ -101,8 +101,14 @@ malEmbeddedBoot(int workerlimit, int mem
        c->workerlimit = workerlimit;
        c->memorylimit = memorylimit;
        c->querytimeout = querytimeout * 1000000;       // from sec to usec
-       c->qryctx.endtime = c->qryctx.starttime && c->querytimeout ? 
c->qryctx.starttime + c->querytimeout : 0;
-       c->sessiontimeout = sessiontimeout * 1000000;
+       if (c->qryctx.starttime && c->querytimeout)
+               c->qryctx.endtime = c->qryctx.starttime + c->querytimeout;
+       if (sessiontimeout > 0) {
+               c->logical_sessiontimeout = sessiontimeout;
+               c->sessiontimeout = GDKusec() + sessiontimeout * 
LL_CONSTANT(1000000);
+               if (c->qryctx.endtime == 0 || c->sessiontimeout < 
c->qryctx.endtime)
+                       c->qryctx.endtime = c->sessiontimeout;
+       }
        c->curmodule = c->usermodule = userModule();
        if (c->usermodule == NULL) {
                MCcloseClient(c);
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -542,9 +542,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
                runtimeProfileInit(cntxt, mb, stk);
                runtimeProfileBegin(cntxt, mb, stk, getInstrPtr(mb, 0),
                                                        
&runtimeProfileFunction);
-               if (cntxt->sessiontimeout
-                       && cntxt->qryctx.starttime - cntxt->session >
-                       cntxt->sessiontimeout) {
+               if (cntxt->sessiontimeout && GDKusec() >= 
cntxt->sessiontimeout) {
                        runtimeProfileFinish(cntxt, mb, stk);
                        ma_close(&ta_state);
                        throw(MAL, "mal.interpreter",
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -328,6 +328,8 @@ MALparser(Client c)
        c->yycur = 0;
        c->qryctx.starttime = GDKusec();
        c->qryctx.endtime = c->querytimeout ? c->qryctx.starttime + 
c->querytimeout : 0;
+       if (c->qryctx.endtime == 0 || c->sessiontimeout < c->qryctx.endtime)
+               c->qryctx.endtime = c->sessiontimeout;
 
        /* check for unfinished blocks */
        if (!c->curprg->def->errors && c->blkmode)
diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c
--- a/monetdb5/modules/mal/clients.c
+++ b/monetdb5/modules/mal/clients.c
@@ -505,6 +505,8 @@ CLTqueryTimeoutMicro(Client ctx, MalBlkP
                QryCtx *qry_ctx = MT_thread_get_qry_ctx();
                if (qry_ctx) {
                        qry_ctx->endtime = qry_ctx->starttime && qto ? 
qry_ctx->starttime + qto : 0;
+                       if (qry_ctx->endtime == 0 || ctx->sessiontimeout < 
qry_ctx->endtime)
+                               qry_ctx->endtime = ctx->sessiontimeout;
                }
        }
        MT_lock_unset(&mal_contextLock);
@@ -544,7 +546,7 @@ CLTsessionTimeout(Client ctx, MalBlkPtr 
                msg = createException(MAL, "clients.setsessiontimeout",
                                                          "Session not active 
anymore");
        else {
-               mal_clients[idx].sessiontimeout = sto > 0 ? (lng) sto *1000000 
+ (GDKusec() - mal_clients[idx].session) : 0;
+               mal_clients[idx].sessiontimeout = sto > 0 ? sto * 
LL_CONSTANT(1000000) + GDKusec() : 0;
                mal_clients[idx].logical_sessiontimeout = sto;
        }
        MT_lock_unset(&mal_contextLock);
@@ -564,7 +566,7 @@ CLTgetProfile(Client ctx, MalBlkPtr mb, 
        if (!(*opt = ma_strdup(mb->ma, ctx->optimizer)))
                throw(MAL, "clients.getProfile", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        *qto = (int) (ctx->querytimeout / 1000000);
-       *sto = (int) (ctx->sessiontimeout / 1000000);
+       *sto = ctx->logical_sessiontimeout;
        *wlim = ctx->workerlimit;
        *mlim = ctx->memorylimit;
        return MAL_SUCCEED;
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
@@ -969,9 +969,7 @@ shouldStop(void *data)
                        ((backend *) c->sqlcontext)->mvc->session->tr->active &&
                        time(NULL)- c->idle > c->idletimeout)
                        return true;
-               if (c->sessiontimeout &&
-                       c->session &&
-                       (GDKusec() - c->session) > c->sessiontimeout)
+               if (c->sessiontimeout && GDKusec() >= c->sessiontimeout)
                        return true;
        }
        return false;
@@ -1237,7 +1235,7 @@ SQLreader(Client c, backend *be)
                        }
                }
        }
-       if ( (c->sessiontimeout && (GDKusec() - c->session) > 
c->sessiontimeout) || !go || (strncmp(CURRENT(c), "\\q", 2) == 0)) {
+       if ( (c->sessiontimeout && GDKusec() >= c->sessiontimeout) || !go || 
(strncmp(CURRENT(c), "\\q", 2) == 0)) {
                in->pos = in->len;      /* skip rest of the input */
                MT_lock_set(&mal_contextLock);
                c->mode = FINISHCLIENT;
@@ -1728,6 +1726,8 @@ SQLparser(Client c, backend *be)
 
        c->qryctx.starttime = GDKusec();
        c->qryctx.endtime = c->querytimeout ? c->qryctx.starttime + 
c->querytimeout : 0;
+       if (c->qryctx.endtime == 0 || c->sessiontimeout < c->qryctx.endtime)
+               c->qryctx.endtime = c->sessiontimeout;
 
        if ((msg = SQLtrans(m)) != MAL_SUCCEED) {
                c->mode = FINISHCLIENT;
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -558,7 +558,9 @@ monetdbe_open_internal(monetdbe_database
        mdbe->c->workerlimit = monetdbe_workers_internal(mdbe, opts);
        mdbe->c->memorylimit = monetdbe_memory_internal(mdbe, opts);
        mdbe->c->querytimeout = monetdbe_querytimeout_internal(mdbe, opts);
-       mdbe->c->sessiontimeout = monetdbe_sessiontimeout_internal(mdbe, opts);
+       mdbe->c->logical_sessiontimeout = 
monetdbe_sessiontimeout_internal(mdbe, opts);
+       if (mdbe->c->logical_sessiontimeout > 0)
+               mdbe->c->sessiontimeout = mdbe->c->logical_sessiontimeout * 
LL_CONSTANT(1000000) + GDKusec();
        if (mdbe->msg)
                goto cleanup;
        if (mdbe->c->usermodule == NULL) {
@@ -871,6 +873,8 @@ monetdbe_open_remote(monetdbe_database_i
        stk->keepAlive = TRUE;
        c->qryctx.starttime = GDKusec();
        c->qryctx.endtime = c->querytimeout ? c->qryctx.starttime + 
c->querytimeout : 0;
+       if (c->qryctx.endtime == 0 || c->sessiontimeout < c->qryctx.endtime)
+               c->qryctx.endtime = c->sessiontimeout;
        if ( (mdbe->msg = runMALsequence(c, mb, 1, 0, stk, 0, 0)) != 
MAL_SUCCEED ) {
                freeStack(stk);
                freeSymbol(c->curprg);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to