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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel