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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to