Changeset: b5dd3b37a0b7 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b5dd3b37a0b7 Modified Files: monetdb5/modules/mal/batExtensions.c monetdb5/modules/mal/manual.c monetdb5/modules/mal/oltp.c monetdb5/modules/mal/querylog.c monetdb5/modules/mal/querylog.h Branch: Jul2017 Log Message:
Better check for failing BAT creation Fixes Bug-6300 and found a few more cases that require better control on succesful creation of a group of BATs. diffs (218 lines): diff --git a/monetdb5/modules/mal/batExtensions.c b/monetdb5/modules/mal/batExtensions.c --- a/monetdb5/modules/mal/batExtensions.c +++ b/monetdb5/modules/mal/batExtensions.c @@ -71,7 +71,7 @@ CMDBATsingle(Client cntxt, MalBlkPtr mb, b = COLnew(0,getArgType(mb,pci,1),0, TRANSIENT); if( b == 0) - throw(MAL,"bat.single","Could not create it"); + throw(MAL,"bat.single",MAL_MALLOC_FAIL); if (ATOMextern(b->ttype)) u = (ptr) *(str *)u; if (BUNappend(b, u, FALSE) != GDK_SUCCEED) { diff --git a/monetdb5/modules/mal/manual.c b/monetdb5/modules/mal/manual.c --- a/monetdb5/modules/mal/manual.c +++ b/monetdb5/modules/mal/manual.c @@ -42,6 +42,7 @@ MANUALcreateOverview(Client cntxt, MalBl BBPreclaim(sig); BBPreclaim(adr); BBPreclaim(com); + throw(MAL, "manual.functions", MAL_MALLOC_FAIL); } list[top++] = cntxt->nspace; diff --git a/monetdb5/modules/mal/oltp.c b/monetdb5/modules/mal/oltp.c --- a/monetdb5/modules/mal/oltp.c +++ b/monetdb5/modules/mal/oltp.c @@ -239,6 +239,7 @@ OLTPtable(Client cntxt, MalBlkPtr mb, Ma if( bu) BBPunfix(bu->batCacheid); if( bc) BBPunfix(bc->batCacheid); if( bq) BBPunfix(bq->batCacheid); + throw(MAL,"oltp.table",MAL_MALLOC_FAIL); } for( i = 0; msg == MAL_SUCCEED && i < MAXOLTPLOCKS; i++) if (oltp_locks[i].used ){ diff --git a/monetdb5/modules/mal/querylog.c b/monetdb5/modules/mal/querylog.c --- a/monetdb5/modules/mal/querylog.c +++ b/monetdb5/modules/mal/querylog.c @@ -79,14 +79,17 @@ static BAT *QLOG_calls_result = 0; static BAT *QLOG_calls_cpuload = 0; static BAT *QLOG_calls_iowait = 0; -void +str QLOGcatalog(BAT **r) { - int i; + int i,cnt = 0; + str msg; + for ( i=0;i < 8; i++) r[i]=0; - if (initQlog()) - return ; + msg = initQlog(); + if( msg) + return msg; MT_lock_set(&mal_profileLock); r[0] = COLcopy(QLOG_cat_id, QLOG_cat_id->ttype, 0, TRANSIENT); r[1] = COLcopy(QLOG_cat_user, QLOG_cat_user->ttype,0, TRANSIENT); @@ -96,17 +99,32 @@ QLOGcatalog(BAT **r) r[5] = COLcopy(QLOG_cat_plan, QLOG_cat_plan->ttype,0, TRANSIENT); r[6] = COLcopy(QLOG_cat_mal, QLOG_cat_mal->ttype,0, TRANSIENT); r[7] = COLcopy(QLOG_cat_optimize, QLOG_cat_optimize->ttype,0, TRANSIENT); + for ( i = 0; i< 8; i++) + cnt += r[i] != 0; + if( cnt != 8){ + for ( i = 0; i< 8; i++) + if( r[i]){ + BBPunfix(r[i]->batCacheid); + r[i]=0; + } + } MT_lock_unset(&mal_profileLock); + if( r[0]) + return MAL_SUCCEED; + throw(MAL,"catalog_queries",MAL_MALLOC_FAIL); } -void +str QLOGcalls(BAT **r) { - int i; + int i, cnt = 0; + str msg; + for ( i=0;i < 10; i++) r[i]=0; - if (initQlog()) - return ; + msg = initQlog(); + if( msg) + return msg; MT_lock_set(&mal_profileLock); r[0] = COLcopy(QLOG_calls_id, QLOG_calls_id->ttype, 0, TRANSIENT); r[1] = COLcopy(QLOG_calls_start, QLOG_calls_start->ttype,0, TRANSIENT); @@ -117,7 +135,19 @@ QLOGcalls(BAT **r) r[6] = COLcopy(QLOG_calls_result, QLOG_calls_result->ttype,0, TRANSIENT); r[7] = COLcopy(QLOG_calls_cpuload, QLOG_calls_cpuload->ttype,0, TRANSIENT); r[8] = COLcopy(QLOG_calls_iowait, QLOG_calls_iowait->ttype,0, TRANSIENT); + for ( i = 0; i< 9; i++) + cnt += r[i] != 0; + if( cnt != 9){ + for ( i = 0; i< 9; i++) + if( r[i]){ + BBPunfix(r[i]->batCacheid); + r[i]=0; + } + } MT_lock_unset(&mal_profileLock); + if( r[0]) + return MAL_SUCCEED; + throw(MAL,"catalog_calls",MAL_MALLOC_FAIL); } static bat commitlist[32]; @@ -173,7 +203,7 @@ static void cleanup(QLOG_calls_iowait); } -static void +static str _initQlog(void) { QLOG_cat_id = QLOGcreate("cat","id",TYPE_oid); @@ -202,7 +232,7 @@ static void QLOG_calls_tuples == NULL || QLOG_calls_exec == NULL || QLOG_calls_result == NULL || QLOG_calls_cpuload == NULL || QLOG_calls_iowait == NULL){ _QLOGcleanup(); - return; + throw(MAL,"querylog.init",MAL_MALLOC_FAIL); } if (QLOG_cat_id == NULL ) @@ -210,17 +240,20 @@ static void else QLOG_init = 1; TMsubcommit_list(commitlist, committop); + return MAL_SUCCEED; } -int +str initQlog(void) { + str msg; + if (QLOG_init) - return 0; /* already initialized */ + return MAL_SUCCEED; /* already initialized */ MT_lock_set(&mal_profileLock); - _initQlog(); + msg = _initQlog(); MT_lock_unset(&mal_profileLock); - return QLOG_init ? 0 : -1; + return msg; } str @@ -263,8 +296,12 @@ QLOGissetFcn(int *ret) str QLOGempty(void *ret) { + str msg; + (void) ret; - initQlog(); + msg = initQlog(); + if( msg) + return msg; MT_lock_set(&mal_profileLock); /* drop all querylog tables */ @@ -303,9 +340,12 @@ QLOGappend(Client cntxt, MalBlkPtr mb, M oid o; InstrPtr sig = getInstrPtr(mb,0); char buf[128], *nme= buf; + str msg; (void) cntxt; - initQlog(); + msg = initQlog(); + if( msg) + return msg; snprintf(buf,128,"%s.%s", getModuleId(sig), getFunctionId(sig)); MT_lock_set(&mal_profileLock); o = BUNfnd(QLOG_cat_id, &mb->tag); @@ -350,9 +390,13 @@ QLOGcall(Client cntxt, MalBlkPtr mb, Mal lng *rtime = getArgReference_lng(stk,pci,6); int *cpu = getArgReference_int(stk,pci,7); int *iowait = getArgReference_int(stk,pci,8); + str msg; + (void) cntxt; - initQlog(); + msg = initQlog(); + if( msg) + return msg; if ( *xtime + *rtime < QLOGthreshold) return MAL_SUCCEED; MT_lock_set(&mal_profileLock); diff --git a/monetdb5/modules/mal/querylog.h b/monetdb5/modules/mal/querylog.h --- a/monetdb5/modules/mal/querylog.h +++ b/monetdb5/modules/mal/querylog.h @@ -11,9 +11,9 @@ #include "mal.h" #include "mal_interpreter.h" -mal_export int initQlog(void); -mal_export void QLOGcatalog(BAT **r); -mal_export void QLOGcalls(BAT **r); +mal_export str initQlog(void); +mal_export str QLOGcatalog(BAT **r); +mal_export str QLOGcalls(BAT **r); mal_export str QLOGenable(void *ret); mal_export str QLOGenableThreshold(void *ret, int *threshold); mal_export str QLOGdisable(void *ret); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list