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