osaf/services/saf/amf/amfd/compcstype.cc | 13 ++++++++++---
osaf/services/saf/amf/amfd/imm.cc | 3 ++-
osaf/services/saf/amf/amfd/include/imm.h | 2 +-
osaf/services/saf/amf/amfd/su.cc | 18 ++++++++++++------
4 files changed, 25 insertions(+), 11 deletions(-)
As of now, if saImmOiRtObjectUpdate_2 in context of
SaImmOiRtAttrUpdateCallbackT,
amf still returns OK to imm.
Amf should return FAILED_OP to SaImmOiRtAttrUpdateCallbackT in case, it
couldn't update the attributes successfully.
This case is hitting when object is being deleted and Amf
is trying to update the some of the attributes of that object to imm.
So, if saImmOiRtObjectUpdate_2 fails, then Amf need to abort to
update the other attributes and immediately return FAILED_OP
to imm. Anyway the object is getting deleted.
diff --git a/osaf/services/saf/amf/amfd/compcstype.cc
b/osaf/services/saf/amf/amfd/compcstype.cc
--- a/osaf/services/saf/amf/amfd/compcstype.cc
+++ b/osaf/services/saf/amf/amfd/compcstype.cc
@@ -394,13 +394,14 @@ static SaAisErrorT compcstype_rt_attr_ca
AVD_COMPCS_TYPE *cst = compcstype_db->find(Amf::to_string(objectName));
SaImmAttrNameT attributeName;
int i = 0;
+ SaAisErrorT rc = SA_AIS_OK;
- TRACE("%s", objectName->value);
+ TRACE_ENTER2("%s", objectName->value);
osafassert(cst != NULL);
while ((attributeName = attributeNames[i++]) != NULL) {
if (!strcmp("saAmfCompNumCurrActiveCSIs", attributeName)) {
- avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
+ rc = avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
SA_IMM_ATTR_SAUINT32T,
&cst->saAmfCompNumCurrActiveCSIs);
} else if (!strcmp("saAmfCompNumCurrStandbyCSIs",
attributeName)) {
avd_saImmOiRtObjectUpdate(objectName, attributeName,
@@ -412,7 +413,13 @@ static SaAisErrorT compcstype_rt_attr_ca
}
}
- return SA_AIS_OK;
+ if (rc != SA_AIS_OK) {
+ /* For any failures of update, return FAILED_OP. */
+ rc = SA_AIS_ERR_FAILED_OPERATION;
+ }
+
+ TRACE_LEAVE2("%u", rc);
+ return rc;
}
void avd_compcstype_constructor(void)
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
@@ -1430,7 +1430,7 @@ done:
* @param attrValueType
* @param value
*/
-void avd_saImmOiRtObjectUpdate_sync(const SaNameT *dn, SaImmAttrNameT
attributeName,
+SaAisErrorT avd_saImmOiRtObjectUpdate_sync(const SaNameT *dn, SaImmAttrNameT
attributeName,
SaImmValueTypeT attrValueType, void *value)
{
SaAisErrorT rc;
@@ -1451,6 +1451,7 @@ void avd_saImmOiRtObjectUpdate_sync(cons
LOG_WA("saImmOiRtObjectUpdate of '%s' %s failed with %u",
dn->value, attributeName, rc);
}
+ return rc;
}
/**
diff --git a/osaf/services/saf/amf/amfd/include/imm.h
b/osaf/services/saf/amf/amfd/include/imm.h
--- a/osaf/services/saf/amf/amfd/include/imm.h
+++ b/osaf/services/saf/amf/amfd/include/imm.h
@@ -148,7 +148,7 @@ void avd_class_impl_set(const char *clas
SaAisErrorT avd_imm_default_OK_completed_cb(CcbUtilOperationData_t *opdata);
extern unsigned int avd_imm_config_get(void);
-extern void avd_saImmOiRtObjectUpdate_sync(const SaNameT *dn,
+extern SaAisErrorT avd_saImmOiRtObjectUpdate_sync(const SaNameT *dn,
SaImmAttrNameT attributeName, SaImmValueTypeT attrValueType, void
*value);
extern void avd_saImmOiRtObjectUpdate(const SaNameT* dn, const char
*attributeName,
SaImmValueTypeT attrValueType, void* value);
diff --git a/osaf/services/saf/amf/amfd/su.cc b/osaf/services/saf/amf/amfd/su.cc
--- a/osaf/services/saf/amf/amfd/su.cc
+++ b/osaf/services/saf/amf/amfd/su.cc
@@ -1222,8 +1222,9 @@ static SaAisErrorT su_rt_attr_cb(SaImmOi
AVD_SU *su = su_db->find(Amf::to_string(objectName));
SaImmAttrNameT attributeName;
int i = 0;
+ SaAisErrorT rc = SA_AIS_OK;
- TRACE("%s", objectName->value);
+ TRACE_ENTER2("%s", objectName->value);
while ((attributeName = attributeNames[i++]) != NULL) {
if (!strcmp("saAmfSUAssignedSIs", attributeName)) {
@@ -1234,20 +1235,25 @@ static SaAisErrorT su_rt_attr_cb(SaImmOi
attributeName, SA_IMM_ATTR_SAUINT32T,
&saAmfSUAssignedSIs);
#endif
} else if (!strcmp("saAmfSUNumCurrActiveSIs", attributeName)) {
- avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
+ rc = avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
SA_IMM_ATTR_SAUINT32T,
&su->saAmfSUNumCurrActiveSIs);
} else if (!strcmp("saAmfSUNumCurrStandbySIs", attributeName)) {
- avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
+ rc = avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
SA_IMM_ATTR_SAUINT32T,
&su->saAmfSUNumCurrStandbySIs);
} else if (!strcmp("saAmfSURestartCount", attributeName)) {
- avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
+ rc = avd_saImmOiRtObjectUpdate_sync(objectName,
attributeName,
SA_IMM_ATTR_SAUINT32T,
&su->saAmfSURestartCount);
} else {
LOG_ER("Ignoring unknown attribute '%s'",
attributeName);
}
+ if (rc != SA_AIS_OK) {
+ /* For any failures of update, return FAILED_OP. */
+ rc = SA_AIS_ERR_FAILED_OPERATION;
+ break;
+ }
}
-
- return SA_AIS_OK;
+ TRACE_LEAVE2("%u", rc);
+ return rc;
}
/*****************************************************************************
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel