Changeset: f7d79d21d8d9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f7d79d21d8d9 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out monetdb5/mal/mal_dataflow.c monetdb5/mal/mal_exception.c monetdb5/modules/mal/mdb.c monetdb5/modules/mal/mdb.h monetdb5/modules/mal/mdb.mal Branch: default Log Message:
Added a MAL debugging option to change the gdk_vm_maxsize in flight. It should strictly be used to testing robustness against memory limitations It already uncovered at least one potential serious issue. diffs (160 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -11275,6 +11275,7 @@ stdout of test 'MAL-signatures` in direc [ "mdb", "getStackFrame", "pattern mdb.getStackFrame() (X_0:bat[:str], X_1:bat[:str]) ", "MDBgetStackFrame;", "Collect variable binding of current (n-th) stack frame." ] [ "mdb", "getStackFrame", "pattern mdb.getStackFrame(i:int) (X_0:bat[:str], X_1:bat[:str]) ", "MDBgetStackFrameN;", "" ] [ "mdb", "getStackTrace", "pattern mdb.getStackTrace() (X_0:bat[:int], X_1:bat[:str]) ", "MDBStkTrace;", "" ] +[ "mdb", "getVMsize", "pattern mdb.getVMsize():lng ", "MDBgetVMsize;", "Retrieve the max VM size" ] [ "mdb", "inspect", "pattern mdb.inspect(mod:str, fcn:str):void ", "MDBinspect;", "Run the debugger on a specific function" ] [ "mdb", "list", "pattern mdb.list(M:str, F:str):void ", "MDBlist3;", "Dump the routine M.F on standard out." ] [ "mdb", "list", "pattern mdb.list():void ", "MDBlist;", "Dump the current routine on standard out." ] @@ -11285,6 +11286,7 @@ stdout of test 'MAL-signatures` in direc [ "mdb", "setDebug", "pattern mdb.setDebug(flg:str):int ", "MDBsetDebugStr;", "Set the kernel debugging bit-set and return its previous value.\nThe recognized options are: threads, memory, properties,\nio, transactions, modules, algorithms, estimates." ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:bit):void ", "MDBsetTrace;", "Turn on/off tracing of current routine" ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:str):void ", "MDBsetVarTrace;", "Turn on/off tracing of a variable " ] +[ "mdb", "setVMsize", "pattern mdb.setVMsize(l:lng):lng ", "MDBsetVMsize;", "Manipulate the VM max size in MBs" ] [ "mdb", "start", "pattern mdb.start():void ", "MDBstart;", "Start interactive debugger" ] [ "mdb", "start", "pattern mdb.start(clientid:int):void ", "MDBstart;", "Start interactive debugger on a client" ] [ "mdb", "start", "pattern mdb.start(mod:str, fcn:str):void ", "MDBstartFactory;", "Start interactive debugger on a running factory" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -15678,6 +15678,7 @@ stdout of test 'MAL-signatures` in direc [ "mdb", "getStackFrame", "pattern mdb.getStackFrame() (X_0:bat[:str], X_1:bat[:str]) ", "MDBgetStackFrame;", "Collect variable binding of current (n-th) stack frame." ] [ "mdb", "getStackFrame", "pattern mdb.getStackFrame(i:int) (X_0:bat[:str], X_1:bat[:str]) ", "MDBgetStackFrameN;", "" ] [ "mdb", "getStackTrace", "pattern mdb.getStackTrace() (X_0:bat[:int], X_1:bat[:str]) ", "MDBStkTrace;", "" ] +[ "mdb", "getVMsize", "pattern mdb.getVMsize():lng ", "MDBgetVMsize;", "Retrieve the max VM size" ] [ "mdb", "inspect", "pattern mdb.inspect(mod:str, fcn:str):void ", "MDBinspect;", "Run the debugger on a specific function" ] [ "mdb", "list", "pattern mdb.list(M:str, F:str):void ", "MDBlist3;", "Dump the routine M.F on standard out." ] [ "mdb", "list", "pattern mdb.list():void ", "MDBlist;", "Dump the current routine on standard out." ] @@ -15688,6 +15689,7 @@ stdout of test 'MAL-signatures` in direc [ "mdb", "setDebug", "pattern mdb.setDebug(flg:str):int ", "MDBsetDebugStr;", "Set the kernel debugging bit-set and return its previous value.\nThe recognized options are: threads, memory, properties,\nio, transactions, modules, algorithms, estimates." ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:bit):void ", "MDBsetTrace;", "Turn on/off tracing of current routine" ] [ "mdb", "setTrace", "pattern mdb.setTrace(b:str):void ", "MDBsetVarTrace;", "Turn on/off tracing of a variable " ] +[ "mdb", "setVMsize", "pattern mdb.setVMsize(l:lng):lng ", "MDBsetVMsize;", "Manipulate the VM max size in MBs" ] [ "mdb", "start", "pattern mdb.start():void ", "MDBstart;", "Start interactive debugger" ] [ "mdb", "start", "pattern mdb.start(clientid:int):void ", "MDBstart;", "Start interactive debugger on a client" ] [ "mdb", "start", "pattern mdb.start(mod:str, fcn:str):void ", "MDBstartFactory;", "Start interactive debugger on a running factory" ] diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -1464,6 +1464,7 @@ str MDBgetExceptionReason(str *ret, str str MDBgetExceptionVariable(str *ret, str *msg); str MDBgetStackFrame(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p); str MDBgetStackFrameN(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p); +str MDBgetVMsize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBinspect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBlist(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBlist3(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); @@ -1474,6 +1475,7 @@ str MDBsetCatch(Client cntxt, MalBlkPtr str MDBsetDebug(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBsetDebugStr(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBsetTrace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); +str MDBsetVMsize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBsetVarTrace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBstart(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); str MDBstartFactory(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c --- a/monetdb5/mal/mal_dataflow.c +++ b/monetdb5/mal/mal_dataflow.c @@ -415,7 +415,7 @@ DFLOWworker(void *T) void *null = NULL; /* only collect one error (from one thread, needed for stable testing) */ if (!ATOMIC_PTR_CAS(&flow->error, &null, error)) - GDKfree(error); + freeException(error); /* after an error we skip the rest of the block */ q_enqueue(flow->done, fe); continue; diff --git a/monetdb5/mal/mal_exception.c b/monetdb5/mal/mal_exception.c --- a/monetdb5/mal/mal_exception.c +++ b/monetdb5/mal/mal_exception.c @@ -56,15 +56,20 @@ static str createExceptionInternal(enum static str createExceptionInternal(enum malexception type, const char *fcn, const char *format, va_list ap) { - char *message; + char *message, local[GDKMAXERRLEN]; int len; // if there is an error we allow memory allocation once again #ifndef NDEBUG GDKsetmallocsuccesscount(-1); #endif message = GDKmalloc(GDKMAXERRLEN); - if (message == NULL) + if (message == NULL){ + /* Leave a message behind in the logging system */ + len = snprintf(local, GDKMAXERRLEN, "%s:%s:", exceptionNames[type], fcn); + len = vsnprintf(local + len, GDKMAXERRLEN, format, ap); + fprintf(stderr, "%s", local); return M5OutOfMemory; /* last resort */ + } len = snprintf(message, GDKMAXERRLEN, "%s:%s:", exceptionNames[type], fcn); if (len >= GDKMAXERRLEN) /* shouldn't happen */ return message; diff --git a/monetdb5/modules/mal/mdb.c b/monetdb5/modules/mal/mdb.c --- a/monetdb5/modules/mal/mdb.c +++ b/monetdb5/modules/mal/mdb.c @@ -131,6 +131,31 @@ MDBsetTrace(Client cntxt, MalBlkPtr mb, } str +MDBgetVMsize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) +{ + lng *ret = getArgReference_lng(stk, p, 0); + + (void) cntxt; + (void) mb; /* still unused */ + *ret = GDK_vm_maxsize / 1024/1024; + return MAL_SUCCEED; +} + +/* Set the max VM in MBs */ +str +MDBsetVMsize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) +{ + lng *ret = getArgReference_lng(stk, p, 0); + + (void) cntxt; + (void) mb; /* still unused */ + *ret = GDK_vm_maxsize; + if( *getArgReference_lng(stk, p, 1) > 1024 ) + GDK_vm_maxsize = *getArgReference_lng(stk, p, 1) * 1024 * 1024; + return MAL_SUCCEED; +} + +str MDBsetVarTrace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { str v; diff --git a/monetdb5/modules/mal/mdb.h b/monetdb5/modules/mal/mdb.h --- a/monetdb5/modules/mal/mdb.h +++ b/monetdb5/modules/mal/mdb.h @@ -28,6 +28,8 @@ mal_export str MDBstartFactory(Client cn mal_export str MDBstop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); mal_export str MDBinspect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); mal_export str CMDmodules(bat *bid); +mal_export str MDBsetVMsize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); +mal_export str MDBgetVMsize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); mal_export str MDBsetTrace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); mal_export str MDBsetVarTrace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); mal_export str MDBgetDebugFlags(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); diff --git a/monetdb5/modules/mal/mdb.mal b/monetdb5/modules/mal/mdb.mal --- a/monetdb5/modules/mal/mdb.mal +++ b/monetdb5/modules/mal/mdb.mal @@ -28,6 +28,14 @@ command modules():bat[:str] address CMDmodules comment "List available modules"; +pattern getVMsize():lng +address MDBgetVMsize +comment "Retrieve the max VM size"; + +pattern setVMsize(l:lng):lng +address MDBsetVMsize +comment "Manipulate the VM max size in MBs"; + pattern setTrace(b:bit):void address MDBsetTrace comment "Turn on/off tracing of current routine"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list