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

Reply via email to