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