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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list