osaf/services/saf/amf/amfd/si.cc | 89 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 88 insertions(+), 1 deletions(-)
As N+M SU(s) are unlocked and having assignment, if dynamically adding an SI
(without specified saAmfSIAdminState) that causes the standby controller reboots
If additional SI is added without specified saAmfSIAdminState, the admin state
will be set as UNLOCKED as default. And if the configuration has enough
capability
to establish new assignment for additional SI, the active amfd will checkpoint
the current active assignment with standby amfd in the flow of CCB. Sometimes,
this checkpoint comes to standby amfd before standby amfd creates additional SI
by CCB apply. Therfore, standby amfd can't find the SI in checkpoint, then node
reboots by a false assert.
In AMF PR, 7.1.3 Add an SI in an SG without locking SG, the additonal SI should
be in admin LOCKED state while it's being added. The patch adds validation for
admin state of additional SI.
diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc
--- a/osaf/services/saf/amf/amfd/si.cc
+++ b/osaf/services/saf/amf/amfd/si.cc
@@ -538,6 +538,89 @@ static int is_config_valid(const SaNameT
return 1;
}
+/**
+ * Validates if a SG's admin state is valid for creating a SI
+ * Should only be called if the SI admin state is UNLOCKED
+ * @param si_dn
+ * @param attributes
+ * @param opdata
+ * @return true if so
+ */
+static bool sg_admin_state_is_valid_for_si_create(const SaNameT *si_dn,
+ const SaImmAttrValuesT_2 **attributes,
+ const CcbUtilOperationData_t *opdata)
+{
+ SaNameT sg_name = {0};
+
+ if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSIProtectedbySG"),
+ attributes, 0, &sg_name) != SA_AIS_OK) {
+ TRACE("saAmfSIProtectedbySG is not specified for '%s'",
si_dn->value);
+ return false;
+ }
+
+ const AVD_SG *sg = sg_db->find(Amf::to_string(&sg_name));
+ if (sg != NULL) {
+ // SG had been created
+ // create SI is accepted under LOCKED SG, LOCKED-IN SG is fine
either
+ if (sg->saAmfSGAdminState != SA_AMF_ADMIN_LOCKED ||
+ sg->saAmfSGAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) {
+ TRACE("'%s' created UNLOCKED but '%s' is not locked",
+ si_dn->value, sg_name.value);
+ return false;
+ }
+ } else {
+ // SG does not exist in current model
+ // the check of sg existence should be already done in
is_config_valid
+ osafassert(ccbutil_getCcbOpDataByDN(opdata->ccbId, &sg_name));
+ }
+
+ return true;
+}
+
+/**
+ * Validation performed when a SI is dynamically created with a CCB.
+ * @param dn
+ * @param attributes
+ * @param opdata
+ *
+ * @return bool
+ */
+static bool is_ccb_create_config_valid(const SaNameT *dn,
+ const SaImmAttrValuesT_2 **attributes,
+ const CcbUtilOperationData_t *opdata)
+{
+ SaAmfAdminStateT admstate;
+ SaAisErrorT rc;
+
+ osafassert(opdata != NULL); // must be called in CCB context
+
+ rc = immutil_getAttr("saAmfSIAdminState", attributes, 0, &admstate);
+ // Default value is UNLOCKED if created without a value
+ if (rc != SA_AIS_OK)
+ admstate = SA_AMF_ADMIN_UNLOCKED;
+
+ // locked state is fine
+ if (admstate == SA_AMF_ADMIN_LOCKED)
+ return true;
+
+ if (admstate != SA_AMF_ADMIN_UNLOCKED) {
+ report_ccb_validation_error(opdata,
+ "'%s' created with invalid saAmfSIAdminState (%u)",
+ dn->value, admstate);
+ return false;
+ }
+
+ if (sg_admin_state_is_valid_for_si_create(dn, attributes, opdata))
+ return true;
+
+ amflog(SA_LOG_SEV_NOTICE, "CCB %d creation of '%s' failed",
+ opdata->ccbId, dn->value);
+ report_ccb_validation_error(opdata,
+ "SG is not configured properly to allow creation of UNLOCKED
SI");
+
+ return false;
+}
+
static AVD_SI *si_create(SaNameT *si_name, const SaImmAttrValuesT_2
**attributes)
{
unsigned int i;
@@ -1002,8 +1085,12 @@ static SaAisErrorT si_ccb_completed_cb(C
switch (opdata->operationType) {
case CCBUTIL_CREATE:
- if (is_config_valid(&opdata->objectName,
opdata->param.create.attrValues, opdata))
+ if (is_config_valid(&opdata->objectName,
+ opdata->param.create.attrValues, opdata) &&
+ is_ccb_create_config_valid(&opdata->objectName,
+ opdata->param.create.attrValues,
opdata)) {
rc = SA_AIS_OK;
+ }
break;
case CCBUTIL_MODIFY:
rc = si_ccb_completed_modify_hdlr(opdata);
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel