Changeset: 180d2b891935 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/180d2b891935
Added Files:
sql/test/sysmon/Tests/sys_pause_resume_stop.SQL.py
Modified Files:
clients/Tests/MAL-signatures-hge.test
clients/Tests/MAL-signatures.test
monetdb5/modules/mal/sysmon.c
sql/ChangeLog
sql/backends/monet5/sql_upgrades.c
sql/scripts/26_sysmon.sql
sql/test/emptydb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out
sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/emptydb-previous-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-previous-upgrade/Tests/upgrade.stable.out
sql/test/emptydb-previous-upgrade/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade/Tests/upgrade.stable.out
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.int128
sql/test/sysmon/Tests/All
sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py
sql/test/testdb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-previous-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-previous-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-previous-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-previous-upgrade/Tests/upgrade.stable.out
sql/test/testdb-previous-upgrade/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:
SYSMON queue, pause, stop and resume overloaded for SYSADMIN calls + tests +
upgrade code.
diffs (truncated from 1270 to 300 lines):
diff --git a/clients/Tests/MAL-signatures-hge.test
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -50675,54 +50675,44 @@ mnstr_write_stringwrap;
write data on the stream
sysmon
pause
-unsafe pattern sysmon.pause(X_0:int):void
-SYSMONpause;
-Suspend a running query
-sysmon
-pause
unsafe pattern sysmon.pause(X_0:lng):void
SYSMONpause;
-Suspend a running query
+Suspend query execution with OID id
sysmon
pause
-unsafe pattern sysmon.pause(X_0:sht):void
+unsafe pattern sysmon.pause(X_0:lng, X_1:str):void
SYSMONpause;
-Suspend a running query
+Sysadmin call, suspend query execution with OID id belonging to user
sysmon
queue
pattern sysmon.queue() (X_0:bat[:lng], X_1:bat[:int], X_2:bat[:str],
X_3:bat[:timestamp], X_4:bat[:str], X_5:bat[:str], X_6:bat[:timestamp],
X_7:bat[:int], X_8:bat[:int])
SYSMONqueue;
A queue of queries that are currently being executed or recently finished
sysmon
-resume
-unsafe pattern sysmon.resume(X_0:int):void
-SYSMONresume;
-Resume processing of a query
+queue
+pattern sysmon.queue(X_0:str) (X_1:bat[:lng], X_2:bat[:int], X_3:bat[:str],
X_4:bat[:timestamp], X_5:bat[:str], X_6:bat[:str], X_7:bat[:timestamp],
X_8:bat[:int], X_9:bat[:int])
+SYSMONqueue;
+Sysadmin call, to see either the global queue or user queue of queries that
are currently being executed or recently finished
sysmon
resume
unsafe pattern sysmon.resume(X_0:lng):void
SYSMONresume;
-Resume processing of a query
+Resume query execution with OID id
sysmon
resume
-unsafe pattern sysmon.resume(X_0:sht):void
+unsafe pattern sysmon.resume(X_0:lng, X_1:str):void
SYSMONresume;
-Resume processing of a query
-sysmon
-stop
-unsafe pattern sysmon.stop(X_0:int):void
-SYSMONstop;
-Stop a single query a.s.a.p.
+Sysadmin call, resume query execution with OID id belonging to user
sysmon
stop
unsafe pattern sysmon.stop(X_0:lng):void
SYSMONstop;
-Stop a single query a.s.a.p.
+Stop query execution with OID id
sysmon
stop
-unsafe pattern sysmon.stop(X_0:sht):void
+unsafe pattern sysmon.stop(X_0:lng, X_1:str):void
SYSMONstop;
-Stop a single query a.s.a.p.
+Sysadmin call, stop query execution with OID id belonging to user
sysmon
user_statistics
pattern sysmon.user_statistics() (X_0:bat[:str], X_1:bat[:lng], X_2:bat[:lng],
X_3:bat[:timestamp], X_4:bat[:timestamp], X_5:bat[:lng], X_6:bat[:str])
diff --git a/clients/Tests/MAL-signatures.test
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -39000,54 +39000,44 @@ mnstr_write_stringwrap;
write data on the stream
sysmon
pause
-unsafe pattern sysmon.pause(X_0:int):void
-SYSMONpause;
-Suspend a running query
-sysmon
-pause
unsafe pattern sysmon.pause(X_0:lng):void
SYSMONpause;
-Suspend a running query
+Suspend query execution with OID id
sysmon
pause
-unsafe pattern sysmon.pause(X_0:sht):void
+unsafe pattern sysmon.pause(X_0:lng, X_1:str):void
SYSMONpause;
-Suspend a running query
+Sysadmin call, suspend query execution with OID id belonging to user
sysmon
queue
pattern sysmon.queue() (X_0:bat[:lng], X_1:bat[:int], X_2:bat[:str],
X_3:bat[:timestamp], X_4:bat[:str], X_5:bat[:str], X_6:bat[:timestamp],
X_7:bat[:int], X_8:bat[:int])
SYSMONqueue;
A queue of queries that are currently being executed or recently finished
sysmon
-resume
-unsafe pattern sysmon.resume(X_0:int):void
-SYSMONresume;
-Resume processing of a query
+queue
+pattern sysmon.queue(X_0:str) (X_1:bat[:lng], X_2:bat[:int], X_3:bat[:str],
X_4:bat[:timestamp], X_5:bat[:str], X_6:bat[:str], X_7:bat[:timestamp],
X_8:bat[:int], X_9:bat[:int])
+SYSMONqueue;
+Sysadmin call, to see either the global queue or user queue of queries that
are currently being executed or recently finished
sysmon
resume
unsafe pattern sysmon.resume(X_0:lng):void
SYSMONresume;
-Resume processing of a query
+Resume query execution with OID id
sysmon
resume
-unsafe pattern sysmon.resume(X_0:sht):void
+unsafe pattern sysmon.resume(X_0:lng, X_1:str):void
SYSMONresume;
-Resume processing of a query
-sysmon
-stop
-unsafe pattern sysmon.stop(X_0:int):void
-SYSMONstop;
-Stop a single query a.s.a.p.
+Sysadmin call, resume query execution with OID id belonging to user
sysmon
stop
unsafe pattern sysmon.stop(X_0:lng):void
SYSMONstop;
-Stop a single query a.s.a.p.
+Stop query execution with OID id
sysmon
stop
-unsafe pattern sysmon.stop(X_0:sht):void
+unsafe pattern sysmon.stop(X_0:lng, X_1:str):void
SYSMONstop;
-Stop a single query a.s.a.p.
+Sysadmin call, stop query execution with OID id belonging to user
sysmon
user_statistics
pattern sysmon.user_statistics() (X_0:bat[:str], X_1:bat[:lng], X_2:bat[:lng],
X_3:bat[:timestamp], X_4:bat[:timestamp], X_5:bat[:lng], X_6:bat[:str])
diff --git a/monetdb5/modules/mal/sysmon.c b/monetdb5/modules/mal/sysmon.c
--- a/monetdb5/modules/mal/sysmon.c
+++ b/monetdb5/modules/mal/sysmon.c
@@ -20,11 +20,16 @@
/* (c) M.L. Kersten
* The queries currently in execution are returned to the front-end for
managing expensive ones.
-*/
+ */
static str
SYSMONstatistics(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
+ /* Temporary hack not allowing MAL clients (mclient -lmal)
+ to use this function */
+ if (cntxt->sqlcontext == NULL)
+ throw(MAL, "SYSMONstatistics", SQLSTATE(42000) "Calling from a
mclient -lmal.");
+
BAT *user, *querycount, *totalticks, *started, *finished, *maxquery,
*maxticks;
bat *u = getArgReference_bat(stk,pci,0);
bat *c = getArgReference_bat(stk,pci,1);
@@ -58,7 +63,7 @@ SYSMONstatistics(Client cntxt, MalBlkPtr
MT_lock_set(&mal_delayLock);
// FIXME: what if there are multiple users with ADMIN privilege?
- for (i = 0 && cntxt->user == MAL_ADMIN; i < usrstatscnt; i++) {
+ for (i = 0; i < usrstatscnt; i++) {
/* We can stop at the first empty entry */
if (USRstats[i].username == NULL) break;
@@ -144,7 +149,7 @@ SYSMONstatistics(Client cntxt, MalBlkPtr
BBPkeepref(maxquery);
return MAL_SUCCEED;
-bailout:
+ bailout:
MT_lock_unset(&mal_delayLock);
BBPunfix(user->batCacheid);
BBPunfix(querycount->batCacheid);
@@ -159,34 +164,51 @@ bailout:
static str
SYSMONqueue(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- BAT *tag, *sessionid, *user, *started, *status, *query, *finished,
*workers, *memory;
- bat *t = getArgReference_bat(stk,pci,0);
- bat *s = getArgReference_bat(stk,pci,1);
- bat *u = getArgReference_bat(stk,pci,2);
- bat *sd = getArgReference_bat(stk,pci,3);
- bat *ss = getArgReference_bat(stk,pci,4);
- bat *q = getArgReference_bat(stk,pci,5);
- bat *f = getArgReference_bat(stk,pci,6);
- bat *w = getArgReference_bat(stk,pci,7);
- bat *m = getArgReference_bat(stk,pci,8);
+ /* Temporary hack not allowing MAL clients (mclient -lmal)
+ to use this function */
+ if (cntxt->sqlcontext == NULL)
+ throw(MAL, "SYSMONstatistics", SQLSTATE(42000) "Calling from a
mclient -lmal.");
+
+ (void)mb;
+
+ bat *t = getArgReference_bat(stk,pci,0),
+ *s = getArgReference_bat(stk,pci,1),
+ *u = getArgReference_bat(stk,pci,2),
+ *sd = getArgReference_bat(stk,pci,3),
+ *ss = getArgReference_bat(stk,pci,4),
+ *q = getArgReference_bat(stk,pci,5),
+ *f = getArgReference_bat(stk,pci,6),
+ *w = getArgReference_bat(stk,pci,7),
+ *m = getArgReference_bat(stk,pci,8);
+
+ BUN sz = (BUN)qsize;
+ BAT *tag = COLnew(0, TYPE_lng, sz, TRANSIENT),
+ *sessionid = COLnew(0, TYPE_int, sz, TRANSIENT),
+ *user = COLnew(0, TYPE_str, sz, TRANSIENT),
+ *started = COLnew(0, TYPE_timestamp, sz, TRANSIENT),
+ *status = COLnew(0, TYPE_str, sz, TRANSIENT),
+ *query = COLnew(0, TYPE_str, sz, TRANSIENT),
+ *finished = COLnew(0, TYPE_timestamp, sz, TRANSIENT),
+ *workers = COLnew(0, TYPE_int, sz, TRANSIENT),
+ *memory = COLnew(0, TYPE_int, sz, TRANSIENT);
+
lng qtag;
int wrk, mem;
- BUN sz;
timestamp tsn;
- str msg = MAL_SUCCEED;
+ str userqueue = NULL, msg = MAL_SUCCEED;
- (void) mb;
- sz = (BUN) qsize; // reserve space for all tuples in QRYqueue
- tag = COLnew(0, TYPE_lng, sz, TRANSIENT);
- sessionid = COLnew(0, TYPE_int, sz, TRANSIENT);
- user = COLnew(0, TYPE_str, sz, TRANSIENT);
- started = COLnew(0, TYPE_timestamp, sz, TRANSIENT);
- status = COLnew(0, TYPE_str, sz, TRANSIENT);
- query = COLnew(0, TYPE_str, sz, TRANSIENT);
- finished = COLnew(0, TYPE_timestamp, sz, TRANSIENT);
- workers = COLnew(0, TYPE_int, sz, TRANSIENT);
- memory = COLnew(0, TYPE_int, sz, TRANSIENT);
- if ( tag == NULL || sessionid == NULL || user == NULL || query == NULL
|| started == NULL || finished == NULL || workers == NULL || memory == NULL){
+ /* If pci->argc == 10, arg 9 type is a string */
+ bool getall = false, admin = pci->argc == 10 ? true : false;
+ if (admin) {
+ assert(getArgType(mb, pci, 9) == TYPE_str);
+ userqueue = *getArgReference_str(stk, pci, 9);
+ if (strcmp("ALL", userqueue) == 0)
+ getall = true;
+ }
+
+ if (tag == NULL || sessionid == NULL || user == NULL ||
+ query == NULL || started == NULL || finished == NULL ||
+ workers == NULL || memory == NULL){
BBPreclaim(tag);
BBPreclaim(sessionid);
BBPreclaim(user);
@@ -196,60 +218,55 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb,
BBPreclaim(finished);
BBPreclaim(workers);
BBPreclaim(memory);
- throw(MAL, "SYSMONqueue", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ throw(MAL, "SYSMONqueue", SQLSTATE(HY001) MAL_MALLOC_FAIL);
}
MT_lock_set(&mal_delayLock);
for (size_t i = 0; i < qsize; i++) {
- if( QRYqueue[i].query && (cntxt->user == MAL_ADMIN ||
- strcmp(cntxt->username,
QRYqueue[i].username) == 0) ){
+ /* Filtering the queries according to how SYSMONqueue was
called.
+ Either:
+ SYSADMIN calls sys.queue("ALL") or SYSADMIN calls
sys.queue(USER)
+ or any user calls sys.queue() to retrieve its own queue. */
+ if (QRYqueue[i].query &&
+ ((admin && getall) ||
+ (admin && strcmp(QRYqueue[i].username, userqueue) ==
0) ||
+ ((admin == false) && strcmp(QRYqueue[i].username,
cntxt->username) == 0))) {
qtag = (lng) QRYqueue[i].tag;
- if (BUNappend(tag, &qtag, false) != GDK_SUCCEED)
- goto bailout;
-
- if (BUNappend(user, QRYqueue[i].username, false) !=
GDK_SUCCEED) {
- goto bailout;
- }
-
- if (BUNappend(sessionid, &(QRYqueue[i].idx), false) !=
GDK_SUCCEED) {
- goto bailout;
- }
-
- if (BUNappend(query, QRYqueue[i].query, false) !=
GDK_SUCCEED ||
+ if (BUNappend(tag, &qtag, false) != GDK_SUCCEED ||
+ BUNappend(user, QRYqueue[i].username, false) !=
GDK_SUCCEED ||
+ BUNappend(sessionid, &(QRYqueue[i].idx),false)
!= GDK_SUCCEED ||
+ BUNappend(query, QRYqueue[i].query, false) !=
GDK_SUCCEED ||
BUNappend(status, QRYqueue[i].status, false) !=
GDK_SUCCEED)
goto bailout;
-
/* convert number of seconds into a timestamp */
tsn = timestamp_fromtime(QRYqueue[i].start);
if (is_timestamp_nil(tsn)) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]