Changeset: e110b6e1a2b9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e110b6e1a2b9 Added Files: sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py sql/test/sysmon/Tests/sys_queue_multisessions.stable.err sql/test/sysmon/Tests/sys_queue_multisessions.stable.out Modified Files: monetdb5/modules/mal/sysmon.c sql/test/sysmon/Tests/All Branch: Oct2020 Log Message:
A user should be able to see all its queries from all current sessions of this user in sys.queue() output. diffs (169 lines): 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 @@ -164,7 +164,6 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, timestamp tsn; str msg = MAL_SUCCEED; - (void) cntxt; (void) mb; sz = (BUN) qsize; // reserve space for all tuples in QRYqueue tag = COLnew(0, TYPE_lng, sz, TRANSIENT); @@ -196,7 +195,8 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, if( i == qhead) break; } - if( QRYqueue[i].query && (cntxt->user == MAL_ADMIN || cntxt->idx == QRYqueue[i].idx) ){ + if( QRYqueue[i].query && (cntxt->user == MAL_ADMIN || + strcmp(cntxt->username, QRYqueue[i].username) == 0) ){ qtag = (lng) QRYqueue[i].tag; if (BUNappend(tag, &qtag, false) != GDK_SUCCEED) goto bailout; @@ -272,11 +272,8 @@ SYSMONpause(Client cntxt, MalBlkPtr mb, { bool set = false; lng tag = 0; - (void) mb; - (void) stk; - (void) pci; - switch( getArgType(mb,pci,1)){ + switch(getArgType(mb,pci,1)){ case TYPE_bte: tag = *getArgReference_bte(stk,pci,1); break; case TYPE_sht: tag = *getArgReference_sht(stk,pci,1); break; case TYPE_int: tag = *getArgReference_int(stk,pci,1); break; @@ -308,11 +305,8 @@ SYSMONresume(Client cntxt, MalBlkPtr mb, { bool set = false; lng tag = 0; - (void) mb; - (void) stk; - (void) pci; - switch( getArgType(mb,pci,1)){ + switch(getArgType(mb,pci,1)){ case TYPE_bte: tag = *getArgReference_bte(stk,pci,1); break; case TYPE_sht: tag = *getArgReference_sht(stk,pci,1); break; case TYPE_int: tag = *getArgReference_int(stk,pci,1); break; @@ -344,11 +338,8 @@ SYSMONstop(Client cntxt, MalBlkPtr mb, M { bool set = false; lng tag = 0; - (void) mb; - (void) stk; - (void) pci; - switch( getArgType(mb,pci,1)){ + switch(getArgType(mb,pci,1)){ case TYPE_bte: tag = *getArgReference_bte(stk,pci,1); break; case TYPE_sht: tag = *getArgReference_sht(stk,pci,1); break; case TYPE_int: tag = *getArgReference_int(stk,pci,1); break; 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 @@ -4,3 +4,4 @@ sys_queue_rotate HAVE_PYMONETDB?sys_queue_expand HAVE_PYMONETDB?sys_user_statistics drop_sleep +sys_queue_multisessions diff --git a/sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py b/sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py new file mode 100644 --- /dev/null +++ b/sql/test/sysmon/Tests/sys_queue_multisessions.SQL.py @@ -0,0 +1,58 @@ +### +# Check that an ordinary user can see queries in all its sessions +### +import pymonetdb +import os + +DB = os.environ['TSTDB'] +PORT = int(os.environ['MAPIPORT']) +HOST = os.environ['MAPIHOST'] +USR = 'u1' +PSWD = 'u1' + +try: + mdbdbh = pymonetdb.connect(database=DB, port=PORT, hostname=HOST, autocommit=True) + mdbcursor = mdbdbh.cursor() + mdbcursor.execute('create role r1;') + mdbcursor.execute('create schema s1 authorization r1;') + mdbcursor.execute('create user u1 with password \'u1\' name \'u1\' schema s1;') + mdbcursor.execute('grant r1 to u1;') + + # Let the user establish several connections to the server + usrdbh1 = pymonetdb.connect(database=DB, port=PORT, hostname=HOST, + username=USR, password=PSWD, autocommit=True) + usrcursor1 = usrdbh1.cursor() + + usrdbh2 = pymonetdb.connect(database=DB, port=PORT, hostname=HOST, + username=USR, password=PSWD, autocommit=True) + usrcursor2 = usrdbh2.cursor() + + # NB, we only have 4-1 slots in sys.queue to use because of the + # SingleServer config in this test + usrcursor1.execute('select \'u1 session_1\';') + usrcursor2.execute('select \'u1 session_2\';') + + # Check that the sys.queue() output of each user contains queries from both + # connections + usrcursor1.execute('select username, sessionid from sys.queue() group by username, sessionid order by sessionid;') + for row in usrcursor1.fetchall(): + print(row) + usrcursor2.execute('select username, sessionid from sys.queue() group by username, sessionid order by sessionid;') + for row in usrcursor2.fetchall(): + print(row) +except pymonetdb.exceptions.Error as e: + print(e) +finally: + # clean up and don't stop by an error + try: + if usrdbh1: + usrdbh1.close() + if usrdbh2: + usrdbh2.close() + mdbcursor.execute('drop user u1') + mdbcursor.execute('drop role r1') + mdbcursor.execute('drop schema s1') + mdbdbh.close() + except pymonetdb.exceptions.Error as e: + print(e) + diff --git a/sql/test/sysmon/Tests/sys_queue_multisessions.stable.err b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.err @@ -0,0 +1,12 @@ +stderr of test 'sys_queue_multisessions` in directory 'sql/test/sysmon` itself: + + +# 13:06:34 > +# 13:06:34 > "/usr/bin/python3.8" "sys_queue_multisessions.SQL.py" "sys_queue_multisessions" +# 13:06:34 > + + +# 13:06:34 > +# 13:06:34 > "Done." +# 13:06:34 > + diff --git a/sql/test/sysmon/Tests/sys_queue_multisessions.stable.out b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/sysmon/Tests/sys_queue_multisessions.stable.out @@ -0,0 +1,16 @@ +stdout of test 'sys_queue_multisessions` in directory 'sql/test/sysmon` itself: + + +# 13:06:34 > +# 13:06:34 > "/usr/bin/python3.8" "sys_queue_multisessions.SQL.py" "sys_queue_multisessions" +# 13:06:34 > + +('u1', 1) +('u1', 2) +('u1', 1) +('u1', 2) + +# 13:06:34 > +# 13:06:34 > "Done." +# 13:06:34 > + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list