Changeset: 012c3e1016db for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=012c3e1016db
Modified Files:
monetdb5/mal/mal_client.c
monetdb5/mal/mal_client.h
monetdb5/mal/mal_interpreter.c
monetdb5/modules/mal/clients.c
monetdb5/modules/mal/clients.h
sql/backends/monet5/sql.mx
sql/scripts/22_clients.sql
Branch: default
Log Message:
Merge with default
diffs (214 lines):
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -228,6 +228,7 @@ MCinitClientRecord(Client c, oid user, b
c->father = NULL;
c->login = c->lastcmd = time(0);
+ c->active = 0;
c->session = GDKusec();
c->qtimeout = 0;
c->stimeout = 0;
@@ -367,6 +368,7 @@ freeClient(Client c)
}
c->father = 0;
c->login = c->lastcmd = 0;
+ c->active = 0;
c->qtimeout = 0;
c->stimeout = 0;
c->user = oid_nil;
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -94,6 +94,7 @@ typedef struct CLIENT {
time_t login;
time_t lastcmd; /* set when input is received */
+ bit active; /* processing a query or not */
lng session; /* usec since start of server */
lng qtimeout; /* query abort after x usec*/
lng stimeout; /* session abort after x usec */
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -344,6 +344,8 @@ str runMAL(Client cntxt, MalBlkPtr mb, M
* allocate space for value stack the global stack should be large
* enough
*/
+ cntxt->lastcmd= time(0);
+ cntxt->active = TRUE;
if (env != NULL) {
stk = env;
if (mb != stk->blk)
@@ -381,6 +383,7 @@ str runMAL(Client cntxt, MalBlkPtr mb, M
stk->cmd = env->cmd;
ret = runMALsequence(cntxt, mb, 1, 0, stk, env, 0);
+ cntxt->active = FALSE;
/* pass the new debug mode to the caller */
if (stk->cmd && env && stk->cmd != 'f')
env->cmd = stk->cmd;
@@ -441,6 +444,8 @@ callMAL(Client cntxt, MalBlkPtr mb, MalS
* variable. It is initially set equal to the number of cores,
* which may be too coarse.
*/
+ cntxt->lastcmd= time(0);
+ cntxt->active = TRUE;
MT_sema_down(&mal_parallelism,"callMAL");
#ifdef DEBUG_CALLMAL
mnstr_printf(cntxt->fdout, "callMAL\n");
@@ -480,6 +485,7 @@ callMAL(Client cntxt, MalBlkPtr mb, MalS
throw(MAL, "mal.interpreter", RUNTIME_UNKNOWN_INSTRUCTION);
}
MT_sema_up(&mal_parallelism,"callMAL");
+ cntxt->active = FALSE;
if (cntxt->qtimeout && GDKusec()- mb->starttime > cntxt->qtimeout)
throw(MAL, "mal.interpreter", RUNTIME_QRY_TIMEOUT);
return ret;
diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c
--- a/monetdb5/modules/mal/clients.c
+++ b/monetdb5/modules/mal/clients.c
@@ -35,6 +35,7 @@
#include "mal_instruction.h"
#include "mal_client.h"
#include "mal_authorize.h"
+#include "mtime.h"
#ifdef HAVE_LIBREADLINE
#include <readline/readline.h>
@@ -549,3 +550,69 @@ str CLTshutdown(int *ret, bit *forced) {
(void) forced;
throw(MAL,"clients.shutdown", PROGRAM_NYI);
}
+
+str
+CLTsessions(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ BAT *user = NULL, *login = NULL, *stimeout = NULL, *qtimeout = NULL,
*last= NULL, *active= NULL;
+ int *userId = (int*) getArgReference(stk,pci,0);
+ int *loginId = (int*) getArgReference(stk,pci,1);
+ int *stimeoutId = (int*) getArgReference(stk,pci,2);
+ int *lastId = (int*) getArgReference(stk,pci,3);
+ int *qtimeoutId = (int*) getArgReference(stk,pci,4);
+ int *activeId = (int*) getArgReference(stk,pci,5);
+ Client c;
+ char usrname[256]= {"monetdb"};
+ timestamp ts, ret;
+ lng clk;
+
+ (void) cntxt;
+ (void) mb;
+
+ user = BATnew(TYPE_void, TYPE_str, 0);
+ BATseqbase(user,0);
+ login = BATnew(TYPE_void, TYPE_lng, 0);
+ BATseqbase(login,0);
+ stimeout = BATnew(TYPE_void, TYPE_lng, 0);
+ BATseqbase(stimeout,0);
+ last = BATnew(TYPE_void, TYPE_lng, 0);
+ BATseqbase(last,0);
+ qtimeout = BATnew(TYPE_void, TYPE_lng, 0);
+ BATseqbase(qtimeout,0);
+ active = BATnew(TYPE_void, TYPE_bit, 0);
+ BATseqbase(active,0);
+ if ( user == NULL || login == NULL || stimeout == NULL || qtimeout ==
NULL || active == NULL){
+ if ( login) BBPreleaseref(login->batCacheid);
+ if ( stimeout) BBPreleaseref(stimeout->batCacheid);
+ if ( qtimeout) BBPreleaseref(qtimeout->batCacheid);
+ if ( last) BBPreleaseref(last->batCacheid);
+ if ( active) BBPreleaseref(active->batCacheid);
+ throw(SQL,"sql.sessions",MAL_MALLOC_FAIL);
+ }
+
+ MT_lock_set(&mal_contextLock, "clients.sessions");
+
+ for (c = mal_clients; c < mal_clients + MAL_MAXCLIENTS; c++)
+ if (c->mode == CLAIMED) {
+ BUNappend(user, &usrname, FALSE);
+ (void) MTIMEunix_epoch(&ts);
+ clk = c->login * 1000;
+ (void) MTIMEtimestamp_add(&ret,&ts, &clk);
+ BUNappend(login, &ret, FALSE);
+ BUNappend(stimeout, &c->stimeout, FALSE);
+ (void) MTIMEunix_epoch(&ts);
+ clk = c->lastcmd * 1000;
+ (void) MTIMEtimestamp_add(&ret,&ts, &clk);
+ BUNappend(last, &ret, FALSE);
+ BUNappend(qtimeout, &c->qtimeout, FALSE);
+ BUNappend(active, &c->active, FALSE);
+ }
+ MT_lock_unset(&mal_contextLock, "clients.sessions");
+ BBPkeepref(*userId = user->batCacheid);
+ BBPkeepref(*loginId = login->batCacheid);
+ BBPkeepref(*stimeoutId = stimeout->batCacheid);
+ BBPkeepref(*qtimeoutId = qtimeout->batCacheid);
+ BBPkeepref(*lastId = last->batCacheid);
+ BBPkeepref(*activeId = active->batCacheid);
+ return MAL_SUCCEED;
+}
diff --git a/monetdb5/modules/mal/clients.h b/monetdb5/modules/mal/clients.h
--- a/monetdb5/modules/mal/clients.h
+++ b/monetdb5/modules/mal/clients.h
@@ -71,4 +71,5 @@ clients_export str CLTchangePassword(Cli
clients_export str CLTsetPassword(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
clients_export str CLTcheckPermission(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
clients_export str CLTgetUsers(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
+clients_export str CLTsessions(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
#endif /* _CLIENTS_H */
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -471,6 +471,10 @@ pattern sql_variables():bat[:oid,:str]
address sql_variables
comment "return the table with session variables";
+pattern sessions() ( user:bat[:oid,:str],
start:bat[:oid,:timestamp],stimeout:bat[:oid,:lng],
lastcmd:bat[:oid,:timestamp], qtimeout:bat[:oid,:lng], idle:bat[:oid,:bit])
+address sql_sessions_wrap
+comment "SQL export table of active sessions, their timeouts and idle status";
+
pattern db_users() :bat[:oid,:str]
address db_users_wrap
comment "return table of users with sql scenario";
@@ -1431,6 +1435,7 @@ sql5_export str second_interval_str( lng
sql5_export str dump_cache(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
sql5_export str dump_opt_stats(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str dump_trace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
+sql5_export str sql_sessions_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str sql_storage(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str sql_querylog_catalog(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str sql_querylog_calls(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
@@ -1629,6 +1634,7 @@ sql5_export void freeVariables(Client c,
#include <cluster.h>
#include <opt_dictionary.h>
#include <opt_pipes.h>
+#include "clients.h"
#ifdef HAVE_RAPTOR
# include <rdf.h>
#endif
@@ -6686,6 +6692,12 @@ dump_trace(Client cntxt, MalBlkPtr mb, M
}
str
+sql_sessions_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ return CLTsessions(cntxt,mb,stk,pci);
+}
+
+str
sql_querylog_catalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
int i;
diff --git a/sql/scripts/22_clients.sql b/sql/scripts/22_clients.sql
--- a/sql/scripts/22_clients.sql
+++ b/sql/scripts/22_clients.sql
@@ -18,6 +18,10 @@ create function sys.password_hash (usern
returns string
external name sql.password;
+create function sys.sessions()
+returns table("user" string, "login" timestamp, "sessiontimeout" bigint,
"lastcommand" timestamp, "querytimeout" bigint, "active" bool)
+external name sql.sessions;
+
-- control the query and session time out
create procedure sys.settimeout("query" bigint)
external name sql.settimeout;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list