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