From 24157c85255a68ed42923f8016743d00e88f0ae9 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Mon, 3 Aug 2015 14:57:05 +0200 Subject: [PATCH] EDF11239. Debug of problem concerning container assignment on cloning inside foreach itself inside another foreach. --- src/engine/DeploymentTree.cxx | 20 ------- src/engine/DeploymentTree.hxx | 2 - src/engine/Test/engineIntegrationTest.cxx | 7 +-- src/yacsloader_swig/Test/testSaveLoadRun.py | 59 +++++++++++++++++++++ 4 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/engine/DeploymentTree.cxx b/src/engine/DeploymentTree.cxx index bb5ec34a2..9dc1510df 100644 --- a/src/engine/DeploymentTree.cxx +++ b/src/engine/DeploymentTree.cxx @@ -109,9 +109,6 @@ unsigned char DeploymentTreeOnHeap::appendTask(Task *task, Scheduler *cloner) if((*iter3).first==task) return DeploymentTree::ALREADY_IN_TREE; - // if the task is not in the vector add it under condition - if(!isConsistentTaskRegardingShCompInst(*iter2,cloner)) - return DeploymentTree::DUP_TASK_NOT_COMPATIBLE_WITH_EXISTING_TREE; DEBTRACE("add task to vector of tasks " << task); (*iter2).push_back(pair(task,cloner)); return DeploymentTree::APPEND_OK; @@ -399,23 +396,6 @@ std::vector DeploymentTreeOnHeap::getFreeDeployableTasks() const return ret; } -bool DeploymentTreeOnHeap::isConsistentTaskRegardingShCompInst(std::vector< std::pair >& tasksSharingSameCompInst, Scheduler *cloner) -{ - vector< std::pair >::const_iterator iter; - bool coexistenceOfDifferentSched=false; - for(iter=tasksSharingSameCompInst.begin();iter!=tasksSharingSameCompInst.end() && !coexistenceOfDifferentSched;iter++) - { - coexistenceOfDifferentSched=(((*iter).second)!=cloner); - } - if(!coexistenceOfDifferentSched) - return true; - //In this case the component is duplicated on cloning raising on runtime on different policy (schedulers) than other tasks in tasksSharingSameCompInst - if((tasksSharingSameCompInst[0].first)->getComponent()) - return (tasksSharingSameCompInst[0].first)->getComponent()->isAttachedOnCloning(); - else - return (tasksSharingSameCompInst[0].first)->getContainer()->isAttachedOnCloning(); -} - DeploymentTree::DeploymentTree():_treeHandle(0) { } diff --git a/src/engine/DeploymentTree.hxx b/src/engine/DeploymentTree.hxx index 71a56dee3..2bc0506f6 100644 --- a/src/engine/DeploymentTree.hxx +++ b/src/engine/DeploymentTree.hxx @@ -57,8 +57,6 @@ namespace YACS // bool presenceOfDefaultContainer() const; std::vector getFreeDeployableTasks() const; - private: - static bool isConsistentTaskRegardingShCompInst(std::vector< std::pair >& tasksSharingSameCompInst, Scheduler *cloner); private: mutable int _cnt; std::vector< std::pair > _freePlacableTasks; diff --git a/src/engine/Test/engineIntegrationTest.cxx b/src/engine/Test/engineIntegrationTest.cxx index a2026e1d3..d44fc7873 100644 --- a/src/engine/Test/engineIntegrationTest.cxx +++ b/src/engine/Test/engineIntegrationTest.cxx @@ -2873,9 +2873,10 @@ void EngineIntegrationTest::testForDeployment2() CPPUNIT_ASSERT(!tree.presenceOfDefaultContainer()); //Check that compatibility is checked... ComponentInstanceTest1 *comp1=new ComponentInstanceTest1("FLICA"); - n1S->setComponent(comp1); + /*n1S->setComponent(comp1); CPPUNIT_ASSERT_THROW(n4S->setComponent(comp1),YACS::Exception);//Impossible not compatible between ToyNode1S and ToyNode2S - CPPUNIT_ASSERT_THROW(n2S->setComponent(comp1),YACS::Exception);//Failure here to but due to incompatibility of scopes n2S is in a ForEachLoop and not n1S and comp1 is NOT attached here. + CPPUNIT_ASSERT_THROW(n2S->setComponent(comp1),YACS::Exception);//Failure here to but due to incompatibility of scopes n2S is in a ForEachLoop and not n1S and comp1 is NOT attached here.*/ + n1S->setComponent(comp1); comp1->attachOnCloning(); n2S->setComponent(comp1);//here it's ok because comp1 is attached... tree=graph->getDeploymentTree(); @@ -2894,7 +2895,7 @@ void EngineIntegrationTest::testForDeployment2() CPPUNIT_ASSERT_EQUAL(1, (int) tree.getNumberOfCTDefComponentInstances()); CPPUNIT_ASSERT_EQUAL(1, (int) tree.getNumberOfRTODefComponentInstances()); ComponentInstanceTest2 *comp3=new ComponentInstanceTest2("DKCORE"); n4S->setComponent(comp3); - CPPUNIT_ASSERT_THROW(n5S->setComponent(comp3),YACS::Exception);//For fun just like 19 lines before. + //CPPUNIT_ASSERT_THROW(n5S->setComponent(comp3),YACS::Exception);//For fun just like 19 lines before. comp3->attachOnCloning(); n5S->setComponent(comp3);//ok tree=graph->getDeploymentTree(); diff --git a/src/yacsloader_swig/Test/testSaveLoadRun.py b/src/yacsloader_swig/Test/testSaveLoadRun.py index 5272b6254..d3618ec12 100755 --- a/src/yacsloader_swig/Test/testSaveLoadRun.py +++ b/src/yacsloader_swig/Test/testSaveLoadRun.py @@ -1032,6 +1032,65 @@ else: self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,5L,4L,15L,8L,25L,12L,35L,16L,45L,20L,55L]) pass + def test12(self): + """ Non regression test EDF11239. ForEach into ForEach. Problem on cloning linked to DeloymentTree.appendTask method that was too strong.""" + p=self.r.createProc("Bug11239") + ti=p.createType("int","int") + ti2=p.createSequenceTc("seqint","seqint",ti) + # + cont=p.createContainer("DefaultContainer","Salome") + # + node0=self.r.createForEachLoop("ForEachLoop_int0",ti) + p.edAddChild(node0) + node0.edGetSeqOfSamplesPort().edInitPy(range(4)) + node0.edGetNbOfBranchesPort().edInitInt(2) + # + node00=self.r.createBloc("Bloc0") + node0.edAddChild(node00) + node000_0=self.r.createForEachLoop("ForEachLoop_int1",ti) + node00.edAddChild(node000_0) + node000_0.edGetSeqOfSamplesPort().edInitPy(range(4)) + node000_0.edGetNbOfBranchesPort().edInitInt(3) + # + node0000=self.r.createBloc("Bloc1") + node000_0.edAddChild(node0000) + # + node0000_0=self.r.createScriptNode("","PyScript2") + node0000.edAddChild(node0000_0) + i3=node0000_0.edAddInputPort("i3",ti) + i4=node0000_0.edAddInputPort("i4",ti) + o5=node0000_0.edAddOutputPort("o5",ti) + node0000_0.setScript("o5 = i3 + i4") + node0000_0.setContainer(cont) + node0000_0.setExecutionMode("remote") + p.edAddLink(node0.edGetSamplePort(),i3) + p.edAddLink(node000_0.edGetSamplePort(),i4) + # + node0000_1=self.r.createScriptNode("","PyScript1") + node0000.edAddChild(node0000_1) + o3=node0000_1.edAddOutputPort("o3",ti) + node0000_1.setScript("o3 = 7") + node0000_1.setExecutionMode("local") + p.edAddCFLink(node0000_0,node0000_1) + # + node000_1=self.r.createScriptNode("","PostTraitement") + node00.edAddChild(node000_1) + i7=node000_1.edAddInputPort("i7",ti2) + i5=node000_1.edAddInputPort("i5",ti2) + node000_1.setScript("for i in i7:\n print i\nprint \"separation\"\nfor i in i5:\n print i") + node000_1.setContainer(cont) + node000_1.setExecutionMode("remote") + p.edAddLink(o5,i7) + p.edAddLink(o3,i5) + p.edAddCFLink(node000_0,node000_1) + # + #p.saveSchema("tmpp.xml") + ex = pilot.ExecutorSwig() + self.assertEqual(p.getState(),pilot.READY) + ex.RunW(p,0) + self.assertEqual(p.getState(),pilot.DONE) + pass + pass if __name__ == '__main__': -- 2.30.2