Changeset: f8a6a41ef020 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f8a6a41ef020
Added Files:
sql/test/sysmon/Tests/query_timeout.test
Modified Files:
gdk/gdk.h
gdk/gdk_cross.c
monetdb5/mal/mal_interpreter.c
sql/test/sysmon/Tests/All
Branch: qcancel
Log Message:
qtimeout in gdk cross product
diffs (105 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2113,4 +2113,10 @@ gdk_export BAT *BATsample_with_seed(BAT
*/
#define MAXPARAMS 32
+#define _CHECK_TIMEOUT(starttime, querytimeout) \
+ if (querytimeout && starttime && (GDKusec() - starttime) >
querytimeout) { \
+ GDKerror("Timeout was reached!"); \
+ return GDK_FAIL; \
+ }
+
#endif /* _GDK_H_ */
diff --git a/gdk/gdk_cross.c b/gdk/gdk_cross.c
--- a/gdk/gdk_cross.c
+++ b/gdk/gdk_cross.c
@@ -9,6 +9,7 @@
#include "monetdb_config.h"
#include "gdk.h"
#include "gdk_private.h"
+#include "gdk_system.h"
/* Calculate a cross product between bats l and r with optional
* candidate lists sl for l and sr for r.
@@ -26,6 +27,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
cnt1 = canditer_init(&ci1, l, sl);
cnt2 = canditer_init(&ci2, r, sr);
+ QryCtx *qry_ctx = MT_thread_get_qry_ctx();
if (max_one && cnt1 > 0 && cnt2 > 1) {
GDKerror("more than one match");
@@ -50,6 +52,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
bn1->tnonil = true;
p = (oid *) Tloc(bn1, 0);
for (i = 0; i < cnt1; i++) {
+ _CHECK_TIMEOUT(qry_ctx->starttime,
qry_ctx->querytimeout);
oid x = canditer_next(&ci1);
for (j = 0; j < cnt2; j++) {
*p++ = x;
@@ -66,6 +69,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
bn2->tnonil = true;
p = (oid *) Tloc(bn2, 0);
for (i = 0; i < cnt1; i++) {
+ _CHECK_TIMEOUT(qry_ctx->starttime,
qry_ctx->querytimeout);
for (j = 0; j < cnt2; j++) {
*p++ = canditer_next(&ci2);
}
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
@@ -463,7 +463,6 @@ str runMALsequence(Client cntxt, MalBlkP
int startedProfileQueue = 0;
#define CHECKINTERVAL 1000 /* how often do we check for client disconnect */
runtimeProfile.ticks = runtimeProfileFunction.ticks = 0;
- QryCtx qry_ctx = {.starttime=mb->starttime,
.querytimeout=cntxt->querytimeout};
if (stk == NULL)
throw(MAL, "mal.interpreter", MAL_STACK_FAIL);
@@ -513,10 +512,12 @@ str runMALsequence(Client cntxt, MalBlkP
stkpc = startpc;
exceptionVar = -1;
+ QryCtx qry_ctx = {.querytimeout=cntxt->querytimeout,
.starttime=mb->starttime};
+ MT_thread_set_qry_ctx(&qry_ctx);
+
while (stkpc < mb->stop && stkpc != stoppc) {
// incomplete block being executed, requires at least signature
and end statement
MT_thread_setalgorithm(NULL);
- MT_thread_set_qry_ctx(&qry_ctx);
pci = getInstrPtr(mb, stkpc);
if (cntxt->mode == FINISHCLIENT){
stkpc = stoppc;
diff --git a/sql/test/sysmon/Tests/All b/sql/test/sysmon/Tests/All
--- a/sql/test/sysmon/Tests/All
+++ b/sql/test/sysmon/Tests/All
@@ -2,3 +2,4 @@ sys_queue
sys_queue_expand
sys_user_statistics
sys_queue_multisessions
+query_timeout
diff --git a/sql/test/sysmon/Tests/query_timeout.test
b/sql/test/sysmon/Tests/query_timeout.test
new file mode 100644
--- /dev/null
+++ b/sql/test/sysmon/Tests/query_timeout.test
@@ -0,0 +1,18 @@
+statement ok
+create table foo(id bigserial, value int);
+
+statement ok
+create table bar(id bigserial, value int);
+
+statement ok
+insert into foo(value) (select * from generate_series(0,10000));
+
+statement ok
+insert into bar(value) (select * from generate_series(0,10000));
+
+statement ok
+call setquerytimeout(0, 1);
+
+# test crossproduct
+statement error HYT00!Query aborted due to timeout
+select * from foo, bar
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list