Changeset: ff17746e8c3d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ff17746e8c3d
Modified Files:
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_client.h
        monetdb5/mal/mal_import.c
        monetdb5/mal/mal_session.c
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_wrapper.c
        sql/backends/monet5/sql_cquery.c
        sql/backends/monet5/wlr.c
        tools/merovingian/client/monetdb.c
        tools/mserver/shutdowntest.c
Branch: trails
Log Message:

Some memory leaks fixings. Also the CQ Scheduler's client is now properly 
closed at the server's shut down.


diffs (291 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
@@ -467,7 +467,7 @@ MCactiveClients(void)
 }
 
 void
-MCcloseClient(Client c)
+MCcloseClient(Client c, int is_cq_client)
 {
 #ifdef MAL_DEBUG_CLIENT
        fprintf(stderr,"closeClient %d " OIDFMT "\n", (int) (c - mal_clients), 
c->user);
@@ -480,7 +480,9 @@ MCcloseClient(Client c)
 
        /* adm is set to disallow new clients entering */
        mal_clients[CONSOLE].mode = FINISHCLIENT;
-       mal_exit();
+       if(!is_cq_client) {
+               mal_exit();
+       }
 }
 
 str
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
@@ -207,7 +207,7 @@ mal_export Client  MCforkClient(Client f
 mal_export void           MCstopClients(Client c);
 mal_export int     MCshutdowninprogress(void);
 mal_export int    MCactiveClients(void);
-mal_export void    MCcloseClient(Client c);
+mal_export void    MCcloseClient(Client c, int is_cq_client);
 mal_export str     MCsuspendClient(int id);
 mal_export str     MCawakeClient(int id);
 mal_export int     MCpushClientInput(Client c, bstream *new_input, int 
listing, char *prompt);
diff --git a/monetdb5/mal/mal_import.c b/monetdb5/mal/mal_import.c
--- a/monetdb5/mal/mal_import.c
+++ b/monetdb5/mal/mal_import.c
@@ -271,13 +271,13 @@ evalFile(str fname, int listing)
        c->listing = listing;
 
        if ( (msg = defaultScenario(c)) ) {
-               MCcloseClient(c);
+               MCcloseClient(c, 0);
                throw(MAL,"mal.eval","%s",msg);
        }
        MSinitClientPrg(c, "user", "main");
 
        msg = runScenario(c,0);
-       MCcloseClient(c);
+       MCcloseClient(c, 0);
        return msg;
 }
 
@@ -338,7 +338,7 @@ compileString(Symbol *fcn, Client cntxt,
                GDKfree(qry);
                GDKfree(b);
                c->usermodule= 0;
-               MCcloseClient(c);
+               MCcloseClient(c, 0);
                throw(MAL,"mal.compile","%s",msg);
        }
 
@@ -352,7 +352,7 @@ compileString(Symbol *fcn, Client cntxt,
        c->curprg = 0;
        c->usermodule= 0;
        /* restore IO channel */
-       MCcloseClient(c);
+       MCcloseClient(c, 0);
        GDKfree(qry);
        GDKfree(b);
        return msg;
@@ -393,7 +393,7 @@ callString(Client cntxt, str s, int list
                c->usermodule = 0;
                GDKfree(b);
                GDKfree(qry);
-               MCcloseClient(c);
+               MCcloseClient(c, 0);
                throw(MAL,"mal.call","%s",msg);
        }
 
@@ -421,7 +421,7 @@ callString(Client cntxt, str s, int list
        c->usermodule = 0; // keep it around
        bstream_destroy(c->fdin);
        c->fdin = 0;
-       MCcloseClient(c);
+       MCcloseClient(c, 0);
        GDKfree(qry);
        GDKfree(b);
        return msg;
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
@@ -460,7 +460,7 @@ MSserveClient(void *dummy)
        str msg = 0;
 
        if (!isAdministrator(c) && MCinitClientThread(c) < 0) {
-               MCcloseClient(c);
+               MCcloseClient(c, 0);
                return MAL_SUCCEED;
        }
        /*
@@ -515,7 +515,7 @@ MSserveClient(void *dummy)
        */
 
        if (!isAdministrator(c))
-               MCcloseClient(c);
+               MCcloseClient(c, 0);
        if (c->usermodule /*&& strcmp(c->usermodule->name, "user") == 0*/) {
                freeModule(c->usermodule);
                c->usermodule = NULL;
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -66,8 +66,8 @@ static struct PIPELINES {
        {"default_pipe",
         "optimizer.inline();"
         "optimizer.remap();"
+        "optimizer.cquery();"
         "optimizer.costModel();"
-        "optimizer.cquery();"
         "optimizer.coercions();"
         "optimizer.evaluate();"
         "optimizer.emptybind();"
@@ -143,8 +143,8 @@ static struct PIPELINES {
        {"no_mitosis_pipe",
         "optimizer.inline();"
         "optimizer.remap();"
+        "optimizer.cquery();"
         "optimizer.costModel();"
-        "optimizer.cquery();"
         "optimizer.coercions();"
         "optimizer.evaluate();"
         "optimizer.emptybind();"
@@ -184,8 +184,8 @@ static struct PIPELINES {
        {"sequential_pipe",
         "optimizer.inline();"
         "optimizer.remap();"
+        "optimizer.cquery();"
         "optimizer.costModel();"
-        "optimizer.cquery();"
         "optimizer.coercions();"
         "optimizer.evaluate();"
         "optimizer.emptybind();"
diff --git a/monetdb5/optimizer/opt_wrapper.c b/monetdb5/optimizer/opt_wrapper.c
--- a/monetdb5/optimizer/opt_wrapper.c
+++ b/monetdb5/optimizer/opt_wrapper.c
@@ -71,7 +71,7 @@ struct{
        {"garbageCollector", &OPTgarbageCollectorImplementation,0,0},
        {"generator", &OPTgeneratorImplementation,0,0},
        {"inline", &OPTinlineImplementation,0,0},
-    {"cquery", &OPTcqueryImplementation,0,0},
+       {"cquery", &OPTcqueryImplementation,0,0},
        {"jit", &OPTjitImplementation,0,0},
        {"json", &OPTjsonImplementation,0,0},
        {"matpack", &OPTmatpackImplementation,0,0},
diff --git a/sql/backends/monet5/sql_cquery.c b/sql/backends/monet5/sql_cquery.c
--- a/sql/backends/monet5/sql_cquery.c
+++ b/sql/backends/monet5/sql_cquery.c
@@ -59,6 +59,7 @@ static int CQinit;
 static int pnstatus = CQINIT;
 static int cycleDelay = 200; /* be careful, it affects response/throughput 
timings */
 static MT_Lock ttrLock;
+static MT_Id cq_pid = 0;
 
 static BAT *CQ_id_tick = 0;
 static BAT *CQ_id_mod = 0;
@@ -90,7 +91,7 @@ CQfree(int idx)
        if( pnet[idx].mb)
                freeMalBlk(pnet[idx].mb);
        if( pnet[idx].stk)
-               GDKfree(pnet[idx].stk);
+               freeStack(pnet[idx].stk);
        GDKfree(pnet[idx].mod);
        GDKfree(pnet[idx].fcn);
        GDKfree(pnet[idx].stmt);
@@ -1393,11 +1394,8 @@ wrapup:
 #ifdef DEBUG_CQUERY
        fprintf(stderr, "#cquery.scheduler stopped\n");
 #endif
-       cntxt->fdin = 0;
-       cntxt->fdout = 0;
-       //bstream_destroy(cntxt->fdin);
-       //mnstr_destroy(cntxt->fdout);
-       //MCcloseClient(cntxt); to be checked, removes too much
+       SQLexitClient(cntxt);
+       MCcloseClient(cntxt, 1);
        pnstatus = CQINIT;
        CQinit = 0;
 }
@@ -1405,7 +1403,6 @@ wrapup:
 str
 CQstartScheduler(void)
 {
-       MT_Id pid;
        Client cntxt;
        stream *fin, *fout;
        bstream *bin;
@@ -1457,19 +1454,16 @@ CQstartScheduler(void)
        cntxt->curmodule = cntxt->usermodule = userModule();
 
        if( SQLinitClient(cntxt) != MAL_SUCCEED) {
-               bstream_destroy(cntxt->fdin);
-               mnstr_destroy(cntxt->fdout);
-               //MCcloseClient(cntxt); check this
+               MCcloseClient(cntxt, 1);
                throw(MAL, "cquery.startScheduler",SQLSTATE(HY001) "Could not 
initialize SQL context in CQscheduler\n");
        }
 
-       if (pnstatus== CQINIT && MT_create_thread(&pid, CQscheduler, (void*) 
cntxt, MT_THR_JOINABLE) != 0){
+       if (pnstatus== CQINIT && MT_create_thread(&cq_pid, CQscheduler, (void*) 
cntxt, MT_THR_JOINABLE) != 0){
 #ifdef DEBUG_CQUERY
                fprintf(stderr, "#Start CQscheduler failed\n");
 #endif
-               bstream_destroy(cntxt->fdin);
-               mnstr_destroy(cntxt->fdout);
-               //MCcloseClient(cntxt); check this
+               SQLexitClient(cntxt);
+               MCcloseClient(cntxt, 1);
                throw(MAL, "cquery.startScheduler",SQLSTATE(HY001) "Could not 
initialize client thread in CQscheduler\n");
        }
        return MAL_SUCCEED;
@@ -1480,6 +1474,10 @@ CQreset(void)
 {
        if(pnet) {
                CQderegisterAll(NULL, NULL, NULL, NULL); //stop all continuous 
queries
+               if(cq_pid > 0) {
+                       MT_join_thread(cq_pid);
+                       cq_pid = 0;
+               }
                GDKfree(pnet);
        }
        pnet = NULL;
diff --git a/sql/backends/monet5/wlr.c b/sql/backends/monet5/wlr.c
--- a/sql/backends/monet5/wlr.c
+++ b/sql/backends/monet5/wlr.c
@@ -316,7 +316,7 @@ WLRprocess(void *arg)
 wrapup:
        wlrprocessrunning =0;
        (void) mnstr_flush(c->fdout);
-       MCcloseClient(c);
+       MCcloseClient(c, 0);
 }
 
 /*
diff --git a/tools/merovingian/client/monetdb.c 
b/tools/merovingian/client/monetdb.c
--- a/tools/merovingian/client/monetdb.c
+++ b/tools/merovingian/client/monetdb.c
@@ -552,6 +552,8 @@ simple_argv_cmd(char *cmd, sabdb *dbs, c
 
        /* do for each listed database */
        for (; dbs != NULL; dbs = dbs->next) {
+               out = NULL;
+               ret = NULL;
                if (premsg != NULL && !monetdb_quiet) {
                        printf("%s '%s'... ", premsg, dbs->dbname);
                        fflush(stdout);
@@ -566,6 +568,7 @@ simple_argv_cmd(char *cmd, sabdb *dbs, c
                        fprintf(stderr, "%s: %s\n",
                                        cmd, ret);
                        free(ret);
+                       free(out);
                        exit(2);
                }
 
@@ -581,12 +584,10 @@ simple_argv_cmd(char *cmd, sabdb *dbs, c
                        if (premsg != NULL && !monetdb_quiet)
                                printf("FAILED\n");
                        fprintf(stderr, "%s: %s\n", cmd, out);
-                       free(out);
-
                        state |= 1;
                }
-
                hadwork = 1;
+               free(out);
        }
 
        if (hadwork == 0) {
diff --git a/tools/mserver/shutdowntest.c b/tools/mserver/shutdowntest.c
--- a/tools/mserver/shutdowntest.c
+++ b/tools/mserver/shutdowntest.c
@@ -87,7 +87,7 @@ static void monetdb_disconnect(void* con
                return;
        }
        (*SQLexitClient_ptr)((Client) conn);
-       MCcloseClient((Client) conn);
+       MCcloseClient((Client) conn, 0);
 }
 
 static str monetdb_initialize(void) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to