osaf/services/saf/smfsv/smfd/SmfExecControl.cc      |  121 +++++++------------
 osaf/services/saf/smfsv/smfd/SmfExecControl.h       |   11 +-
 osaf/services/saf/smfsv/smfd/SmfProcState.cc        |    5 +-
 osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc |   39 ++++-
 osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.hh |    2 +
 osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc      |   45 -------
 6 files changed, 84 insertions(+), 139 deletions(-)


diff --git a/osaf/services/saf/smfsv/smfd/SmfExecControl.cc 
b/osaf/services/saf/smfsv/smfd/SmfExecControl.cc
--- a/osaf/services/saf/smfsv/smfd/SmfExecControl.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfExecControl.cc
@@ -29,17 +29,14 @@
 
 namespace execctrl {
 
-static std::vector<SmfUpgradeStep*> 
getStepsMatchingBalancedGroup(SmfUpgradeProcedure* procedure);
-
-static void addInitAndWrapupActionsToProcedure(SmfUpgradeProcedure* procedure,
-    const std::vector<SmfUpgradeAction*>& initactions,
-    const std::vector<SmfUpgradeAction*>& wrapupactions);
+static std::vector<SmfUpgradeStep*> 
getStepsMatchingBalancedGroup(SmfUpgradeProcedure* procedure,
+                                                                  
SmfUpgradeCampaign* ucamp);
 
 static SmfUpgradeStep* mergeStep(SmfUpgradeProcedure* procedure,
-    const std::vector<SmfUpgradeStep*>& steps);
+                                 const std::vector<SmfUpgradeStep*>& steps);
 
 static bool removeDuplicateActivationUnits(SmfUpgradeProcedure * i_newproc,
-                                    SmfUpgradeStep *newStep);
+                                           SmfUpgradeStep *newStep);
 
 
 static bool isNodeInGroup(const std::string& node,
@@ -50,17 +47,18 @@ static bool isNodeInGroup(const std::str
 bool createBalancedProcs() {
   // Creates new procedures based on the ExecControl configuration
   TRACE_ENTER();
-  auto ucamp = SmfCampaignThread::instance()->campaign()->getUpgradeCampaign();
-  auto exechdl = ucamp->getExecControlHdl();
+  SmfCampaign* camp = SmfCampaignThread::instance()->campaign();
+  SmfUpgradeCampaign* ucamp = camp->getUpgradeCampaign();
+  SmfExecControlObjHandler* exechdl = ucamp->getExecControlHdl();
 
   bool errinfo = false;
-  auto numberofss = exechdl->numberOfSingleSteps(&errinfo);
+  SaUint32T numberofss = exechdl->numberOfSingleSteps(&errinfo);
   if (errinfo == false) {
     TRACE("Failed reading attribute from ExecControlHdl");
     return false;
   }
   // Assume that nodesForSingleStep only contains nodes used by the campaign.
-  auto nodesforss = exechdl->nodesForSingleStep(&errinfo);
+  std::vector<std::string> nodesforss = exechdl->nodesForSingleStep(&errinfo);
   if (errinfo == false) {
     TRACE("Failed reading attribute from ExecControlHdl");
     return false;
@@ -102,43 +100,47 @@ bool createBalancedProcs() {
 
 bool createStepForBalancedProc(SmfUpgradeProcedure* procedure) {
   TRACE_ENTER();
+  SmfCampaign* camp = SmfCampaignThread::instance()->campaign();
+  SmfUpgradeCampaign* ucamp = camp->getUpgradeCampaign();
+
   std::vector<SmfUpgradeStep*> steps;
-  std::vector<SmfUpgradeAction*> initactions;
-  std::vector<SmfUpgradeAction*> wrapupactions;
-  for (auto step : getStepsMatchingBalancedGroup(procedure)) {
-    // copy the steps together with actions and callbacks
-    auto oproc = step->getProcedure();
+  for (auto step : getStepsMatchingBalancedGroup(procedure, ucamp)) {
+    // copy steps and callbacks
+    SmfUpgradeProcedure* oproc = step->getProcedure();
     steps.insert(steps.end(),
                  oproc->getProcSteps().begin(),
                  oproc->getProcSteps().end());
-    initactions.insert(initactions.end(),
-                       oproc->getInitActions().begin(),
-                       oproc->getInitActions().end());
-    wrapupactions.insert(wrapupactions.end(),
-                         oproc->getWrapupActions().begin(),
-                         oproc->getWrapupActions().end());
     procedure->getCallbackList(oproc->getUpgradeMethod());
   }
   if (!steps.empty()) {
     SmfUpgradeStep* newstep = mergeStep(procedure, steps);
-    addInitAndWrapupActionsToProcedure(procedure, initactions, wrapupactions);
     removeDuplicateActivationUnits(procedure, newstep);
     procedure->addProcStep(newstep);
   }
+  const std::vector<SmfUpgradeProcedure*>& allprocs = ucamp->getProcedures();
+  if (procedure == (*--allprocs.end())) {
+    // This is the last balanced procedure configure the wrapup actions.
+    for (auto wac : procedure->getWrapupActions()) {
+      const SmfCallbackAction* cba = dynamic_cast<const 
SmfCallbackAction*>(wac);
+      if (cba != nullptr) {
+        const_cast<SmfCallbackAction*>(cba)->setCallbackProcedure(procedure);
+      }
+    }
+  }
   TRACE_LEAVE();
   return true;
 }
 
-bool allStepsMerged(SmfUpgradeProcedure* procedure) {
+void disableMergeSteps(SmfUpgradeProcedure* procedure) {
   TRACE_ENTER();
   if (!procedure->getBalancedGroup().empty()) {
     TRACE("not an original proc");
-    return false;
+    return;
   }
-  auto camp = SmfCampaignThread::instance()->campaign();
-  auto allprocs = camp->getUpgradeCampaign()->getProcedures();
-
-  auto nodesforss = 
camp->getUpgradeCampaign()->getExecControlHdl()->nodesForSingleStep(NULL);
+  SmfCampaign* camp = SmfCampaignThread::instance()->campaign();
+  SmfUpgradeCampaign* ucamp = camp->getUpgradeCampaign();
+  SmfExecControlObjHandler* exechdl = ucamp->getExecControlHdl();
+  std::vector<std::string> nodesforss = exechdl->nodesForSingleStep(NULL);
   for (auto& node : nodesforss) {
     node = "safAmfNode=" + std::string(node) + ",safAmfCluster=myAmfCluster";
   }
@@ -150,40 +152,32 @@ bool allStepsMerged(SmfUpgradeProcedure*
       allmerged = false;
     } else {
       TRACE("node in group stepNode:%s", step->getSwNode().c_str());
+      // disable this step, it will be executed in a balanced step
       step->setStepState(SA_SMF_STEP_COMPLETED);
     }
   }
-  TRACE("allStepsMerged returns:%d", allmerged);
+
+  if (allmerged) {
+    // All steps in this procedure are merged to balanced steps therefore we
+    // move the wrapup actions to the last balanced procedure.
+    const std::vector<SmfUpgradeProcedure*>& allprocs = ucamp->getProcedures();
+    auto lastproc = --allprocs.end();
+    for (auto& wact : procedure->getWrapupActions()) {
+      (*lastproc)->addProcWrapupAction(wact);
+    }
+    procedure->clearWrapupActions();
+  }
+
   TRACE_LEAVE();
-  return allmerged;
-}
-
-void trace(const std::string& message) {
-  TRACE("-tracing procedures in UpgradeCampaign:%s", message.c_str());
-  auto camp = SmfCampaignThread::instance()->campaign();
-  for (auto proc : camp->getUpgradeCampaign()->getProcedures()) {
-    TRACE("-procedure: name:%s dn:%s", proc->getName().c_str(), 
proc->getDn().c_str());
-    for (auto step : proc->getProcSteps()) {
-      TRACE("    -step : %s, state %i", step->getDn().c_str(), 
step->getState());
-    }
-    for (auto node : proc->getBalancedGroup()) {
-      TRACE("    balanced node : %s", node.c_str());
-    }
-    for (auto iact : proc->getInitActions()) {
-      auto cba = dynamic_cast<SmfCallbackAction*>(iact);
-      TRACE("    iact cb label : %s", 
cba->getCallback().getCallbackLabel().c_str());
-    }
-  }
 }
 
 std::vector<SmfUpgradeStep*> getStepsMatchingBalancedGroup(
-    SmfUpgradeProcedure* procedure) {
+    SmfUpgradeProcedure* procedure, SmfUpgradeCampaign* ucamp) {
   TRACE_ENTER();
   // For all original procedures check if the steps are in the balanced group
   // of the procedure. Return the matching steps.
   std::vector<SmfUpgradeStep*> steps;
-  auto camp = SmfCampaignThread::instance()->campaign();
-  for (auto proc : camp->getUpgradeCampaign()->getProcedures()) {
+  for (auto proc : ucamp->getProcedures()) {
     if (proc->getBalancedGroup().empty()) {
       for (auto ostep : proc->getProcSteps()) {
         if (isNodeInGroup(ostep->getSwNode(), procedure->getBalancedGroup())) {
@@ -199,29 +193,6 @@ std::vector<SmfUpgradeStep*> getStepsMat
   return steps;
 }
 
-void addInitAndWrapupActionsToProcedure(SmfUpgradeProcedure* procedure,
-    const std::vector<SmfUpgradeAction*>& initactions,
-    const std::vector<SmfUpgradeAction*>& wrapupactions) {
-  // Add Init/WrapupActions to the procedure. The Actions themself contain a
-  // pointer to the procedure.
-  TRACE_ENTER();
-  procedure->addInitActions(initactions);
-  procedure->addWrapupActions(wrapupactions);
-  for (auto iac : initactions) {
-    const SmfCallbackAction* cba = dynamic_cast<const SmfCallbackAction*>(iac);
-    if (cba != nullptr) {
-      const_cast<SmfCallbackAction*>(cba)->setCallbackProcedure(procedure);
-    }
-  }
-  for (auto wac : wrapupactions) {
-    const SmfCallbackAction* cba = dynamic_cast<const SmfCallbackAction*>(wac);
-    if (cba != nullptr) {
-      const_cast<SmfCallbackAction*>(cba)->setCallbackProcedure(procedure);
-    }
-  }
-  TRACE_LEAVE();
-}
-
 SmfUpgradeStep* mergeStep(SmfUpgradeProcedure* procedure,
     const std::vector<SmfUpgradeStep*>& steps) {
   // Create a merged step based on the upgrade step passed in. The in/out
diff --git a/osaf/services/saf/smfsv/smfd/SmfExecControl.h 
b/osaf/services/saf/smfsv/smfd/SmfExecControl.h
--- a/osaf/services/saf/smfsv/smfd/SmfExecControl.h
+++ b/osaf/services/saf/smfsv/smfd/SmfExecControl.h
@@ -46,14 +46,13 @@ namespace execctrl {
    */
   bool createStepForBalancedProc(SmfUpgradeProcedure* procedure);
   /*
-   * Check if an original procedure will have all its steps merged to balanced
-   * procedures. Set the step that will be merged to completed state.
-   *
-   * Return: true, if all steps will be merged
+   * Set the steps that will be merged to completed state and move the wrapup
+   * actions to the last procedure if all steps are to be merged. This is
+   * because we don't want to call the wrapup actions twice if it is not
+   * needed.
    */
-  bool allStepsMerged(SmfUpgradeProcedure* procedure);
+  void disableMergeSteps(SmfUpgradeProcedure* procedure);
 
-  void trace(const std::string& message);
 } // namespace execctrl
 
 #endif  // OPENSAF_STAGING_OSAF_SERVICES_SAF_SMFSV_SMFD_SMFEXECCONTROL_H_
diff --git a/osaf/services/saf/smfsv/smfd/SmfProcState.cc 
b/osaf/services/saf/smfsv/smfd/SmfProcState.cc
--- a/osaf/services/saf/smfsv/smfd/SmfProcState.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfProcState.cc
@@ -259,9 +259,7 @@ SmfProcStateInitial::executeInit(SmfUpgr
                                 LOG_NO("SmfProcStateExecuting::Step 
calculation failed");
                                 return SMF_PROC_FAILED;
                         }
-                        // Some steps will be merged, mark them as completed
-                        execctrl::allStepsMerged(i_proc);
-                        execctrl::trace("after procStateInit allStepsMerged");
+                        execctrl::disableMergeSteps(i_proc);
                 } else {
                         LOG_NO("SmfProcStateInitial::executeInit, create step 
for balanced procedure");
                         if (!execctrl::createStepForBalancedProc(i_proc)) {
@@ -270,7 +268,6 @@ SmfProcStateInitial::executeInit(SmfUpgr
                                 TRACE_LEAVE();
                                 return SMF_PROC_FAILED;
                         }
-                        execctrl::trace("after procStateInit 
createStepsForBalancedProc");
                 }
         } else {
                 TRACE("SmfProcStateInitial::executeInit, Calculate steps");
diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc 
b/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc
--- a/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc
@@ -20,6 +20,7 @@
  * ========================================================================
  */
 #include <string>
+#include <algorithm>
 #include <vector>
 #include <sstream>
 
@@ -433,7 +434,9 @@ SmfUpgradeProcedure::getUpgradeMethod(vo
 void 
 SmfUpgradeProcedure::addProcInitAction(SmfUpgradeAction * i_action)
 {
-       m_procInitAction.push_back(i_action);
+        if (std::find(m_procInitAction.begin(), m_procInitAction.end(), 
i_action) == m_procInitAction.end()) {
+                m_procInitAction.push_back(i_action);
+        }
 }
 
 
//------------------------------------------------------------------------------
@@ -442,7 +445,9 @@ SmfUpgradeProcedure::addProcInitAction(S
 void 
 SmfUpgradeProcedure::addProcWrapupAction(SmfUpgradeAction * i_action)
 {
-       m_procWrapupAction.push_back(i_action);
+        if (std::find(m_procWrapupAction.begin(), m_procWrapupAction.end(), 
i_action) == m_procWrapupAction.end()) {
+                m_procWrapupAction.push_back(i_action);
+        }
 }
 
 
//------------------------------------------------------------------------------
@@ -470,6 +475,13 @@ void
 SmfUpgradeProcedure::switchOver()
 {
        TRACE_ENTER();
+        // If this assert triggers nodesForSingleStep was configured to
+        // contain controllers which is not possible for now.
+        if (!getBalancedGroup().empty()) {
+                LOG_ER("Unexpected SI-swap for balanced procedure. 
nodesForSingleStep possibly contains controller node");
+                osafassert(0);
+        }
+
        TRACE("SmfUpgradeProcedure::switchOver: Create the restart indicator");
        
SmfCampaignThread::instance()->campaign()->getUpgradeCampaign()->createSmfRestartIndicator();
 
@@ -810,28 +822,37 @@ void SmfUpgradeProcedure::getCallbackLis
                switch((*cbkiter)->getAtAction()) {
                        case SmfCallback::beforeLock:
                        {
-                               /*Add this callback ptr to the beforeLock list 
*/
-                               m_beforeLock.push_back(*cbkiter);
+                                if (std::find(m_beforeLock.begin(), 
m_beforeLock.end(), (*cbkiter)) == m_beforeLock.end()){
+                                        m_beforeLock.push_back(*cbkiter);
+                                }
                                break;
                        }
                        case SmfCallback::beforeTermination:
                        {
-                               m_beforeTerm.push_back(*cbkiter);
+                                if (std::find(m_beforeTerm.begin(), 
m_beforeTerm.end(), (*cbkiter)) == m_beforeTerm.end()){
+                                        m_beforeTerm.push_back(*cbkiter);
+                                }
                                break;
                        }
                        case SmfCallback::afterImmModification:
                        {
-                               m_afterImmModify.push_back(*cbkiter);
+                                if (std::find(m_afterImmModify.begin(), 
m_afterImmModify.end(), (*cbkiter)) == m_afterImmModify.end()){
+                                        m_afterImmModify.push_back(*cbkiter);
+                                }
                                break;
                        }
                        case SmfCallback::afterInstantiation:
                        {
-                               m_afterInstantiate.push_back(*cbkiter);
+                                if (std::find(m_afterInstantiate.begin(), 
m_afterInstantiate.end(), (*cbkiter)) == m_afterInstantiate.end()){
+                                        m_afterInstantiate.push_back(*cbkiter);
+                                }
                                break;
                        }
                        case SmfCallback::afterUnlock:
                        {
-                               m_afterUnlock.push_back(*cbkiter);
+                                if (std::find(m_afterUnlock.begin(), 
m_afterUnlock.end(), (*cbkiter)) == m_afterUnlock.end()){
+                                        m_afterUnlock.push_back(*cbkiter);
+                                }
                                break;
                        }
                        default:
@@ -2790,7 +2811,7 @@ SmfUpgradeProcedure::getImmSteps()
                 rc = getImmStepsRolling();
                 if (execMode == SMF_BALANCED_MODE) {
                         // We get here after a SI SWAP, some steps will be 
merged, mark them as completed
-                        execctrl::allStepsMerged(this);
+                        execctrl::disableMergeSteps(this);
                 }
        } else if (upgradeMethod->getUpgradeMethod() == SA_SMF_SINGLE_STEP) {
                 if (execMode == SMF_MERGE_TO_SINGLE_STEP) {  //This is a 
merged single step
diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.hh 
b/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.hh
--- a/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.hh
+++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.hh
@@ -586,6 +586,8 @@ class SmfUpgradeProcedure {
 ///
         const std::vector < SmfUpgradeAction * >& getWrapupActions() { return 
m_procWrapupAction; }
 
+        void clearWrapupActions() { m_procWrapupAction.clear(); }
+
 ///
 /// Purpose:  Add the list of wrapup actions
 /// @param    The list of wrapup actions to add
diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc 
b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
--- a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
@@ -682,51 +682,6 @@ SmfUpgradeStep::lockDeactivationUnits()
        SmfAdminOperation units(&m_deactivationUnit.m_actedOn);
        bool rc = units.lock();
 
-#if 0
-       /*LLDTEST*/
-       bool errinfo = true;
-       SmfExecControlObjHandler *lldtest_p = new SmfExecControlObjHandler;
-       lldtest_p->install();
-       TRACE("LLDTEST 1 %s: procExecMode=%d", __FUNCTION__,
-               lldtest_p->procExecMode(errinfo));
-       TRACE("LLDTEST 1 %s: numberOfSingleSteps=%d", __FUNCTION__,
-               lldtest_p->numberOfSingleSteps(errinfo));
-       TRACE("LLDTEST 1 %s: errinfo = %s", __FUNCTION__,
-               lldtest_p? "true": "false");
-
-       //nodesForSingleStep
-       std::vector <std::string> tst_nodes;
-       tst_nodes = lldtest_p->nodesForSingleStep(errinfo);
-
-       for(auto& tst_node : tst_nodes ) {
-               TRACE("LLDTEST 1 %s: nodesForSingleStep='%s'", __FUNCTION__,
-                tst_node.c_str());
-       }
-
-        // Check what happens if we remove the exec control object copy!
-        //lldtest_p->uninstall();
-
-        delete lldtest_p;
-
-
-        /* Try to create an object again and read attributes */
-        SmfExecControlObjHandler lldtest;
-       TRACE("LLDTEST 2 %s: procExecMode=%d", __FUNCTION__,
-               lldtest.procExecMode(errinfo));
-       TRACE("LLDTEST 2 %s: numberOfSingleSteps=%d", __FUNCTION__,
-               lldtest.numberOfSingleSteps(errinfo));
-       TRACE("LLDTEST 2 %s: errinfo = %s", __FUNCTION__,
-               errinfo? "true": "false");
-
-       //nodesForSingleStep
-       tst_nodes = lldtest.nodesForSingleStep(errinfo);
-
-       for(auto& tst_node : tst_nodes ) {
-               TRACE("LLDTEST 2 %s: nodesForSingleStep='%s'", __FUNCTION__,
-                tst_node.c_str());
-       }
-#endif
-
        return rc;
 }
 

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to