Changeset: ed4b3a8ca113 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ed4b3a8ca113
Modified Files:
gdk/gdk_system.h
monetdb5/mal/mal_client.c
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.c
sql/backends/monet5/sql_scenario.c
tools/monetdbe/monetdbe.c
Branch: default
Log Message:
Make QryCtx info part of Client structure, allowing direct pointer to it.
diffs (truncated from 420 to 300 lines):
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -161,7 +161,7 @@ enum MT_thr_detach { MT_THR_JOINABLE, MT
typedef int64_t lng;
typedef struct QryCtx {
- const lng starttime;
+ lng starttime;
lng querytimeout;
} QryCtx;
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
@@ -258,9 +258,9 @@ MCinitClientRecord(Client c, oid user, b
strcpy_len(c->optimizer, "default_pipe", sizeof(c->optimizer));
c->workerlimit = 0;
c->memorylimit = 0;
- c->querytimeout = 0;
+ c->qryctx.querytimeout = 0;
c->sessiontimeout = 0;
- c->starttime = 0;
+ c->qryctx.starttime = 0;
c->itrace = 0;
c->errbuf = 0;
@@ -382,7 +382,7 @@ MCforkClient(Client father)
strcpy_len(father->optimizer, son->optimizer,
sizeof(father->optimizer));
son->workerlimit = father->workerlimit;
son->memorylimit = father->memorylimit;
- son->querytimeout = father->querytimeout;
+ son->qryctx.querytimeout = father->qryctx.querytimeout;
son->sessiontimeout = father->sessiontimeout;
if (son->prompt)
@@ -462,7 +462,7 @@ MCfreeClient(Client c)
strcpy_len(c->optimizer, "default_pipe", sizeof(c->optimizer));
c->workerlimit = 0;
c->memorylimit = 0;
- c->querytimeout = 0;
+ c->qryctx.querytimeout = 0;
c->sessiontimeout = 0;
c->user = oid_nil;
if( c->username){
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
@@ -67,9 +67,8 @@ typedef struct CLIENT {
char optimizer[IDLENGTH];/* The optimizer pipe preferred for this
session */
int workerlimit; /* maximum number of workthreads
processing a query */
int memorylimit; /* Memory claim highwater mark,
0 = no limit */
- lng querytimeout; /* query abort after x usec, 0 = no
limit*/
lng sessiontimeout; /* session abort after x usec,
0 = no limit */
- lng starttime; /* track when the query started, for resource management
*/
+ QryCtx qryctx; /* per query limitations */
time_t login; /* Time when this session started */
lng session; /* usec since start of server */
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
@@ -104,7 +104,7 @@ malEmbeddedBoot(int workerlimit, int mem
throw(MAL, "malEmbeddedBoot", "Failed to initialize client");
c->workerlimit = workerlimit;
c->memorylimit = memorylimit;
- c->querytimeout = querytimeout * 1000000; // from sec to usec
+ c->qryctx.querytimeout = querytimeout * 1000000; // from sec to
usec
c->sessiontimeout = sessiontimeout * 1000000;
c->curmodule = c->usermodule = userModule();
if(c->usermodule == NULL) {
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
@@ -360,7 +360,7 @@ runMAL(Client cntxt, MalBlkPtr mb, MalBl
garbageCollector(cntxt, mb, stk, env != stk);
if (stk && stk != env)
freeStack(stk);
- if (ret == MAL_SUCCEED && cntxt->querytimeout && cntxt->starttime &&
GDKusec()- cntxt->starttime > cntxt->querytimeout)
+ if (ret == MAL_SUCCEED && cntxt->qryctx.querytimeout &&
cntxt->qryctx.starttime && GDKusec()- cntxt->qryctx.starttime >
cntxt->qryctx.querytimeout)
throw(MAL, "mal.interpreter", SQLSTATE(HYT00)
RUNTIME_QRY_TIMEOUT);
return ret;
}
@@ -454,7 +454,7 @@ callMAL(Client cntxt, MalBlkPtr mb, MalS
}
if (stk)
garbageCollector(cntxt, mb, stk, TRUE);
- if (ret == MAL_SUCCEED && cntxt->querytimeout && cntxt->starttime &&
GDKusec()- cntxt->starttime > cntxt->querytimeout)
+ if (ret == MAL_SUCCEED && cntxt->qryctx.querytimeout &&
cntxt->qryctx.starttime && GDKusec()- cntxt->qryctx.starttime >
cntxt->qryctx.querytimeout)
throw(MAL, "mal.interpreter", SQLSTATE(HYT00)
RUNTIME_QRY_TIMEOUT);
return ret;
}
@@ -522,7 +522,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
startedProfileQueue = true;
runtimeProfileInit(cntxt, mb, stk);
runtimeProfileBegin(cntxt, mb, stk, getInstrPtr(mb,0),
&runtimeProfileFunction);
- if (cntxt->sessiontimeout && cntxt->starttime - cntxt->session
> cntxt->sessiontimeout) {
+ if (cntxt->sessiontimeout && cntxt->qryctx.starttime -
cntxt->session > cntxt->sessiontimeout) {
runtimeProfileFinish(cntxt, mb, stk);
if (backup != backups)
GDKfree(backup);
@@ -534,14 +534,13 @@ runMALsequence(Client cntxt, MalBlkPtr m
stkpc = startpc;
exceptionVar = -1;
- QryCtx qry_ctx = {.querytimeout=cntxt->querytimeout,
.starttime=cntxt->starttime};
#ifndef NDEBUG
/* very short timeout */
- QryCtx qry_ctx_abort = {.querytimeout=100, .starttime=cntxt->starttime};
+ QryCtx qry_ctx_abort = {.querytimeout=100,
.starttime=cntxt->qryctx.starttime};
#endif
/* save, in case this function is called recursively */
QryCtx *qry_ctx_save = MT_thread_get_qry_ctx();
- MT_thread_set_qry_ctx(&qry_ctx);
+ MT_thread_set_qry_ctx(&cntxt->qryctx);
Client outer_cntxt = setClientContext(cntxt);
while (stkpc < mb->stop && stkpc != stoppc) {
@@ -821,7 +820,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
runtimeProfileExit(cntxt, mb, stk, getInstrPtr(mb,0),
&runtimeProfileFunction);
if (pcicaller && garbageControl(getInstrPtr(mb, 0)))
garbageCollector(cntxt, mb, stk, TRUE);
- if (cntxt->querytimeout && cntxt->starttime &&
GDKusec()- cntxt->starttime > cntxt->querytimeout){
+ if (cntxt->qryctx.querytimeout &&
cntxt->qryctx.starttime && GDKusec()- cntxt->qryctx.starttime >
cntxt->qryctx.querytimeout){
freeException(ret); /* overrule exception */
ret= createException(MAL, "mal.interpreter",
SQLSTATE(HYT00) RUNTIME_QRY_TIMEOUT);
break;
@@ -842,7 +841,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
ret = createException(MAL,"interpreter",
"failed instruction2str");
}
// runtimeProfileBegin already sets the time in the
instruction
- if (cntxt->querytimeout && cntxt->starttime &&
GDKusec()- cntxt->starttime > cntxt->querytimeout){
+ if (cntxt->qryctx.querytimeout &&
cntxt->qryctx.starttime && GDKusec()- cntxt->qryctx.starttime >
cntxt->qryctx.querytimeout){
freeException(ret); /* in case it's set */
ret = createException(MAL, "mal.interpreter",
SQLSTATE(HYT00) RUNTIME_QRY_TIMEOUT);
break;
@@ -966,7 +965,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
/* unknown exceptions lead to propagation */
if (exceptionVar == -1) {
- if (cntxt->querytimeout && cntxt->starttime &&
GDKusec()- cntxt->starttime > cntxt->querytimeout) {
+ if (cntxt->qryctx.querytimeout &&
cntxt->qryctx.starttime && GDKusec()- cntxt->qryctx.starttime >
cntxt->qryctx.querytimeout) {
freeException(ret);
ret = createException(MAL,
"mal.interpreter", SQLSTATE(HYT00) RUNTIME_QRY_TIMEOUT);
}
@@ -1015,7 +1014,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
}
}
if (stkpc == mb->stop) {
- if (cntxt->querytimeout && cntxt->starttime &&
GDKusec()- cntxt->starttime > cntxt->querytimeout){
+ if (cntxt->qryctx.querytimeout &&
cntxt->qryctx.starttime && GDKusec()- cntxt->qryctx.starttime >
cntxt->qryctx.querytimeout){
freeException(ret);
ret = createException(MAL,
"mal.interpreter", SQLSTATE(HYT00) RUNTIME_QRY_TIMEOUT);
stkpc = mb->stop;
@@ -1249,7 +1248,7 @@ runMALsequence(Client cntxt, MalBlkPtr m
default:
stkpc++;
}
- if (cntxt->querytimeout && cntxt->starttime && GDKusec()-
cntxt->starttime > cntxt->querytimeout){
+ if (cntxt->qryctx.querytimeout && cntxt->qryctx.starttime &&
GDKusec()- cntxt->qryctx.starttime > cntxt->qryctx.querytimeout){
if (ret == MAL_SUCCEED)
ret= createException(MAL, "mal.interpreter",
SQLSTATE(HYT00) RUNTIME_QRY_TIMEOUT);
stkpc= mb->stop;
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
@@ -702,7 +702,7 @@ MALparser(Client c)
/* now the parsing is done we should advance the stream */
c->fdin->pos += c->yycur;
c->yycur = 0;
- c->starttime = GDKusec();
+ c->qryctx.starttime = GDKusec();
/* 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
@@ -226,7 +226,7 @@ CLTstop(Client cntxt, MalBlkPtr mb, MalS
if (mal_clients[idx].mode == FREECLIENT)
msg = createException(MAL,"clients.stop","Session not active
anymore");
else
- mal_clients[idx].querytimeout = 1; /* stop client in one
microsecond */
+ mal_clients[idx].qryctx.querytimeout = 1; /* stop client in one
microsecond */
/* this forces the designated client to stop at the next instruction */
MT_lock_unset(&mal_contextLock);
return msg;
@@ -354,7 +354,7 @@ CLTstopSession(Client cntxt, MalBlkPtr m
if (mal_clients[idx].mode == FREECLIENT) {
msg = createException(MAL,"clients.stopSession","Session not
active anymore");
} else {
- mal_clients[idx].querytimeout = 1; /* stop client in one
microsecond */
+ mal_clients[idx].qryctx.querytimeout = 1; /* stop client in one
microsecond */
mal_clients[idx].sessiontimeout = 1; /* stop client session */
}
MT_lock_unset(&mal_contextLock);
@@ -463,7 +463,7 @@ CLTsetTimeout(Client cntxt, MalBlkPtr mb
} else {
if (pci->argc == 3)
mal_clients[idx].sessiontimeout = sto * 1000000;
- mal_clients[idx].querytimeout = qto * 1000000;
+ mal_clients[idx].qryctx.querytimeout = qto * 1000000;
}
MT_lock_unset(&mal_contextLock);
return msg;
@@ -505,7 +505,7 @@ CLTqueryTimeout(Client cntxt, MalBlkPtr
else {
/* when testing (FORCEMITOMASK), reduce timeout of 1 sec to 1
msec */
lng timeout_micro = GDKdebug & FORCEMITOMASK && qto == 1 ? 1000
: (lng) qto * 1000000;
- mal_clients[idx].querytimeout = timeout_micro;
+ mal_clients[idx].qryctx.querytimeout = timeout_micro;
QryCtx *qry_ctx = MT_thread_get_qry_ctx();
qry_ctx->querytimeout = timeout_micro;
}
@@ -531,7 +531,7 @@ CLTqueryTimeoutMicro(Client cntxt, MalBl
if (mal_clients[idx].mode == FREECLIENT)
msg = createException(MAL,"clients.queryTimeout","Session not
active anymore");
else {
- mal_clients[idx].querytimeout = qto;
+ mal_clients[idx].qryctx.querytimeout = qto;
QryCtx *qry_ctx = MT_thread_get_qry_ctx();
qry_ctx->querytimeout = qto;
}
@@ -592,7 +592,7 @@ CLTgetProfile(Client cntxt, MalBlkPtr mb
(void) mb;
if (!(*opt = GDKstrdup(cntxt->optimizer)))
throw(MAL, "clients.getProfile", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- *qto = (int)(cntxt->querytimeout / 1000000);
+ *qto = (int)(cntxt->qryctx.querytimeout / 1000000);
*sto = (int)(cntxt->sessiontimeout / 1000000);
*wlim = cntxt->workerlimit;
*mlim = cntxt->memorylimit;
@@ -858,7 +858,7 @@ CLTsessions(Client cntxt, MalBlkPtr mb,
timeout = (int)(c->sessiontimeout / 1000000);
if (BUNappend(sessiontimeout, &timeout, false) !=
GDK_SUCCEED)
goto bailout;
- timeout = (int)(c->querytimeout / 1000000);
+ timeout = (int)(c->qryctx.querytimeout / 1000000);
if (BUNappend(querytimeout, &timeout, false) !=
GDK_SUCCEED)
goto bailout;
if( c->idle){
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2478,10 +2478,10 @@ mvc_result_set_wrap( Client cntxt, MalBl
bat_iterator_end(&iterdig);
bat_iterator_end(&iterscl);
/* now send it to the channel cntxt->fdout */
- if (!msg && (ok = mvc_export_result(cntxt->sqlcontext, cntxt->fdout,
res, true, cntxt->starttime, mb->optimize)) < 0)
+ if (!msg && (ok = mvc_export_result(cntxt->sqlcontext, cntxt->fdout,
res, true, cntxt->qryctx.starttime, mb->optimize)) < 0)
msg = createException(SQL, "sql.resultSet", SQLSTATE(45000)
"Result set construction failed: %s", mvc_export_error(cntxt->sqlcontext,
cntxt->fdout, ok));
wrapup_result_set:
- cntxt->starttime = 0;
+ cntxt->qryctx.starttime = 0;
mb->optimize = 0;
if( tbl) BBPunfix(tblId);
if( atr) BBPunfix(atrId);
@@ -2618,7 +2618,7 @@ mvc_export_table_wrap( Client cntxt, Mal
goto wrapup_result_set1;
}
}
- if ((ok = mvc_export_result(cntxt->sqlcontext, s, res, tostdout,
cntxt->starttime, mb->optimize)) < 0) {
+ if ((ok = mvc_export_result(cntxt->sqlcontext, s, res, tostdout,
cntxt->qryctx.starttime, mb->optimize)) < 0) {
msg = createException(SQL, "sql.resultSet", SQLSTATE(45000)
"Result set construction failed: %s", mvc_export_error(cntxt->sqlcontext, s,
ok));
if (!onclient && !tostdout)
close_stream(s);
@@ -2635,7 +2635,7 @@ mvc_export_table_wrap( Client cntxt, Mal
close_stream(s);
}
wrapup_result_set1:
- cntxt->starttime = 0;
+ cntxt->qryctx.starttime = 0;
mb->optimize = 0;
if( order) BBPunfix(order->batCacheid);
if( tbl) BBPunfix(tblId);
@@ -2715,10 +2715,10 @@ mvc_row_result_wrap( Client cntxt, MalBl
bat_iterator_end(&itertpe);
bat_iterator_end(&iterdig);
bat_iterator_end(&iterscl);
- if (!msg && (ok = mvc_export_result(cntxt->sqlcontext, cntxt->fdout,
res, true, cntxt->starttime, mb->optimize)) < 0)
+ if (!msg && (ok = mvc_export_result(cntxt->sqlcontext, cntxt->fdout,
res, true, cntxt->qryctx.starttime, mb->optimize)) < 0)
msg = createException(SQL, "sql.resultSet", SQLSTATE(45000)
"Result set construction failed: %s", mvc_export_error(cntxt->sqlcontext,
cntxt->fdout, ok));
wrapup_result_set:
- cntxt->starttime = 0;
+ cntxt->qryctx.starttime = 0;
mb->optimize = 0;
if( tbl) BBPunfix(tblId);
if( atr) BBPunfix(atrId);
@@ -2851,7 +2851,7 @@ mvc_export_row_wrap( Client cntxt, MalBl
goto wrapup_result_set;
}
}
- if ((ok = mvc_export_result(cntxt->sqlcontext, s, res, strcmp(filename,
"stdout") == 0, cntxt->starttime, mb->optimize)) < 0) {
+ if ((ok = mvc_export_result(cntxt->sqlcontext, s, res, strcmp(filename,
"stdout") == 0, cntxt->qryctx.starttime, mb->optimize)) < 0) {
msg = createException(SQL, "sql.resultSet", SQLSTATE(45000)
"Result set construction failed: %s", mvc_export_error(cntxt->sqlcontext, s,
ok));
if (!onclient && !tostdout)
close_stream(s);
@@ -2868,7 +2868,7 @@ mvc_export_row_wrap( Client cntxt, MalBl
close_stream(s);
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]