Hi Alex After I posted this ack I and Rafael found a possible Non backwards compatibility (NBC) problem. If so this must be solved before pushing.
I believe this change introduce a new behavior when campaigns are executed if a component is failing. If I am right this could be solved by introducing a new attribute in the SMF configuration class that makes it possible to switch on/off this new behavior. The default must be that it is switched off (legacy behavior) also the absence of the new attribute must be interpreted as off (legacy) Thanks Lennart > -----Original Message----- > From: Lennart Lund [mailto:lennart.l...@ericsson.com] > Sent: den 14 november 2016 13:56 > To: Alex Jones <ajo...@genband.com>; reddy.neelaka...@oracle.com; > Rafael Odzakow <rafael.odza...@ericsson.com> > Cc: opensaf-devel@lists.sourceforge.net > Subject: Re: [devel] [PATCH 1 of 1] smfd: add support for asynchronous > detection of failed AMF entities [#2145] > > Hi Alex > > Ack with comment > See my comments/questions inline [Lennart] > > Thanks > Lennart > > > -----Original Message----- > > From: Alex Jones [mailto:ajo...@genband.com] > > Sent: den 11 november 2016 20:50 > > To: reddy.neelaka...@oracle.com; Lennart Lund > > <lennart.l...@ericsson.com>; Rafael Odzakow > > <rafael.odza...@ericsson.com> > > Cc: opensaf-devel@lists.sourceforge.net > > Subject: [PATCH 1 of 1] smfd: add support for asynchronous detection of > > failed AMF entities [#2145] > > > > osaf/services/saf/smfsv/smfd/SmfCampaignThread.cc | 235 > > +++++++++++++++++++++- > > osaf/services/saf/smfsv/smfd/SmfCampaignThread.hh | 15 + > > osaf/services/saf/smfsv/smfd/SmfStepTypes.cc | 32 +- > > 3 files changed, 263 insertions(+), 19 deletions(-) > > > > > > This patch adds support for section 4.2.1.3 of SMF A.01.02 spec. > > > > diff --git a/osaf/services/saf/smfsv/smfd/SmfCampaignThread.cc > > b/osaf/services/saf/smfsv/smfd/SmfCampaignThread.cc > > --- a/osaf/services/saf/smfsv/smfd/SmfCampaignThread.cc > > +++ b/osaf/services/saf/smfsv/smfd/SmfCampaignThread.cc > > @@ -39,6 +39,7 @@ > > #include "SmfUtils.hh" > > > > SmfCampaignThread *SmfCampaignThread::s_instance = NULL; > > +SaNtfSubscriptionIdT SmfCampaignThread::operStateSubId(1); > > > > #define SMF_RDA_RETRY_COUNT 25 /* This is taken as the csi's are > assigned > > in parallel */ > > > > @@ -140,7 +141,12 @@ void SmfCampaignThread::main(NCSCONTEXT > > SmfCampaignThread::~SmfCampaignThread() > > { > > TRACE_ENTER(); > > - SaAisErrorT rc = saNtfFinalize(m_ntfHandle); > > + SaAisErrorT rc(saNtfNotificationUnsubscribe(operStateSubId)); > > + if (rc != SA_AIS_OK) { > > + LOG_ER("Failed to unsubscribe to oper state notifications > > %u", rc); > > + } > [Lennart] Why is this needed? Does not saNtfFinalize remove SMF as a NTF > client including all subscriptions? > > > + > > + rc = saNtfFinalize(m_ntfHandle); > > if (rc != SA_AIS_OK) { > > LOG_ER("Failed to finalize NTF handle %u", rc); > > } > > @@ -303,10 +309,14 @@ int SmfCampaignThread::initNtf(void) > > { > > SaAisErrorT rc = SA_AIS_ERR_TRY_AGAIN; > > SaVersionT ntfVersion = { 'A', 1, 1 }; > > + SaNtfCallbacksT callbacks = { > > + ntfNotificationCallback, > > + 0 > > + }; > > unsigned int numOfTries = 50; > > > > while (rc == SA_AIS_ERR_TRY_AGAIN && numOfTries > 0) { > > - rc = saNtfInitialize(&m_ntfHandle, NULL, &ntfVersion); > > + rc = saNtfInitialize(&m_ntfHandle, &callbacks, &ntfVersion); > > if (rc != SA_AIS_ERR_TRY_AGAIN) { > > break; > > } > > @@ -319,9 +329,202 @@ int SmfCampaignThread::initNtf(void) > > return -1; > > } > > > > + // subscribe to operational state change notifications generated by AMF > > + rc = initNtfSubscriptions(); > > + if (rc != SA_AIS_OK) { > > + LOG_ER("initNtfSubscriptions FAILED rc=%s", saf_error(rc)); > > + return -1; > > + } > > + > > return 0; > > } > > > > +SaAisErrorT SmfCampaignThread::initNtfSubscriptions(void) { > > + TRACE_ENTER(); > > + SaAisErrorT rc(SA_AIS_OK); > > + > > + do { > > + SaNtfStateChangeNotificationFilterT stateChangeFilter; > > + > > + SaAisErrorT rc(saNtfStateChangeNotificationFilterAllocate( > > + m_ntfHandle, > > + &stateChangeFilter, > > + 0, > > + 0, > > + 0, > > + 0, > > + 0, > > + 0)); > > + > > + if (rc != SA_AIS_OK) { > > + LOG_ER("saNtfAttributeChangeNotificationFilterAllocate FAILED > rc=%s", > > + saf_error(rc)); > > + break; > > + } > > + > > + SaNtfNotificationTypeFilterHandlesT notificationFilterHandles = { > > + 0, > > + 0, > > + stateChangeFilter.notificationFilterHandle, > > + 0, > > + 0 > > + }; > > + > > + rc = saNtfNotificationSubscribe(¬ificationFilterHandles, > > operStateSubId); > > + > > + if (rc != SA_AIS_OK) { > > + LOG_ER("saNtfNotificationSubscribe FAILED rc=%s", saf_error(rc)); > > + break; > > + } > > + > > + rc = > > saNtfNotificationFilterFree(stateChangeFilter.notificationFilterHandle); > > + if (rc != SA_AIS_OK) { > > + LOG_ER("saNtfNotificationFilterFree FAILED rc=%s", saf_error(rc)); > > + break; > > + } > > + } while (false); > > + > > + TRACE_LEAVE(); > > + return rc; > > +} > > + > > +bool SmfCampaignThread::isAMFOperState(const SaNtfClassIdT& classId) > > const { > > + TRACE_ENTER(); > > + bool status(false); > > + > > + if (classId.vendorId == SA_NTF_VENDOR_ID_SAF && > > + classId.majorId == SA_SVC_AMF && > > + classId.minorId == SA_AMF_NTFID_SU_OP_STATE) { > > + status = true; > > + } > > + > > + TRACE_LEAVE2("%i", status); > > + return status; > > +} > > + > > +void SmfCampaignThread::handleStateChangeNotification( > > + const SaNtfStateChangeNotificationT& stateChangeNotification) { > > + TRACE_ENTER(); > > + if (stateChangeNotification.notificationHeader.eventType) { > > + if (*stateChangeNotification.notificationHeader.eventType == > > + SA_NTF_OBJECT_STATE_CHANGE) { > > + handleObjectStateChangeNotification(stateChangeNotification); > > + } else { > > + TRACE("ignoring state change notification with event type: %i", > > + *stateChangeNotification.notificationHeader.eventType); > > + } > > + } > > + TRACE_LEAVE(); > > +} > > + > > +void SmfCampaignThread::handleAmfObjectStateChangeNotification( > > + const SaNtfStateChangeNotificationT& stateChangeNotification) { > > + TRACE_ENTER(); > > + > > + do { > > + bool disabled(false); > > + > > + // see if this is a failure of an upgraded SU > > + for (SaUint16T i(0); i < stateChangeNotification.numStateChanges; i++) > > { > > + if (stateChangeNotification.changedStates[i].newState == > > + SA_AMF_OPERATIONAL_DISABLED) { > > + disabled = true; > > + break; > > + } > > + } > > + > > + if (!disabled) { > > + TRACE("state change is not to DISABLED -- ignoring"); > > + break; > > + } > > + > > + for (SaUint16T i(0); > > + i < stateChangeNotification.notificationHeader.numAdditionalInfo; > > + i++) { > > + if > > (stateChangeNotification.notificationHeader.additionalInfo[i].infoId > != > > + SA_AMF_MAINTENANCE_CAMPAIGN_DN || > > + > stateChangeNotification.notificationHeader.additionalInfo[i].infoType > > + != SA_NTF_VALUE_LDAP_NAME) { > > + continue; > > + } > > + > > + SaNameT *name(0); > > + SaUint16T dataSize(0); > > + > > + SaAisErrorT rc(saNtfPtrValGet( > > + stateChangeNotification.notificationHandle, > > + > > &stateChangeNotification.notificationHeader.additionalInfo[i].infoValue, > > + reinterpret_cast<void **>(&name), > > + &dataSize)); > > + > > + if (rc == SA_AIS_OK) { > > + SaConstStringT maintenanceCampaign(saAisNameBorrow(name)); > > + > > + if (!strcmp(maintenanceCampaign, > > + s_instance->m_campaign->getDn().c_str())) { > > + LOG_ER("SU: %s failed after upgrade in campaign", > > + > > > saAisNameBorrow(stateChangeNotification.notificationHeader.notificationO > > bject)); > > + s_instance->m_campaign->getUpgradeCampaign()->suspend(); > > + s_instance->m_campaign->getUpgradeCampaign()->setCampState( > > + SA_SMF_CMPG_ERROR_DETECTED); > > + > > + std::string error(saAisNameBorrow( > > + > > stateChangeNotification.notificationHeader.notificationObject)); > > + > > + error += " failed after upgrade"; > > + s_instance->m_campaign->setError(error); > > + } else { > > + LOG_ER("maintenance campaign received from AMF (%s) is not the " > > + "same as ours (%s)", > > + maintenanceCampaign, > > + s_instance->m_campaign->getDn().c_str()); > > + } > > + } else { > > + LOG_ER("saNtfPtrValGet failed: %d", rc); > > + } > > + } > > + } while (false); > > + > > + TRACE_LEAVE(); > > +} > > + > > +void SmfCampaignThread::handleObjectStateChangeNotification( > > + const SaNtfStateChangeNotificationT& stateChangeNotification) { > > + TRACE_ENTER(); > > + > > + if (stateChangeNotification.notificationHeader.notificationClassId && > > + > > > isAMFOperState(*stateChangeNotification.notificationHeader.notificationCl > > assId)) { > > + handleAmfObjectStateChangeNotification(stateChangeNotification); > > + } else { > > + TRACE("ignoring non-AMF state change notification"); > > + } > > + > > + TRACE_LEAVE(); > > +} > > + > > +void SmfCampaignThread::ntfNotificationCallback( > > + SaNtfSubscriptionIdT subId, > > + const SaNtfNotificationsT *notification) { > > + TRACE_ENTER(); > > + > > + do { > > + if (subId != operStateSubId) { > > + TRACE("unknown subscription id received in ntfNotificationCallback: > > %d", > > + subId); > > + break; > > + } > > + > > + if (notification->notificationType == SA_NTF_TYPE_STATE_CHANGE) { > > + s_instance->handleStateChangeNotification( > > + notification->notification.stateChangeNotification); > > + } else { > > + TRACE("ignoring NTF notification of type: %i", > > + notification->notificationType); > > + } > > + } while (false); > > + > > + TRACE_LEAVE(); > > +} > > /** > > * SmfCampaignThread::send > > * send event to the thread. > > @@ -672,18 +875,31 @@ int SmfCampaignThread::handleEvents(void > > { > > TRACE_ENTER(); > > NCS_SEL_OBJ mbx_fd = ncs_ipc_get_sel_obj(&m_mbx); > > - struct pollfd fds[1]; > > + > > + SaSelectionObjectT ntfSelObj(0); > > + > > + SaAisErrorT rc(saNtfSelectionObjectGet(m_ntfHandle, &ntfSelObj)); > > + if (rc != SA_AIS_OK) { > > + LOG_ER("saNtfSelectionObjectGet FAILED - %s", saf_error(rc)); > > + return 1; > > + } > > + > > + struct pollfd fds[2]; > > > > /* Set up all file descriptors to listen to */ > > fds[0].fd = mbx_fd.rmv_obj; > > fds[0].events = POLLIN; > > fds[0].revents = 0; > > > > + fds[1].fd = ntfSelObj; > > + fds[1].events = POLLIN; > > + fds[1].revents = 0; > > + > > TRACE("Campaign thread %s waiting for events", m_campaign- > > >getDn().c_str()); > > > > while (m_running) { > > > > - int ret = poll(fds, 1, SMF_UPDATE_ELAPSED_TIME_INTERVAL); > > + int ret = poll(fds, sizeof(fds) / sizeof(pollfd), > > SMF_UPDATE_ELAPSED_TIME_INTERVAL); > > > > if (ret == -1) { > > if (errno == EINTR) > > @@ -699,7 +915,16 @@ int SmfCampaignThread::handleEvents(void > > processEvt(); > > } > > > > - m_campaign->updateElapsedTime(); > > + if (fds[1].revents & POLLIN) { > > + // dispatch NTF events > > + rc = saNtfDispatch(m_ntfHandle, SA_DISPATCH_ALL); > > + > > + if (rc != SA_AIS_OK) { > > + LOG_ER("saNtfDispatch FAILED - %s", saf_error(rc)); > > + } > > + } > > + > > + m_campaign->updateElapsedTime(); > > } > > TRACE_LEAVE(); > > return 0; > > diff --git a/osaf/services/saf/smfsv/smfd/SmfCampaignThread.hh > > b/osaf/services/saf/smfsv/smfd/SmfCampaignThread.hh > > --- a/osaf/services/saf/smfsv/smfd/SmfCampaignThread.hh > > +++ b/osaf/services/saf/smfsv/smfd/SmfCampaignThread.hh > > @@ -190,9 +190,24 @@ class SmfCampaignThread { > > > > SaAisErrorT createImmHandle(SmfCampaign * i_campaign); > > SaAisErrorT deleteImmHandle(); > > + SaAisErrorT initNtfSubscriptions(void); > > + > > + void handleStateChangeNotification(const > > SaNtfStateChangeNotificationT&); > > + > > + void handleObjectStateChangeNotification( > > + const SaNtfStateChangeNotificationT&); > > + > > + void handleAmfObjectStateChangeNotification( > > + const SaNtfStateChangeNotificationT&); > > + > > + bool isAMFOperState(const SaNtfClassIdT&) const; > > + > > + static void ntfNotificationCallback(SaNtfSubscriptionIdT, > > + const SaNtfNotificationsT *); > > > > static void main(NCSCONTEXT info); > > static SmfCampaignThread *s_instance; > > + static SaNtfSubscriptionIdT operStateSubId; > > > > NCSCONTEXT m_task_hdl; > > SYSF_MBX m_mbx; /* mailbox */ > > diff --git a/osaf/services/saf/smfsv/smfd/SmfStepTypes.cc > > b/osaf/services/saf/smfsv/smfd/SmfStepTypes.cc > > --- a/osaf/services/saf/smfsv/smfd/SmfStepTypes.cc > > +++ b/osaf/services/saf/smfsv/smfd/SmfStepTypes.cc > > @@ -1247,8 +1247,8 @@ SmfStepTypeNodeReboot::execute() > > return false; > > } > > > > - /* Modify information model and set maintenance status */ > > - LOG_NO("STEP: Modify information model and set maintenance > > status"); > > + /* Modify information model */ > > + LOG_NO("STEP: Modify information model"); > > if (m_step->modifyInformationModel() != SA_AIS_OK) { > > LOG_ER("Failed to Modify information model in > > step=%s",m_step- > > >getRdn().c_str()); > > return false; > > @@ -1261,11 +1261,6 @@ SmfStepTypeNodeReboot::execute() > > return false; > > } > > > > - if (m_step->setMaintenanceStateActUnits() == false) { > > - LOG_ER("Failed to set maintenance state in step=%s",m_step- > > >getRdn().c_str()); > > - return false; > > - } > > - > > /* The action below is an add on to > > SMF.------------------------------------- > -- > > */ > > /* See if any of the software bundles installed at online > > installation has > > the */ > > /* saSmfBundleInstallOfflineScope attribute set to > > SA_SMF_CMD_SCOPE_PLM_EE */ > > @@ -1372,6 +1367,13 @@ SmfStepTypeNodeReboot::execute() > > /* the units in the same state as before locking > > */ > > m_step->copyDuInitStateToAu(); > > > > + /* Now that the node is up, set the maintenance status */ > > + LOG_NO("STEP: Set Maintenance Status"); > > + if (m_step->setMaintenanceStateActUnits() == false) { > > + LOG_ER("Failed to set maintenance state in step=%s",m_step- > > >getRdn().c_str()); > > + return false; > > + } > > + > > /* Instantiate activation units */ > > LOG_NO("STEP: Instantiate activation units"); > > if (m_step->instantiateActivationUnits() == false) { > > @@ -1685,8 +1687,8 @@ SmfStepTypeNodeRebootAct::execute() > > return false; > > } > > > > - /* Modify information model and set maintenance status */ > > - LOG_NO("STEP: Modify information model and set maintenance > > status"); > > + /* Modify information model */ > > + LOG_NO("STEP: Modify information model"); > > if (m_step->modifyInformationModel() != SA_AIS_OK) { > > LOG_ER("Failed to Modify information model in > > step=%s",m_step- > > >getRdn().c_str()); > > return false; > > @@ -1699,11 +1701,6 @@ SmfStepTypeNodeRebootAct::execute() > > return false; > > } > > > > - if (m_step->setMaintenanceStateActUnits() == false) { > > - LOG_ER("Failed to set maintenance state in step=%s",m_step- > > >getRdn().c_str()); > > - return false; > > - } > > - > > /* Offline installation of new software */ > > LOG_NO("STEP: Offline installation of new software"); > > if (m_step->offlineInstallNewBundles() == false) { > > @@ -1746,6 +1743,13 @@ SmfStepTypeNodeRebootAct::execute() > > /* the units in the same state as before locking > > */ > > m_step->copyDuInitStateToAu(); > > > > + /* Now that the node is up, set the maintenance status */ > > + LOG_NO("STEP: Set Maintenance Status"); > > + if (m_step->setMaintenanceStateActUnits() == false) { > > + LOG_ER("Failed to set maintenance state in step=%s",m_step- > > >getRdn().c_str()); > > + return false; > > + } > > + > > /* Instantiate activation units */ > > LOG_NO("STEP: Instantiate activation units"); > > if (m_step->instantiateActivationUnits() == false) { > > > ------------------------------------------------------------------------------ > Developer Access Program for Intel Xeon Phi Processors > Access to Intel Xeon Phi processor-based developer platforms. > With one year of Intel Parallel Studio XE. > Training and support from Colfax. > Order your platform today. http://sdm.link/xeonphi > _______________________________________________ > Opensaf-devel mailing list > Opensaf-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel