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