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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list