This fix extends the previous one of #2209 which was on node level.
In particular, it is to eliminate any duplicate DU/AU on SU or component
level when merging forAddRemove and forModify/rolling procedures into a
single-step procedure for one-step upgrade execution mode.
---
 src/smf/smfd/SmfUpgradeProcedure.cc | 83 +++++++++++++++++++++++++++++++------
 1 file changed, 71 insertions(+), 12 deletions(-)

diff --git a/src/smf/smfd/SmfUpgradeProcedure.cc 
b/src/smf/smfd/SmfUpgradeProcedure.cc
index 2937c70..8d527d3 100644
--- a/src/smf/smfd/SmfUpgradeProcedure.cc
+++ b/src/smf/smfd/SmfUpgradeProcedure.cc
@@ -1,6 +1,7 @@
 /*
  *
  * (C) Copyright 2009 The OpenSAF Foundation
+ * Copyright (C) 2018 Ericsson AB. All Rights Reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -1359,7 +1360,7 @@ bool 
SmfUpgradeProcedure::mergeStepIntoSingleStep(SmfUpgradeProcedure *i_proc,
   for (unit_iter = tmpDU.begin(); unit_iter != tmpDU.end();) {
     if ((*unit_iter).name.find("safSu=") == 0) {  // DU is a SU
       suLevelDU.push_back(
-          *unit_iter);  // A node will never be optimized away, save it
+          *unit_iter);
       unit_iter = tmpDU.erase(unit_iter);  // Remove the SU and update iterator
     } else {
       ++unit_iter;
@@ -1388,41 +1389,99 @@ bool 
SmfUpgradeProcedure::mergeStepIntoSingleStep(SmfUpgradeProcedure *i_proc,
   // because there is a chance that Su/comp can be removed if they are in the
   // scope of the node/Su.
 
-  std::list<unitNameAndState>::iterator addRemoveUnit_iter, nodeLevel_iter;
+  std::list<unitNameAndState>::iterator addRemoveUnit_iter, mergedUnit_iter;
   for (addRemoveUnit_iter = forAddRemoveAU.begin();
        addRemoveUnit_iter != forAddRemoveAU.end();) {
-    for (nodeLevel_iter = nodeLevelDU.begin();
-         nodeLevel_iter != nodeLevelDU.end(); ++nodeLevel_iter) {
-      if ((*addRemoveUnit_iter).name == (*nodeLevel_iter).name) {
+    for (mergedUnit_iter = nodeLevelDU.begin();
+         mergedUnit_iter != nodeLevelDU.end(); ++mergedUnit_iter) {
+      if ((*addRemoveUnit_iter).name == (*mergedUnit_iter).name) {
         // if item is already presented in nodeLevelDU, erase it from the
         // forAddRemove list
         LOG_NO(
-            "[%s] is already presented in the merged DU list, remove it from 
forAddRemoveAU list",
+            "[%s] is already present in the merged AU list, "
+            "remove it from forAddRemoveAU list",
             (*addRemoveUnit_iter).name.c_str());
         addRemoveUnit_iter = forAddRemoveAU.erase(addRemoveUnit_iter);
         break;
       }
     }
-    if (nodeLevel_iter == nodeLevelDU.end()) {
+    // Find and remove any duplicate SU-level AU between suLevelDU
+    // and forAddRemoveAU lists
+    if (mergedUnit_iter == nodeLevelDU.end()) {
+      for (mergedUnit_iter = suLevelDU.begin();
+           mergedUnit_iter != suLevelDU.end(); ++mergedUnit_iter) {
+        if ((*addRemoveUnit_iter).name == (*mergedUnit_iter).name) {
+          LOG_NO("[%s] is already present in the merged AU list, "
+                 "remove it from forAddRemoveAU list",
+                 (*addRemoveUnit_iter).name.c_str());
+          addRemoveUnit_iter = forAddRemoveAU.erase(addRemoveUnit_iter);
+          break;
+        }
+      }
+    }
+    // Find and remove any duplicate comp-level AU between tmpDU
+    // and forAddRemoveAU lists
+    if (mergedUnit_iter == suLevelDU.end()) {
+      for (mergedUnit_iter = tmpDU.begin();
+           mergedUnit_iter != tmpDU.end(); ++mergedUnit_iter) {
+        if ((*addRemoveUnit_iter).name == (*mergedUnit_iter).name) {
+          LOG_NO("[%s] is already present in the merged AU list, "
+                 "remove it from forAddRemoveAU list",
+                 (*addRemoveUnit_iter).name.c_str());
+          addRemoveUnit_iter = forAddRemoveAU.erase(addRemoveUnit_iter);
+          break;
+        }
+      }
+    }
+    if (mergedUnit_iter == tmpDU.end()) {
       ++addRemoveUnit_iter;
     }
   }
 
   for (addRemoveUnit_iter = forAddRemoveDU.begin();
        addRemoveUnit_iter != forAddRemoveDU.end();) {
-    for (nodeLevel_iter = nodeLevelDU.begin();
-         nodeLevel_iter != nodeLevelDU.end(); ++nodeLevel_iter) {
-      if ((*addRemoveUnit_iter).name == (*nodeLevel_iter).name) {
+    for (mergedUnit_iter = nodeLevelDU.begin();
+         mergedUnit_iter != nodeLevelDU.end(); ++mergedUnit_iter) {
+      if ((*addRemoveUnit_iter).name == (*mergedUnit_iter).name) {
         // if item is already presented in nodeLevelDU, erase it from the
         // forAddRemove list
         LOG_NO(
-            "[%s] is already presented in the merged DU list, remove it from 
forAddRemoveDU list",
+            "[%s] is already present in the merged DU list, "
+            "remove it from forAddRemoveDU list",
             (*addRemoveUnit_iter).name.c_str());
         addRemoveUnit_iter = forAddRemoveDU.erase(addRemoveUnit_iter);
         break;
       }
     }
-    if (nodeLevel_iter == nodeLevelDU.end()) {
+    // Find and remove any duplicate SU-level DU between suLevelDU
+    // and forAddRemoveDU lists
+    if (mergedUnit_iter == nodeLevelDU.end()) {
+      for (mergedUnit_iter = suLevelDU.begin();
+           mergedUnit_iter != suLevelDU.end(); ++mergedUnit_iter) {
+        if ((*addRemoveUnit_iter).name == (*mergedUnit_iter).name) {
+          LOG_NO("[%s] is already present in the merged DU list, "
+                 "remove it from forAddRemoveDU list",
+                 (*addRemoveUnit_iter).name.c_str());
+          addRemoveUnit_iter = forAddRemoveDU.erase(addRemoveUnit_iter);
+          break;
+        }
+      }
+    }
+    // Find and remove any duplicate comp-level DU between tmpDU
+    // and forAddRemoveDU lists
+    if (mergedUnit_iter == suLevelDU.end()) {
+      for (mergedUnit_iter = tmpDU.begin();
+           mergedUnit_iter != tmpDU.end(); ++mergedUnit_iter) {
+        if ((*addRemoveUnit_iter).name == (*mergedUnit_iter).name) {
+          LOG_NO("[%s] is already present in the merged DU list, "
+                 "remove it from forAddRemoveDU list",
+                 (*addRemoveUnit_iter).name.c_str());
+          addRemoveUnit_iter = forAddRemoveDU.erase(addRemoveUnit_iter);
+          break;
+        }
+      }
+    }
+    if (mergedUnit_iter == tmpDU.end()) {
       ++addRemoveUnit_iter;
     }
   }
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to