I can add that campaigns without this change will not detect a crash. But if any operations are to be done against the object after the fact they would fail and cause a rollback of the campaign. So we end up with two different behaviors one that suspends the campaign and another that rolls it back.
On 11/15/2016 08:28 AM, Neelakanta Reddy wrote: > Hi Alex, > > I am waiting #2144 to be pushed(fixed) before this. Testing the #2145 > requires #2144 to be fixed. > > The patch may not be backward compatible. > while upgrading from 5.1 to 5.2, consider the campaign having > applications along with middle-ware components. > There may be a chance that the (application)software that is just > upgraded in one of the SC will go to software disable. > The campaign will go to "suspended-by-error-detected" and the upgrade > will fail. > > Older, campaigns without modification may fail. > > > Thanks, > Neel. > > On 2016/11/15 02:51 AM, Alex Jones wrote: >> Hi Lennart, >> >> The only way this new code would be different from the legacy >> behavior >> is if there is a bug in the newly updated software. If the software that >> was just updated goes into AMF DISABLED operational state while the >> campaign is still running, the campaign would then go into >> "suspended-by-error-detected", and the failed SU would be shown in >> saSmfCmpgError attribute. >> >> In the "legacy" version, SMF would not detect that the new software >> crashed, and would continue the campaign. >> >> It's not that the old behavior is not correct, it's that asynchronous >> errors of AMF entities were not handled. >> >> Can you give a specific scenario of what you would consider >> non-backwards-compatible? >> >> Alex >> >> On 11/14/2016 10:28 AM, Lennart Lund wrote: >>> ------------------------------------------------------------------------ >>> >>> NOTICE: This email was received from an EXTERNAL sender >>> ------------------------------------------------------------------------ >>> >>> >>> Hi Alex >>> >>> Your code adds a not previously implemented behavior correctly >>> according >>> to the AIS. The problem is that I think this new correct behavior >>> differs from the 'legacy' behavior. So even if the new behavior is >>> correct and the old is not it is still NBC since some existing system >>> using SMF may not work correctly after the change is introduced. These >>> kind of problems are usually handled by making the new feature >>> configurable in such a way that the legacy behavior is default. >>> But please correct me if I have misunderstood how your change is >>> working >>> in this aspect >>> >>> Thanks >>> Lennart >>> >>>> -----Original Message----- >>>> From: Alex Jones [mailto:ajo...@genband.com] >>>> Sent: den 14 november 2016 15:47 >>>> To: Lennart Lund <lennart.l...@ericsson.com>; >>>> reddy.neelaka...@oracle.com; Rafael Odzakow >>>> <rafael.odza...@ericsson.com> >>>> Cc: opensaf-devel@lists.sourceforge.net >>> <mailto:opensaf-devel@lists.sourceforge.net> >>>> Subject: Re: [devel] [PATCH 1 of 1] smfd: add support for asynchronous >>>> detection of failed AMF entities [#2145] >>>> >>>> Hi Lennart, >>>> >>>> I'm not sure I understand this. Can you explain why you think this is >>>> not backwards compatible? >>>> >>>> This new functionality will put the campaign into "suspended by error >>>> detected" if any new/upgraded SU (or component in the SU) fails during >>>> the campaign (after it has been upgraded). >>>> >>>> Alex >>>> >>>> On 11/14/2016 09:35 AM, Lennart Lund wrote: >>>>> ------------------------------------------------------------------------ >>>>> >>>>> NOTICE: This email was received from an EXTERNAL sender >>>>> ------------------------------------------------------------------------ >>>>> >>>>> >>>>> 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 >>> <mailto:opensaf-devel@lists.sourceforge.net> >>>>> <mailto: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 >>> <mailto:opensaf-devel@lists.sourceforge.net> >>>>> <mailto: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 >>> <mailto:Opensaf-devel@lists.sourceforge.net> >>>>> <mailto:Opensaf-devel@lists.sourceforge.net> >>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel