Browse Source

Mark link with _dependsOn if different nesting level

A disk write in one graph, followed by a disk read in a loop or
child query wasn't marked as dependent - which causes thor problems.

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 13 years ago
parent
commit
c231dd2464
4 changed files with 30 additions and 8 deletions
  1. 8 1
      ecl/hqlcpp/hqlcppc.hpp
  2. 19 4
      ecl/hqlcpp/hqlhtcpp.cpp
  3. 2 2
      ecl/hqlcpp/hqlhtcpp.ipp
  4. 1 1
      ecl/hqlcpp/hqllib.ipp

+ 8 - 1
ecl/hqlcpp/hqlcppc.hpp

@@ -61,13 +61,19 @@ public:
 class HQLCPP_API ABoundActivity : public CInterface, public IInterface
 {
 public:
-    ABoundActivity(IHqlExpression * _dataset, IHqlExpression * _bound, unsigned _activityid, unsigned _graphId, ThorActivityKind _kind) : represents(_dataset), bound(_bound) { activityId = _activityid; graphId = _graphId; outputCount = 0; kind = _kind; }
+    ABoundActivity(IHqlExpression * _dataset, IHqlExpression * _bound, unsigned _activityid, unsigned _containerid, unsigned _graphId, ThorActivityKind _kind)
+        : represents(_dataset), bound(_bound), activityId(_activityid), containerId(_containerid), graphId(_graphId)
+    {
+        outputCount = 0;
+        kind = _kind;
+    }
     IMPLEMENT_IINTERFACE
 
     inline  IHqlExpression * queryBound() const { return bound; }
     inline  IHqlExpression * queryDataset() const { return represents; }
     inline unsigned queryActivityId() const { return activityId; }
     inline ThorActivityKind queryActivityKind() const { return kind; }
+    inline unsigned queryContainerId() const { return containerId; }
     inline unsigned queryGraphId() const { return graphId; }
     inline unsigned nextOutputCount() { return outputCount++; }
     IHqlDelayedCodeGenerator * createOutputCountCallback();
@@ -78,6 +84,7 @@ private:
     HqlExprAttr             represents;
     HqlExprAttr             bound;
     unsigned                activityId;
+    unsigned                containerId;
     unsigned                graphId;
     unsigned                outputCount;
     ThorActivityKind        kind;

+ 19 - 4
ecl/hqlcpp/hqlhtcpp.cpp

@@ -1831,7 +1831,6 @@ ActivityInstance::ActivityInstance(HqlCppTranslator & _translator, BuildCtx & ct
     argsName.set(s.clear().append("oAc").append(activityId).str());
 
     OwnedHqlExpr boundName = createVariable(instanceName, dataset->getType());
-    table = new ThorBoundActivity(dataset, boundName, activityId, translator.curSubGraphId(ctx), kind);
     isMember = false;
     instanceIsLocal = false;
     classStmt = NULL;
@@ -1891,8 +1890,15 @@ ActivityInstance::ActivityInstance(HqlCppTranslator & _translator, BuildCtx & ct
     if (!parentExtract && (translator.getTargetClusterType() == RoxieCluster))
         executedRemotely = isNonLocal(dataset);
 
+
+    unsigned containerId = 0;
     if (containerActivity)
+    {
         containerActivity->hasChildActivity = true;
+        containerId = containerActivity->activityId;
+    }
+
+    table = new ThorBoundActivity(dataset, boundName, activityId, containerId, translator.curSubGraphId(ctx), kind);
 }
 
 ActivityInstance::~ActivityInstance()
@@ -6735,10 +6741,19 @@ void HqlCppTranslator::addDependency(BuildCtx & ctx, ABoundActivity * element, A
             addGraphAttributeInt(edge, "_sourceIndex", outputIndex);
     }
 
-    if (kind == dependencyAtom)
-        addGraphAttributeBool(edge, "_dependsOn", true);
-    else if (kind == childAtom)
+    if (kind == childAtom)
+    {
         addGraphAttributeBool(edge, "_childGraph", true);
+    }
+    else if (kind == dependencyAtom)
+    {
+        addGraphAttributeBool(edge, "_dependsOn", true);
+    }
+    else if (sourceActivity->queryContainerId() != sinkActivity->queryContainerId())
+    {
+        //mark as a dependendency if the source and target aren't at the same depth
+        addGraphAttributeBool(edge, "_dependsOn", true);
+    }
 
     if (whenId)
         addGraphAttributeInt(edge, "_when", whenId);

+ 2 - 2
ecl/hqlcpp/hqlhtcpp.ipp

@@ -30,8 +30,8 @@
 class HQLCPP_API ThorBoundActivity : public ABoundActivity
 {
 public:
-    ThorBoundActivity(IHqlExpression * _dataset, IHqlExpression * _bound, unsigned _activityid, unsigned _graphId, ThorActivityKind _kind) 
-    : ABoundActivity(_dataset->queryBody(), _bound, _activityid, _graphId, _kind) {}
+    ThorBoundActivity(IHqlExpression * _dataset, IHqlExpression * _bound, unsigned _activityid, unsigned _containerid, unsigned _graphId, ThorActivityKind _kind)
+    : ABoundActivity(_dataset->queryBody(), _bound, _activityid, _containerid, _graphId, _kind) {}
 };
 
 //===========================================================================

+ 1 - 1
ecl/hqlcpp/hqllib.ipp

@@ -86,7 +86,7 @@ class ThorBoundLibraryActivity : public ThorBoundActivity
 {
 public:
     ThorBoundLibraryActivity(ABoundActivity * activity, IPropertyTree * _graphNode, HqlCppLibraryInstance * _libraryInstance)
-    : ThorBoundActivity(activity->queryDataset(), activity->queryBound(), activity->queryActivityId(), activity->queryGraphId(), activity->queryActivityKind()) 
+    : ThorBoundActivity(activity->queryDataset(), activity->queryBound(), activity->queryActivityId(), activity->queryContainerId(), activity->queryGraphId(), activity->queryActivityKind())
     {
         graphNode.set(_graphNode);
         libraryInstance.set(_libraryInstance);