|
From: <nag...@or...> - 2015-06-26 09:33:25
|
osaf/libs/common/immsv/include/immutil.h | 8 +++++
osaf/services/saf/amf/amfd/imm.cc | 43 +++++++++++++++++++++++++++++--
osaf/services/saf/amf/amfd/sg_2n_fsm.cc | 9 ++++++
osaf/tools/safimm/src/immutil.c | 7 +++++
4 files changed, 63 insertions(+), 4 deletions(-)
If ccb op is going on and mw s/w is issued then,
some times, Amf stuck in imm apis. The reason is
if ccb op is going on, then imm doesn't allow
to set implementer and Amf hangs.
So, Ccb and mw switch op should not be
allowed to run together.
1. Reject ccb op if mw si swap is going on.
2. Reject mw si swap if ccb op is going on.
diff --git a/osaf/libs/common/immsv/include/immutil.h b/osaf/libs/common/immsv/include/immutil.h
--- a/osaf/libs/common/immsv/include/immutil.h
+++ b/osaf/libs/common/immsv/include/immutil.h
@@ -34,6 +34,7 @@
#include <sys/types.h>
#include <regex.h>
#include <limits.h>
+#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
@@ -125,6 +126,13 @@ extern "C" {
struct CcbUtilCcbData *ccbutil_getCcbData(SaImmOiCcbIdT id);
/**
+ * Find if there is any ccb op going on.
+ * @param id : None.
+ * @return : true if no ccb op undergoing else false.
+ */
+ bool ccbutil_EmptyCcbExists();
+
+/**
* Delete a CCB object. All memory associated with the CCB is freed.
* @param id The CCB identity tag.
*/
diff --git a/osaf/services/saf/amf/amfd/imm.cc b/osaf/services/saf/amf/amfd/imm.cc
--- a/osaf/services/saf/amf/amfd/imm.cc
+++ b/osaf/services/saf/amf/amfd/imm.cc
@@ -765,9 +765,20 @@ static SaAisErrorT ccb_object_create_cb(
int i = 0;
const SaImmAttrValuesT_2 *attrValue;
AVSV_AMF_CLASS_ID id_from_class_name, id_from_dn;
+ char err_str[] = "Ccb create failed, m/w role switch going on";
TRACE_ENTER2("CCB ID %llu, class %s, parent '%s'", ccb_id, class_name, parent_name->value);
+ /* Reject adm ops if we are in the middle of a role switch. */
+ if (avd_cb->swap_switch == SA_TRUE) {
+ rc = SA_AIS_ERR_TRY_AGAIN;
+ LOG_ER("CCB %llu validation error: %s", ccb_id, err_str);
+ saflog(LOG_NOTICE, amfSvcUsrName, "CCB %llu validation error: %s",
+ ccb_id, err_str);
+ (void) saImmOiCcbSetErrorString(avd_cb->immOiHandle, ccb_id, err_str);
+ goto done;
+ }
+
if ((ccb_util_ccb_data = ccbutil_getCcbData(ccb_id)) == NULL) {
LOG_ER("Failed to get CCB object for %llu", ccb_id);
rc = SA_AIS_ERR_NO_MEMORY;
@@ -838,9 +849,20 @@ static SaAisErrorT ccb_object_delete_cb(
{
SaAisErrorT rc = SA_AIS_OK;
struct CcbUtilCcbData *ccb_util_ccb_data;
+ char err_str[] = "Ccb delete failed, m/w role switch going on";
TRACE_ENTER2("CCB ID %llu, %s", ccb_id, object_name->value);
+ /* Reject adm ops if we are in the middle of a role switch. */
+ if (avd_cb->swap_switch == SA_TRUE) {
+ rc = SA_AIS_ERR_TRY_AGAIN;
+ saflog(LOG_NOTICE, amfSvcUsrName, "CCB %llu validation error: %s",
+ ccb_id, err_str);
+ (void) saImmOiCcbSetErrorString(avd_cb->immOiHandle, ccb_id,
+ err_str);
+ goto done;
+ }
+
if ((ccb_util_ccb_data = ccbutil_getCcbData(ccb_id)) != NULL) {
/* "memorize the request" */
ccbutil_ccbAddDeleteOperation(ccb_util_ccb_data, object_name);
@@ -848,7 +870,7 @@ static SaAisErrorT ccb_object_delete_cb(
LOG_ER("Failed to get CCB object for %llu", ccb_id);
rc = SA_AIS_ERR_NO_MEMORY;
}
-
+done:
TRACE_LEAVE2("%u", rc);
return rc;
}
@@ -871,9 +893,20 @@ static SaAisErrorT ccb_object_modify_cb(
{
SaAisErrorT rc = SA_AIS_OK;
struct CcbUtilCcbData *ccb_util_ccb_data;
+ char err_str[] = "Ccb modify failed, m/w role switch going on";
TRACE_ENTER2("CCB ID %llu, %s", ccb_id, object_name->value);
+ /* Reject adm ops if we are in the middle of a role switch. */
+ if (avd_cb->swap_switch == SA_TRUE) {
+ rc = SA_AIS_ERR_TRY_AGAIN;
+ saflog(LOG_NOTICE, amfSvcUsrName, "CCB %llu validation error: %s",
+ ccb_id, err_str);
+ (void) saImmOiCcbSetErrorString(avd_cb->immOiHandle, ccb_id,
+ err_str);
+ goto done;
+ }
+
if ((ccb_util_ccb_data = ccbutil_getCcbData(ccb_id)) != NULL) {
/* "memorize the request" */
if (ccbutil_ccbAddModifyOperation(ccb_util_ccb_data, object_name, attr_mods) != 0) {
@@ -884,7 +917,7 @@ static SaAisErrorT ccb_object_modify_cb(
LOG_ER("Failed to get CCB object for %llu", ccb_id);
rc = SA_AIS_ERR_NO_MEMORY;
}
-
+done:
TRACE_LEAVE2("%u", rc);
return rc;
}
@@ -961,8 +994,10 @@ static void ccb_abort_cb(SaImmOiHandleT
/* Return CCB container memory */
ccb_util_ccb_data = ccbutil_findCcbData(ccb_id);
- osafassert(ccb_util_ccb_data);
- ccbutil_deleteCcbData(ccb_util_ccb_data);
+ /* ccb_util_ccb_data may be NULL when first create/modify/delete cbk
+ was rejected before adding the ccb information in the data base.*/
+ if (ccb_util_ccb_data)
+ ccbutil_deleteCcbData(ccb_util_ccb_data);
TRACE_LEAVE();
}
diff --git a/osaf/services/saf/amf/amfd/sg_2n_fsm.cc b/osaf/services/saf/amf/amfd/sg_2n_fsm.cc
--- a/osaf/services/saf/amf/amfd/sg_2n_fsm.cc
+++ b/osaf/services/saf/amf/amfd/sg_2n_fsm.cc
@@ -825,6 +825,15 @@ SaAisErrorT SG_2N::si_swap(AVD_SI *si, S
goto done;
}
+ /* If the swap is on m/w si, then check whether any ccb was going on. */
+ if (si->sg_of_si->sg_ncs_spec) {
+ if (ccbutil_EmptyCcbExists() == false) {
+ rc = SA_AIS_ERR_TRY_AGAIN;
+ LOG_NO("%s SWAP failed - Ccb going on", si->name.value);
+ goto done;
+ }
+ }
+
/* Check if there is dependency between SI's within SU */
if (avd_sidep_si_dependency_exists_within_su(susi->su)) {
if (avd_sg_susi_mod_snd_honouring_si_dependency(susi->su, SA_AMF_HA_QUIESCED) == NCSCC_RC_FAILURE) {
diff --git a/osaf/tools/safimm/src/immutil.c b/osaf/tools/safimm/src/immutil.c
--- a/osaf/tools/safimm/src/immutil.c
+++ b/osaf/tools/safimm/src/immutil.c
@@ -96,6 +96,13 @@ struct CcbUtilCcbData *ccbutil_findCcbDa
return NULL;
}
+bool ccbutil_EmptyCcbExists() {
+ if (ccbList == NULL) {
+ return true;
+ }
+ return false;
+}
+
struct CcbUtilCcbData *ccbutil_getCcbData(SaImmOiCcbIdT ccbId)
{
struct CcbUtilCcbData *ccbitem = ccbutil_findCcbData(ccbId);
|