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

Reply via email to