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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list