osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc |  103 +++++++++++++++---------
 osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh |    5 +-
 2 files changed, 66 insertions(+), 42 deletions(-)


If not the same handles are used for creating and deleting a node group
(e.g. bad handle error) saImmOmAdminOwnerSet must be used
to connect the node group with the new admin owner

diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc 
b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
--- a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
@@ -2821,30 +2821,17 @@ SmfAdminOperation::SmfAdminOperation(std
        // and an immediate return is done
        // The public methods shall return fail if m_creation_fail is true
 
-       bool rc = initAllImmHandles();
+       bool rc = initNodeGroupOm();
        if (rc == false) {
-               LOG_NO("%s: getAllImmHandles Fail", __FUNCTION__);
+               LOG_NO("%s: initNodeGroupOm Fail", __FUNCTION__);
                m_creation_fail = true;
                return;
        }
-       
-       // Set parent DN for the Node group used for parallel locking
-       rc = setNodeGroupParentDn();
+
+       rc = becomeAdminOwnerOfAmfClusterObj();
        if (rc == false) {
-               LOG_NO("%s: setNodeGroupParentDn Fail", __FUNCTION__);
-               m_creation_fail = true;
-               return;
-       }
-
-       // Become (temporary)admin owner of Amf Cluster object
-       SaNameT nodeGroupParentDn;
-       saAisNameLend(m_nodeGroupParentDn.c_str(), &nodeGroupParentDn);
-       const SaNameT *objectNames[2] = {&nodeGroupParentDn, NULL};
-       SaAisErrorT ais_rc = immutil_saImmOmAdminOwnerSet(m_ownerHandle,
-                                               objectNames, SA_IMM_ONE);
-       if (ais_rc != SA_AIS_OK) {
-               LOG_NO("%s: saImmOmAdminOwnerSet Fail '%s'", __FUNCTION__,
-                       saf_error(ais_rc));
+               LOG_NO("%s: becomeAdminOwnerOfAmfClusterObj Fail",
+                       __FUNCTION__);
                m_creation_fail = true;
                return;
        }
@@ -2858,7 +2845,7 @@ SmfAdminOperation::SmfAdminOperation(std
 
 SmfAdminOperation::~SmfAdminOperation()
 {
-        finalizeAllImmHandles();
+        finalizeNodeGroupOm();
 }
 
 ///
@@ -3073,7 +3060,7 @@ bool SmfAdminOperation::restart()
 /// Get all needed IMM handles. Updates corresponding member variables
 /// Return false if fail
 ///
-bool SmfAdminOperation::initAllImmHandles()
+bool SmfAdminOperation::initNodeGroupOm()
 {
        SaAisErrorT ais_rc = SA_AIS_ERR_TRY_AGAIN;
        int timeout_try_cnt = 6;
@@ -3111,7 +3098,7 @@ bool SmfAdminOperation::initAllImmHandle
                }
        }
 
-       // Admin owner handle
+       // Admin owner handle and Admin owner
        if (rc == true) {
                timeout_try_cnt = 6;
                while (timeout_try_cnt > 0) {
@@ -3129,6 +3116,20 @@ bool SmfAdminOperation::initAllImmHandle
                }
        }
 
+       // Set parent DN for the Node group used for parallel locking and
+       // Connect the admin owner if a node group already exist
+       rc = setNodeGroupParentDn();
+       if (rc == false) {
+               LOG_NO("%s: setNodeGroupParentDn Fail", __FUNCTION__);
+               rc = false;
+       } else {
+               rc = becomeAdminOwnerOfAmfClusterObj();
+               if (rc == false) {
+                       LOG_NO("%s: becomeAdminOwnerOfAmfClusterObj Fail",
+                               __FUNCTION__);
+               }
+       }
+
        // CCB handle
        if (rc == true) {
                timeout_try_cnt = 6;
@@ -3150,9 +3151,27 @@ bool SmfAdminOperation::initAllImmHandle
        return rc;
 }
 
+// Become (temporary)admin owner of Amf Cluster object and node group
+// Needed in order to administrate a node group
+// Return false if Fail
+bool SmfAdminOperation::becomeAdminOwnerOfAmfClusterObj() {
+       SaNameT nodeGroupParentDn;
+       saAisNameLend(m_nodeGroupParentDn.c_str(), &nodeGroupParentDn);
+       const SaNameT *objectNames[2] = {&nodeGroupParentDn, NULL};
+       SaAisErrorT ais_rc = immutil_saImmOmAdminOwnerSet(m_ownerHandle,
+                                               objectNames, SA_IMM_SUBTREE);
+       bool rc = true;
+       if (ais_rc != SA_AIS_OK) {
+               LOG_NO("%s: saImmOmAdminOwnerSet Fail '%s'", __FUNCTION__,
+                       saf_error(ais_rc));
+       }
+
+       return rc;
+}
+
 // Free all IMM handles that's based on the omHandle and
 // give up admin ownership of Amf Cluster object
-void SmfAdminOperation::finalizeAllImmHandles() {
+void SmfAdminOperation::finalizeNodeGroupOm() {
        if (m_omHandle != 0) {
                (void)immutil_saImmOmFinalize(m_omHandle);
        }
@@ -3449,8 +3468,6 @@ bool SmfAdminOperation::setNodeGroupPare
 ///
 bool SmfAdminOperation::createNodeGroup(SaAmfAdminStateT i_fromState)
 {
-       m_errno = SA_AIS_OK;
-
        TRACE_ENTER();
 
        TRACE("\t uniqueNodeName '%s'", m_instanceNodeGroupName.c_str());
@@ -3514,6 +3531,7 @@ bool SmfAdminOperation::createNodeGroup(
                osaf_extended_name_lend(node.name.c_str(), &nodeName[i]);
                nodeNameList[i] = &nodeName[i];
                i++;
+               TRACE("\t Node %d in list '%s'", i, node.name.c_str());
        }
        saAmfNGNodeListAttr.attrValues = nodeNameList;
 
@@ -3532,9 +3550,11 @@ bool SmfAdminOperation::createNodeGroup(
                const_cast<SaImmClassNameT>("SaAmfNodeGroup");
        SaNameT nodeGroupParentDn;
        osaf_extended_name_lend(m_nodeGroupParentDn.c_str(), 
&nodeGroupParentDn);
+       TRACE("\t m_nodeGroupParentDn '%s'", m_nodeGroupParentDn.c_str());
 
        // ------------------------------------
        // Create the node group
+       m_errno = SA_AIS_OK;
        bool method_rc = false;
         const uint32_t MAX_NO_RETRIES = 2;
         uint32_t retry_cnt = 0;
@@ -3592,11 +3612,11 @@ bool SmfAdminOperation::createNodeGroup(
 }
 
 /// Delete the SmfSetAdminState instance specific node group
-/// Return false if Fail. m_ais_errno is set
+/// Return false if Fail. m_errno is set
 ///
 bool SmfAdminOperation::deleteNodeGroup()
 {
-       SaAisErrorT ais_rc = SA_AIS_OK;
+       m_errno = SA_AIS_OK;
 
        TRACE_ENTER();
        std::string nodeGroupName_s =
@@ -3607,41 +3627,44 @@ bool SmfAdminOperation::deleteNodeGroup(
 
        TRACE("\t Deleting nodeGroup '%s'", nodeGroupName_s.c_str());
        bool method_rc = false;
-        const uint32_t MAX_NO_RETRIES = 2;
+        const uint32_t MAX_NO_RETRIES = 3;
         uint32_t retry_cnt = 0;
         while (++retry_cnt <= MAX_NO_RETRIES) {
                 // Handles including ccb handle may have been invalidated by
                 // IMM resulting in SA_AIS_ERR_BAD_HANDLE response on the
                 // delete object request.
                 // If that's the case: Try to create new handles and try again
-                ais_rc = immutil_saImmOmCcbObjectDelete(m_ccbHandle,
+                m_errno = immutil_saImmOmCcbObjectDelete(m_ccbHandle,
                         &nodeGroupName);
                 TRACE("%s: immutil_saImmOmCcbObjectDelete %s",
                         __FUNCTION__, saf_error(m_errno));
 
-                if (ais_rc == SA_AIS_ERR_BAD_HANDLE) {
+                if (m_errno == SA_AIS_ERR_BAD_HANDLE ||
+                   m_errno == SA_AIS_ERR_BAD_OPERATION) {
                         LOG_NO("%s: saImmOmCcbObjectDelete Fail %s",
                                __FUNCTION__, saf_error(m_errno));
-                        finalizeAllImmHandles();
-                        bool rc = initAllImmHandles();
+                        finalizeNodeGroupOm();
+                        bool rc = initNodeGroupOm();
                         if (rc == false) {
-                                LOG_NO("%s: getAllImmHandles() Fail",
+                                LOG_NO("%s: initNodeGroupOm() Fail",
                                        __FUNCTION__);
                                 method_rc = false;
                                 break;
                         }
+                       TRACE("\t Try again after %s",
+                               saf_error(m_errno));
                         continue;
-                } else if (ais_rc != SA_AIS_OK) {
+                } else if (m_errno != SA_AIS_OK) {
                       LOG_NO("%s: saImmOmCcbObjectDelete() '%s' Fail %s",
                                 __FUNCTION__, nodeGroupName_s.c_str(),
-                      saf_error(ais_rc));
+                      saf_error(m_errno));
                       method_rc = false;
                       break;
                 } else {
-                        ais_rc = saImmOmCcbApply(m_ccbHandle);
-                        if (ais_rc != SA_AIS_OK) {
+                        m_errno = saImmOmCcbApply(m_ccbHandle);
+                        if (m_errno != SA_AIS_OK) {
                                 LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
-                                        __FUNCTION__, saf_error(ais_rc));
+                                        __FUNCTION__, saf_error(m_errno));
                                 method_rc = false;
                         } else {
                                 method_rc = true;
@@ -3650,8 +3673,8 @@ bool SmfAdminOperation::deleteNodeGroup(
                 }
         }
 
-       TRACE_LEAVE2("rc %s, ais_rc %s", method_rc? "Ok":"Fail",
-                 saf_error(ais_rc));
+       TRACE_LEAVE2("rc %s, m_errno %s", method_rc? "Ok":"Fail",
+                 saf_error(m_errno));
        return method_rc;
 }
 
diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh 
b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh
--- a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh
+++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh
@@ -851,8 +851,9 @@ class SmfAdminOperation {
        bool restart();
 
     private:
-       bool initAllImmHandles();
-        void finalizeAllImmHandles();
+       bool initNodeGroupOm();
+        bool becomeAdminOwnerOfAmfClusterObj();
+        void finalizeNodeGroupOm();
        bool isRestartError(SaAisErrorT ais_rc);
 
        // Result in m_nodeList and m_suList

------------------------------------------------------------------------------
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