Changeset: 8acd025b3ee1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8acd025b3ee1
Modified Files:
monetdb5/mal/mal_session.c
monetdb5/modules/mal/mal_mapi.c
sql/benchmarks/tpch/14.sql
tools/merovingian/daemon/client.c
Branch: Oct2014
Log Message:
Run authentication exchange in separate thread.
This should fix bug 3689.
diffs (148 lines):
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -158,7 +158,6 @@ MSscheduleClient(str command, str challe
char *user = command, *algo = NULL, *passwd = NULL, *lang = NULL;
char *database = NULL, *s, *dbname;
Client c;
- MT_Id p;
/* decode BIG/LIT:user:{cypher}passwordchal:lang:database: line */
@@ -328,15 +327,7 @@ MSscheduleClient(str command, str challe
/* fork a new thread to handle this client */
mnstr_settimeout(c->fdin->s, 50, GDKexiting);
- if (MT_create_thread(&p, MSserveClient, (void *) c, MT_THR_DETACHED) !=
0) {
- mnstr_printf(fout, "!internal server error (cannot fork new "
- "client thread), please try
again later\n");
- mnstr_flush(fout);
- c->mode = FINISHCLIENT;
- MCexitClient(c);
- showException(c->fdout, MAL, "initClient", "cannot fork new
client thread");
- return;
- }
+ MSserveClient(c);
}
/*
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -103,19 +103,26 @@ static void generateChallenge(str buf, i
buf[i] = '\0';
}
+struct challengedata {
+ stream *in;
+ stream *out;
+};
+
static void
-doChallenge(stream *in, stream *out) {
+doChallenge(void *data)
+{
#ifdef DEBUG_SERVER
Client cntxt= mal_clients;
#endif
char *buf = (char *) GDKmalloc(BLOCK + 1);
char challenge[13];
char *algos;
- stream *fdin = block_stream(in);
- stream *fdout = block_stream(out);
+ stream *fdin = block_stream(((struct challengedata *) data)->in);
+ stream *fdout = block_stream(((struct challengedata *) data)->out);
bstream *bs;
int len = 0;
+ GDKfree(data);
if (buf == NULL || fdin == NULL || fdout == NULL){
if (fdin) {
mnstr_close(fdin);
@@ -203,6 +210,8 @@ SERVERlistenThread(SOCKET *Sock)
SOCKET sock = INVALID_SOCKET;
SOCKET usock = INVALID_SOCKET;
SOCKET msgsock = INVALID_SOCKET;
+ struct challengedata *data;
+ MT_Id tid;
if (*Sock) {
sock = Sock[0];
@@ -356,9 +365,17 @@ SERVERlistenThread(SOCKET *Sock)
printf("server:accepted\n");
fflush(stdout);
#endif
- doChallenge(
- socket_rastream(msgsock, "Server read"),
- socket_wastream(msgsock, "Server write"));
+ data = GDKmalloc(sizeof(*data));
+ data->in = socket_rastream(msgsock, "Server read");
+ data->out = socket_wastream(msgsock, "Server write");
+ if (MT_create_thread(&tid, doChallenge, data, MT_THR_DETACHED))
{
+ mnstr_printf(data->out, "!internal server error (cannot
fork new "
+ "client thread), please try
again later\n");
+ mnstr_flush(data->out);
+ showException(GDKstdout, MAL, "initClient",
+ "cannot fork new client
thread");
+ free(data);
+ }
} while (!ATOMIC_GET(serverexiting, atomicLock, "SERVERlistenThread") &&
!GDKexiting());
(void) ATOMIC_DEC(nlistener, atomicLock, "SERVERlistenThread");
@@ -730,9 +747,22 @@ SERVERresume(void *res)
str
SERVERclient(void *res, const Stream *In, const Stream *Out)
{
+ struct challengedata *data;
+ MT_Id tid;
+
(void) res;
/* in embedded mode we allow just one client */
- doChallenge(*In, *Out);
+ data = GDKmalloc(sizeof(*data));
+ data->in = *In;
+ data->out = *Out;
+ if (MT_create_thread(&tid, doChallenge, data, MT_THR_DETACHED)) {
+ mnstr_printf(data->out, "!internal server error (cannot fork
new "
+ "client thread), please try again
later\n");
+ mnstr_flush(data->out);
+ showException(GDKstdout, MAL, "mapi.SERVERclient",
+ "cannot fork new client thread");
+ free(data);
+ }
return MAL_SUCCEED;
}
diff --git a/sql/benchmarks/tpch/14.sql b/sql/benchmarks/tpch/14.sql
--- a/sql/benchmarks/tpch/14.sql
+++ b/sql/benchmarks/tpch/14.sql
@@ -1,15 +1,3 @@
-select
- 100.00 * sum(case
- when p_type like 'PROMO%'
- then l_extendedprice * (1 - l_discount)
- else 0
- end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue
-from
- lineitem,
- part
-where
- l_partkey = p_partkey
- and l_shipdate >= date '1995-09-01'
- and l_shipdate < date '1995-09-01' + interval '1' month;
+select 100.00 * sum(case when p_type like 'PROMO%' then l_extendedprice * (1 -
l_discount) else 0 end) / sum(l_extendedprice * (1 - l_discount)) as
promo_revenue from lineitem, part where l_partkey = p_partkey and l_shipdate >=
date '1995-09-01' and l_shipdate < date '1995-09-01' + interval '1' month;
select * from optimizer_stats() stats;
diff --git a/tools/merovingian/daemon/client.c
b/tools/merovingian/daemon/client.c
--- a/tools/merovingian/daemon/client.c
+++ b/tools/merovingian/daemon/client.c
@@ -543,6 +543,9 @@ acceptConnections(int sock, int usock)
if (pthread_create(&p->tid, NULL, handleClient, data) == 0) {
p->next = threads;
threads = p;
+ } else {
+ free(data);
+ free(p);
}
} while (_mero_keep_listening);
shutdown(sock, SHUT_RDWR);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list