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.
The fix also corrects return value handling of 
SmfImmUtils::callAdminOperation().
---
 src/smf/smfd/SmfUpgradeProcedure.cc | 83 +++++++++++++++++++++++++++++++------
 src/smf/smfd/SmfUtils.cc            | 11 +++--
 2 files changed, 78 insertions(+), 16 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;
     }
   }
diff --git a/src/smf/smfd/SmfUtils.cc b/src/smf/smfd/SmfUtils.cc
index ccd308c..e6e5c1d 100644
--- a/src/smf/smfd/SmfUtils.cc
+++ b/src/smf/smfd/SmfUtils.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
@@ -555,7 +556,7 @@ done:
 SaAisErrorT SmfImmUtils::callAdminOperation(
     const std::string &i_dn, unsigned int i_operationId,
     const SaImmAdminOperationParamsT_2 **i_params, SaTimeT i_timeout) {
-  SaAisErrorT rc;
+  SaAisErrorT rc, ownerReleaseRc;
   SaAisErrorT returnValue;
   SaNameT objectName;
   int retry = 100;
@@ -627,10 +628,12 @@ SaAisErrorT SmfImmUtils::callAdminOperation(
   rc = returnValue;
 
 done:
-  rc = immutil_saImmOmAdminOwnerRelease(m_ownerHandle, objectNames, 
SA_IMM_ONE);
-  if (rc != SA_AIS_OK) {
+  ownerReleaseRc = immutil_saImmOmAdminOwnerRelease(m_ownerHandle, objectNames,
+                                                    SA_IMM_ONE);
+  if (ownerReleaseRc != SA_AIS_OK) {
     LOG_NO("%s saImmOmAdminOwnerRelease Fail, rc=%s, dn=[%s]", __FUNCTION__,
-           saf_error(rc), i_dn.c_str());
+           saf_error(ownerReleaseRc), i_dn.c_str());
+    rc = ownerReleaseRc;
   }
   TRACE_LEAVE();
   return rc;
-- 
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