osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc | 93 ++++++++++++++++++-------
osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh | 3 +-
2 files changed, 67 insertions(+), 29 deletions(-)
Fix the deleteNodeGroup() method must be so that if the delete operation fails
with bad handles new handles are created so that the node group can be deleted
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
@@ -2823,7 +2823,7 @@ SmfAdminOperation::SmfAdminOperation(std
// and an immediate return is done
// The public methods shall return fail if m_creation_fail is true
- bool rc = getAllImmHandles();
+ bool rc = initAllImmHandles();
if (rc == false) {
LOG_NO("%s: getAllImmHandles Fail", __FUNCTION__);
m_creation_fail = true;
@@ -2860,11 +2860,7 @@ SmfAdminOperation::SmfAdminOperation(std
SmfAdminOperation::~SmfAdminOperation()
{
- // This frees all IMM handles that's based on the omHandle and
- // give up admin ownership of Amf Cluster object
- if (m_omHandle != 0) {
- (void)immutil_saImmOmFinalize(m_omHandle);
- }
+ finalizeAllImmHandles();
}
///
@@ -3079,7 +3075,7 @@ bool SmfAdminOperation::restart()
/// Get all needed IMM handles. Updates corresponding member variables
/// Return false if fail
///
-bool SmfAdminOperation::getAllImmHandles()
+bool SmfAdminOperation::initAllImmHandles()
{
SaAisErrorT ais_rc = SA_AIS_ERR_TRY_AGAIN;
int timeout_try_cnt = 6;
@@ -3156,6 +3152,15 @@ bool SmfAdminOperation::getAllImmHandles
return rc;
}
+// Free all IMM handles that's based on the omHandle and
+// give up admin ownership of Amf Cluster object
+void SmfAdminOperation::finalizeAllImmHandles() {
+ if (m_omHandle != 0) {
+ (void)immutil_saImmOmFinalize(m_omHandle);
+ }
+
+}
+
/// Check if the AIS return is considered a campaign error
/// Do not Fail if any of the following AIS codes
///
@@ -3552,6 +3557,8 @@ bool SmfAdminOperation::createNodeGroup(
// A node group with the same name already exist
// May happen if a previous delete after usage has
// failed
+ LOG_NO("%s: saImmOmCcbObjectCreate_2 Fail %s",
+ __FUNCTION__, saf_error(m_errno));
bool rc = deleteNodeGroup();
if (rc == false) {
LOG_NO("%s: deleteNodeGroup() Fail",
@@ -3591,8 +3598,7 @@ bool SmfAdminOperation::createNodeGroup(
///
bool SmfAdminOperation::deleteNodeGroup()
{
- bool rc = true;
- m_errno = SA_AIS_OK;
+ SaAisErrorT ais_rc = SA_AIS_OK;
TRACE_ENTER();
std::string nodeGroupName_s =
@@ -3602,25 +3608,53 @@ bool SmfAdminOperation::deleteNodeGroup(
&nodeGroupName);
TRACE("\t Deleting nodeGroup '%s'", nodeGroupName_s.c_str());
-
- m_errno = immutil_saImmOmCcbObjectDelete(m_ccbHandle,
- &nodeGroupName);
- if (m_errno != SA_AIS_OK) {
- LOG_NO("%s: saImmOmCcbObjectDelete '%s' Fail %s",
- __FUNCTION__, nodeGroupName_s.c_str(),
- saf_error(m_errno));
- rc = false;
- } else {
- m_errno = saImmOmCcbApply(m_ccbHandle);
- if (m_errno != SA_AIS_OK) {
- LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
- __FUNCTION__, saf_error(m_errno));
- rc = false;
- }
- }
-
- TRACE_LEAVE();
- return rc;
+ bool method_rc = false;
+ const uint32_t MAX_NO_RETRIES = 2;
+ 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,
+ &nodeGroupName);
+ TRACE("%s: immutil_saImmOmCcbObjectDelete %s",
+ __FUNCTION__, saf_error(m_errno));
+
+ if (ais_rc == SA_AIS_ERR_BAD_HANDLE) {
+ LOG_NO("%s: saImmOmCcbObjectDelete Fail %s",
+ __FUNCTION__, saf_error(m_errno));
+ finalizeAllImmHandles();
+ bool rc = initAllImmHandles();
+ if (rc == false) {
+ LOG_NO("%s: getAllImmHandles() Fail",
+ __FUNCTION__);
+ method_rc = false;
+ break;
+ }
+ continue;
+ } else if (ais_rc != SA_AIS_OK) {
+ LOG_NO("%s: saImmOmCcbObjectDelete() '%s' Fail %s",
+ __FUNCTION__, nodeGroupName_s.c_str(),
+ saf_error(ais_rc));
+ method_rc = false;
+ break;
+ } else {
+ ais_rc = saImmOmCcbApply(m_ccbHandle);
+ if (ais_rc != SA_AIS_OK) {
+ LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
+ __FUNCTION__, saf_error(ais_rc));
+ method_rc = false;
+ } else {
+ method_rc = true;
+ }
+ break;
+ }
+ }
+
+ TRACE_LEAVE2("rc %s, ais_rc %s", method_rc? "Ok":"Fail",
+ saf_error(ais_rc));
+ return method_rc;
}
/// Request given admin operation to the SmfSetAdminState instance node group
@@ -3655,6 +3689,9 @@ bool SmfAdminOperation::nodeGroupAdminOp
&nodeGroupName, 0, adminOp, params,
&oi_rc, smfd_cb->adminOpTimeout);
+ if (m_errno == SA_AIS_OK && oi_rc == SA_AIS_OK)
+ break;
+
if (retry <= 0) {
LOG_NO("Fail to invoke admin operation, too many OI "
"TRY_AGAIN, giving up. %s", __FUNCTION__);
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,7 +851,8 @@ class SmfAdminOperation {
bool restart();
private:
- bool getAllImmHandles();
+ bool initAllImmHandles();
+ void finalizeAllImmHandles();
bool isRestartError(SaAisErrorT ais_rc);
// Result in m_nodeList and m_suList
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel