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(&notificationFilterHandles,
>>>>>>> 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

Reply via email to