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]