The function getNodeDestination() reset elapsedTime to zero cause
the node reboot timeout at waitForNodeDestination() never reach.
If scenario that node reboot cannot come back then campaign is stuck
in executing forever until cluster reset.
---
 src/smf/smfd/SmfUpgradeStep.cc |  1 +
 src/smf/smfd/SmfUtils.cc       | 28 ++++++++++++++--------------
 src/smf/smfd/smfd.h            |  1 +
 3 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/smf/smfd/SmfUpgradeStep.cc b/src/smf/smfd/SmfUpgradeStep.cc
index 4c0ddd192..80da668de 100644
--- a/src/smf/smfd/SmfUpgradeStep.cc
+++ b/src/smf/smfd/SmfUpgradeStep.cc
@@ -2399,6 +2399,7 @@ bool SmfUpgradeStep::nodeReboot() {
       "SmfUpgradeStep::nodeReboot: Waiting to get node destination with 
increased UP counter");
 
   while (true) {
+    elapsedTime = 0;
     for (nodeIt = rebootedNodeList.begin(); nodeIt != rebootedNodeList.end();) 
{
       if (getNodeDestination((*nodeIt).node_name, &nodeDest, &elapsedTime,
                              -1)) {
diff --git a/src/smf/smfd/SmfUtils.cc b/src/smf/smfd/SmfUtils.cc
index 915c086a5..c2931c84b 100644
--- a/src/smf/smfd/SmfUtils.cc
+++ b/src/smf/smfd/SmfUtils.cc
@@ -95,9 +95,6 @@ bool getNodeDestination(const std::string &i_node, 
SmfndNodeDest *o_nodeDest,
 
   TRACE("Find destination for node '%s'", i_node.c_str());
 
-  if (elapsedTime)  // Initialize elapsedTime to zero.
-    *elapsedTime = 0;
-
   /* It seems SaAmfNode objects can be stored, but the code
    * indicates that SaClmNode's are expected. Anyway an attempt
    * to go for it is probably faster that examining IMM classes
@@ -131,12 +128,14 @@ bool getNodeDestination(const std::string &i_node, 
SmfndNodeDest *o_nodeDest,
         LOG_NO("Failed to get node dest for clm node %s", i_node.c_str());
         return false;
       }
-      struct timespec time = {2 * ONE_SECOND, 0};
-      osaf_nanosleep(&time);
-      timeout--;
-      if (elapsedTime) *elapsedTime = *elapsedTime + 2 * ONE_SECOND;
+      struct timespec two_seconds = {TWO_SECONDS, 0};
+      osaf_nanosleep(&two_seconds);
+      timeout -= TWO_SECONDS;
+      if (elapsedTime != nullptr) {
+        *elapsedTime = *elapsedTime + TWO_SECONDS;
+      }
       if (maxWaitTime != -1) {
-        if (*elapsedTime >= maxWaitTime) {
+        if ((elapsedTime != nullptr) && (*elapsedTime >= maxWaitTime)) {
           LOG_NO("Failed to get node dest for clm node %s", i_node.c_str());
           return false;
         }
@@ -163,13 +162,14 @@ bool getNodeDestination(const std::string &i_node, 
SmfndNodeDest *o_nodeDest,
         free(nodeName);
         return false;
       }
-      struct timespec time = {2 * ONE_SECOND, 0};
-      osaf_nanosleep(&time);
-      timeout--;
-      if (elapsedTime) *elapsedTime = *elapsedTime + 2 * ONE_SECOND;
-
+      struct timespec two_seconds = {TWO_SECONDS, 0};
+      osaf_nanosleep(&two_seconds);
+      timeout -= TWO_SECONDS;
+      if (elapsedTime != nullptr) {
+        *elapsedTime = *elapsedTime + TWO_SECONDS;
+      }
       if (maxWaitTime != -1) {
-        if (*elapsedTime >= maxWaitTime) {
+        if ((elapsedTime != nullptr) && (*elapsedTime >= maxWaitTime)) {
           LOG_NO("Failed to get node dest for clm node %s", i_node.c_str());
           free(nodeName);
           return false;
diff --git a/src/smf/smfd/smfd.h b/src/smf/smfd/smfd.h
index 5e8ddeed8..fee7f1905 100644
--- a/src/smf/smfd/smfd.h
+++ b/src/smf/smfd/smfd.h
@@ -67,6 +67,7 @@ extern "C" {
  */
 
 #define ONE_SECOND 1
+#define TWO_SECONDS 2
 
 /* ========================================================================
  *   DATA DECLARATIONS
-- 
2.18.0



_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to