소스 검색

HPCC-19420 Assume worse case for unbalanced splitters

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 7 년 전
부모
커밋
251b214977
1개의 변경된 파일10개의 추가작업 그리고 2개의 파일을 삭제
  1. 10 2
      ecl/hqlcpp/hqlresource.cpp

+ 10 - 2
ecl/hqlcpp/hqlresource.cpp

@@ -5259,6 +5259,10 @@ IHqlExpression * EclResourcer::walkPotentialSplitters(CSplitterInfo & connection
     //Are we currently in the process of visiting this node?
     if (info->balancedVisiting)
     {
+        //If this is an unbalanced splitter, then any loops will be found when walking from there
+        if (!info->balanced)
+            return nullptr;
+
 #ifdef TRACE_BALANCED
         printf("//Follow %u->%u has problems....\n", queryResourceInfo(link.queryOther(expr))->balanceId, info->balanceId);
 #endif
@@ -5294,12 +5298,13 @@ IHqlExpression * EclResourcer::walkPotentialSplitterLinks(CSplitterInfo & connec
     info->balancedVisiting = true;
 
     //This may iterate through all links again - but will return quickly if already visited
-    for (unsigned i=0; i < info->balancedLinks.ordinality(); i++)
+    for (unsigned i=0; i < info->balancedLinks.ordinality(); )
     {
         const CSplitterLink & cur = info->balancedLinks.item(i);
         if (&cur != link) // don't walk the link we reached here by
         {
-            if (info->balanced || cur.hasSink(expr))
+            //Only follow links in unbalanced splitters if this is an input, or walking from inputs to outputs
+            if (info->balanced || cur.hasSink(expr) || (link && link->hasSink(expr)))
             {
                 info->curBalanceLink = i;
                 IHqlExpression * problem = walkPotentialSplitters(connections, cur.queryOther(expr), cur);
@@ -5329,9 +5334,12 @@ IHqlExpression * EclResourcer::walkPotentialSplitterLinks(CSplitterInfo & connec
                     printf("//%u marked as unbalanced\n", info->balanceId);
 #endif
                     info->balanced = false;
+                    //walk the link again
+                    continue;
                 }
             }
         }
+        i++;
     }
     info->curBalanceLink = info->balancedLinks.ordinality();
     return NULL;