Changeset: 7a266c349d8e for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7a266c349d8e Modified Files: monetdb5/mal/mal_function.c monetdb5/mal/mal_interpreter.mx monetdb5/optimizer/opt_dataflow.mx monetdb5/optimizer/opt_deadcode.mx monetdb5/optimizer/opt_emptySet.mx monetdb5/optimizer/opt_evaluate.mx monetdb5/optimizer/opt_garbageCollector.mx monetdb5/optimizer/opt_joinpath.mx monetdb5/optimizer/opt_mergetable.mx monetdb5/optimizer/opt_origin.mx monetdb5/optimizer/opt_recycler.mx monetdb5/optimizer/opt_statistics.c sql/backends/monet5/sql.mx sql/backends/monet5/sql_scenario.c Branch: default Log Message:
Merge with Aug2011 branch. diffs (truncated from 2135 to 300 lines): diff --git a/monetdb5/ChangeLog.Aug2011 b/monetdb5/ChangeLog.Aug2011 --- a/monetdb5/ChangeLog.Aug2011 +++ b/monetdb5/ChangeLog.Aug2011 @@ -1,3 +1,10 @@ # ChangeLog file for MonetDB5 # This file is updated with Maddlog +* Wed Sep 21 2011 Sjoerd Mullender <[email protected]> +- Fixed a problem where MAL variables weren't properly cleared before + reuse of the data strucutre. This problem could cause the data flow + scheduler to generate dependencies between instructions that didn't + actually exist, which in turn could cause circular dependencies among + instructions with deadlock as a result. Bugs 2865 and 2888. + diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c --- a/monetdb5/mal/mal_function.c +++ b/monetdb5/mal/mal_function.c @@ -783,10 +783,10 @@ malGarbageCollector(MalBlkPtr mb) return ; for (i = 0; i < mb->vtop; i++) - if( isVarCleanup(mb,i) && getEndLifespan(span,i) >= 0) { - mb->var[i]->eolife = getEndLifespan(span,i); - mb->stmt[mb->var[i]->eolife]->gc |= GARBAGECONTROL; - } + if( isVarCleanup(mb,i) && getEndLifespan(span,i) >= 0) { + mb->var[i]->eolife = getEndLifespan(span,i); + mb->stmt[mb->var[i]->eolife]->gc |= GARBAGECONTROL; + } GDKfree(span); } /* diff --git a/monetdb5/mal/mal_interpreter.mx b/monetdb5/mal/mal_interpreter.mx --- a/monetdb5/mal/mal_interpreter.mx +++ b/monetdb5/mal/mal_interpreter.mx @@ -1159,6 +1159,7 @@ DFLOWinit(DataFlow flow, Client cntxt, M for (j = p->retc; j < p->argc; j++) { /* list of instructions that wake n-th instruction up */ if (!isVarConstant(mb, getArg(p, j)) && (k = assign[getArg(p, j)])) { + assert(k < pc); /* only dependencies on earlier instructions */ /* add edge to the target instruction for wakeup call */ k -= flow->start; if (flow->nodes[k]) { @@ -1178,7 +1179,7 @@ DFLOWinit(DataFlow flow, Client cntxt, M flow->status[n].blocks++; } - + /* list of instructions to be woken up explicitly */ if ( !isVarConstant(mb, getArg(p, j)) ) { /* be careful, watch out for garbage collection interference */ @@ -1187,6 +1188,7 @@ DFLOWinit(DataFlow flow, Client cntxt, M if (l != pc && l < flow->stop && l > flow->start) { /* add edge to the target instruction for wakeup call */ PARDEBUG mnstr_printf(GDKstdout, "endoflife for %s is %d -> %d\n", getVarName(mb, getArg(p,j)), n + flow->start, l); + assert(pc < l); /* only dependencies on earlier instructions */ l -= flow->start; if (flow->nodes[n]) { /* add wakeup to tail of list */ @@ -1338,26 +1340,26 @@ DFLOWscheduler(DataFlow flow) oldq = queued; if ( f->pc > 0 ) - for (; last >= 0 && (i = flow->nodes[last]) > 0; last = flow->edges[last]) - if (flow->status[i].state == DFLOWpending) { - flow->status[i].argclaim += f->hotclaim; - if (flow->status[i].blocks == 1 && ret == MAL_SUCCEED) { + for (; last >= 0 && (i = flow->nodes[last]) > 0; last = flow->edges[last]) + if (flow->status[i].state == DFLOWpending) { + flow->status[i].argclaim += f->hotclaim; + if (flow->status[i].blocks == 1 && ret == MAL_SUCCEED) { + queued++; + q_enqueue_(flow->todo, flow->status + i); + flow->status[i].state = DFLOWrunning; + flow->status[i].blocks--; + PARDEBUG + mnstr_printf(GDKstdout, "#enqueue pc=%d claim= " LLFMT " queued= %d\n", flow->status[i].pc, flow->status[i].argclaim, queued); + } else { + if (ret == MAL_SUCCEED) + PARDEBUG mnstr_printf(GDKstdout, "#await pc %d block %d claim= " LLFMT "\n", flow->start + i, flow->status[i].blocks, flow->status[i].argclaim); + flow->status[i].blocks--; + } + } else { /* worker stole the candidate */ + PARDEBUG mnstr_printf(GDKstdout, "#woke up pc %d block %d claim " LLFMT "\n", flow->start + i, flow->status[i].blocks, flow->status[i].argclaim); queued++; - q_enqueue_(flow->todo, flow->status + i); - flow->status[i].state = DFLOWrunning; - flow->status[i].blocks--; - PARDEBUG - mnstr_printf(GDKstdout, "#enqueue pc=%d claim= " LLFMT " queued= %d\n", flow->status[i].pc, flow->status[i].argclaim, queued); - } else { - if (ret == MAL_SUCCEED) - PARDEBUG mnstr_printf(GDKstdout, "#await pc %d block %d claim= " LLFMT "\n", flow->start + i, flow->status[i].blocks, flow->status[i].argclaim); - flow->status[i].blocks--; + oldq++; } - } else { /* worker stole the candidate */ - PARDEBUG mnstr_printf(GDKstdout, "#woke up pc %d block %d claim " LLFMT "\n", flow->start + i, flow->status[i].blocks, flow->status[i].argclaim); - queued++; - oldq++; - } if (0 && oldq != queued) /* invalidate */ queue_sort(flow->todo); MT_lock_unset(&flow->todo->l, "q_enqueue"); diff --git a/monetdb5/optimizer/opt_accumulators.mx b/monetdb5/optimizer/opt_accumulators.mx --- a/monetdb5/optimizer/opt_accumulators.mx +++ b/monetdb5/optimizer/opt_accumulators.mx @@ -107,7 +107,7 @@ OPTaccumulatorsImplementation(Client cnt continue; } OPTDEBUGaccumulators - printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL); + printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL); if (p->retc==1 && p->argc == 2) { /* unary operation, avoid clash with binary */ pushInstruction(mb,p); @@ -134,8 +134,8 @@ OPTaccumulatorsImplementation(Client cnt typeChecker(scope, mb, p, TRUE); if (mb->errors || p->typechk == TYPE_UNKNOWN) { OPTDEBUGaccumulators{ - mnstr_printf(cntxt->fdout,"# Failed typecheck"); - printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL); + mnstr_printf(GDKstdout,"# Failed typecheck"); + printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL); } /* reset instruction error buffer */ cntxt->errbuf[0]=0; @@ -144,15 +144,15 @@ OPTaccumulatorsImplementation(Client cnt p=q; /* restore */ } else { OPTDEBUGaccumulators{ - mnstr_printf(cntxt->fdout, "#Found accumulation candidate "); - mnstr_printf(cntxt->fdout, "%d: %d(%d)\n", i, getArg(p,0),getArg(p,2)); - printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL); + mnstr_printf(GDKstdout, "#Found accumulation candidate "); + mnstr_printf(GDKstdout, "%d: %d(%d)\n", i, getArg(p,0),getArg(p,2)); + printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL); } freeInstruction(q); actions++; } OPTDEBUGaccumulators - printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL); + printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL); } pushInstruction(mb,p); } @@ -162,7 +162,7 @@ OPTaccumulatorsImplementation(Client cnt GDKfree(old); GDKfree(span); DEBUGoptimizers - mnstr_printf(cntxt->fdout,"#opt_accumulators:%d accumulations\n",actions); + mnstr_printf(GDKstdout,"#opt_accumulators:%d accumulations\n",actions); return actions; } diff --git a/monetdb5/optimizer/opt_aliases.mx b/monetdb5/optimizer/opt_aliases.mx --- a/monetdb5/optimizer/opt_aliases.mx +++ b/monetdb5/optimizer/opt_aliases.mx @@ -175,7 +175,7 @@ OPTaliasesImplementation(Client cntxt, M GDKfree(span); GDKfree(alias); DEBUGoptimizers - mnstr_printf(cntxt->fdout,"#opt_aliases: %d removed\n",actions); + mnstr_printf(GDKstdout,"#opt_aliases: %d removed\n",actions); return actions; } @include optimizerWrapper.mx diff --git a/monetdb5/optimizer/opt_coercion.mx b/monetdb5/optimizer/opt_coercion.mx --- a/monetdb5/optimizer/opt_coercion.mx +++ b/monetdb5/optimizer/opt_coercion.mx @@ -112,7 +112,7 @@ OPTcoercionImplementation(Client cntxt,M * structure. A cheaper optimizer is sufficient. */ DEBUGoptimizers - mnstr_printf(cntxt->fdout,"#opt_coercion: %d coersions applied\n",actions); + mnstr_printf(GDKstdout,"#opt_coercion: %d coersions applied\n",actions); return actions; } @include optimizerWrapper.mx diff --git a/monetdb5/optimizer/opt_commonTerms.mx b/monetdb5/optimizer/opt_commonTerms.mx --- a/monetdb5/optimizer/opt_commonTerms.mx +++ b/monetdb5/optimizer/opt_commonTerms.mx @@ -189,15 +189,15 @@ OPTcommonTermsImplementation(Client cntx barrier |= getFunctionId(p) == assertRef; if (p->token == NOOPsymbol || p->token == ASSIGNsymbol || barrier /* || p->retc == p->argc */) { #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout, "COMMON SKIPPED[%d] %d %d\n",i, barrier, p->retc == p->argc); + mnstr_printf(GDKstdout, "COMMON SKIPPED[%d] %d %d\n",i, barrier, p->retc == p->argc); #endif continue; } /* from here we have a candidate to look for a match */ #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout,"#CANDIDATE[%d] ",i); - printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL); + mnstr_printf(GDKstdout,"#CANDIDATE[%d] ",i); + printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL); #endif prop = hasSideEffects(p,TRUE) || isUpdateInstruction(p); j = isVarConstant(mb, getArg(p,p->argc-1))? cstlist: candidate; @@ -206,11 +206,11 @@ OPTcommonTermsImplementation(Client cntx for (; j ; j = list[j]) if ( (q=getInstrPtr(mb,j))->fcn == p->fcn && !isUnsafeFunction(q)){ #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout,"#CANDIDATE %d, %d %d %d ", i, j, + mnstr_printf(GDKstdout,"#CANDIDATE %d, %d %d %d ", i, j, hasSameSignature(mb, p, q, p->retc), hasSameArguments(mb, p, q)); - printInstruction(cntxt->fdout, mb, 0, q, LIST_MAL_ALL); - mnstr_printf(cntxt->fdout," :%d %d %d=%d %d %d %d %d %d\n", + printInstruction(GDKstdout, mb, 0, q, LIST_MAL_ALL); + mnstr_printf(GDKstdout," :%d %d %d=%d %d %d %d %d %d\n", q->token != ASSIGNsymbol , list[getArg(q,q->argc-1)],i, !hasCommonResults(p, q), @@ -232,13 +232,13 @@ OPTcommonTermsImplementation(Client cntx ) { if (safetyBarrier(p, q) ){ #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout,"#safetybarrier reached\n"); + mnstr_printf(GDKstdout,"#safetybarrier reached\n"); #endif break; } #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout, "Found a common expression " "%d <-> %d\n", j, i); - printInstruction(cntxt->fdout, mb, 0, q, LIST_MAL_ALL); + mnstr_printf(GDKstdout, "Found a common expression " "%d <-> %d\n", j, i); + printInstruction(GDKstdout, mb, 0, q, LIST_MAL_ALL); #endif clrFunction(p); p->argc = p->retc; @@ -247,8 +247,8 @@ OPTcommonTermsImplementation(Client cntx p= pushArgument(mb,p, getArg(q,k)); } #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout, "COMMON MODIFIED EXPRESSION %d -> %d\n",i,j); - printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL); + mnstr_printf(GDKstdout, "COMMON MODIFIED EXPRESSION %d -> %d\n",i,j); + printInstruction(GDKstdout, mb, 0, p, LIST_MAL_ALL); #endif actions++; break; /* end of search */ @@ -256,8 +256,8 @@ OPTcommonTermsImplementation(Client cntx } #ifdef DEBUG_OPT_COMMONTERMS_MORE else if ( hasSideEffects(q, TRUE) || isUpdateInstruction(p)){ - mnstr_printf(cntxt->fdout, "COMMON SKIPPED %d %d\n", hasSideEffects(q, TRUE) , isUpdateInstruction(p)); - printInstruction(cntxt->fdout, mb, 0, q, LIST_MAL_ALL); + mnstr_printf(GDKstdout, "COMMON SKIPPED %d %d\n", hasSideEffects(q, TRUE) , isUpdateInstruction(p)); + printInstruction(GDKstdout, mb, 0, q, LIST_MAL_ALL); } #endif } @@ -269,9 +269,9 @@ OPTcommonTermsImplementation(Client cntx GDKfree(old); GDKfree(alias); DEBUGoptimizers - mnstr_printf(cntxt->fdout,"#opt_commonTerms: %d statements catched\n",actions); + mnstr_printf(GDKstdout,"#opt_commonTerms: %d statements catched\n",actions); #ifdef DEBUG_OPT_COMMONTERMS_MORE - mnstr_printf(cntxt->fdout,"#opt_commonTerms: %d statements catched\n",actions); + mnstr_printf(GDKstdout,"#opt_commonTerms: %d statements catched\n",actions); #endif return actions; } diff --git a/monetdb5/optimizer/opt_constants.mx b/monetdb5/optimizer/opt_constants.mx --- a/monetdb5/optimizer/opt_constants.mx +++ b/monetdb5/optimizer/opt_constants.mx @@ -66,7 +66,7 @@ OPTconstantsImplementation(Client cntxt, int *alias, *index; VarPtr x,y, *cst; - OPTDEBUGconstants mnstr_printf(cntxt->fdout,"#OPT_CONSTANTS: MATCHING CONSTANTS ELEMENTS\n"); + OPTDEBUGconstants mnstr_printf(GDKstdout,"#OPT_CONSTANTS: MATCHING CONSTANTS ELEMENTS\n"); alias= (int*) GDKzalloc(sizeof(int) * mb->vtop); cst= (VarPtr*) GDKzalloc(sizeof(VarPtr) * mb->vtop); @@ -95,9 +95,9 @@ OPTconstantsImplementation(Client cntxt, x->value.vtype == y->value.vtype && ATOMcmp(x->value.vtype, VALget(&x->value), VALget(&y->value)) == 0){ OPTDEBUGconstants { - mnstr_printf(cntxt->fdout,"#opt_constants: matching elements %s %d %d ", getVarName(mb,i), i,k); - ATOMprint(x->value.vtype,VALget(&x->value),cntxt->fdout); - mnstr_printf(cntxt->fdout,"\n"); + mnstr_printf(GDKstdout,"#opt_constants: matching elements %s %d %d ", getVarName(mb,i), i,k); + ATOMprint(x->value.vtype,VALget(&x->value),GDKstdout); + mnstr_printf(GDKstdout,"\n"); } /* re-use a constant */ alias[i]= index[k]; @@ -107,7 +107,7 @@ OPTconstantsImplementation(Client cntxt, } } if ( fnd == 0){ - OPTDEBUGconstants mnstr_printf(cntxt->fdout,"swith elements %d %d\n", i,n); + OPTDEBUGconstants mnstr_printf(GDKstdout,"swith elements %d %d\n", i,n); _______________________________________________ Checkin-list mailing list [email protected] http://mail.monetdb.org/mailman/listinfo/checkin-list
