Hi,

ACK with comments:


1. unused var "dnit" in:
SmfUpgradeStep.cc: SmfUpgradeStep::terminateDeactivationUnits()


2. unused code:

SmfUpgradeStep.hh: class SmfActivationUnit:

#if 0
       typedef enum {
           SA_AMF_ADMIN_UNLOCKED =1,
           SA_AMF_ADMIN_LOCKED = 2,
           SA_AMF_ADMIN_LOCKED_INSTANTIATION = 3,
           SA_AMF_ADMIN_SHUTTING_DOWN = 4
       } SaAmfAdminStateT;
#endif


Br,

Robert


On 02/16/2015 12:22 PM, Ingvar Bergstrom wrote:
>   osaf/services/saf/smfsv/config/smfsv_classes.xml    |    7 +
>   osaf/services/saf/smfsv/config/smfsv_objects.xml    |    4 +
>   osaf/services/saf/smfsv/smfd/SmfCampaign.hh         |    1 +
>   osaf/services/saf/smfsv/smfd/SmfStepTypes.cc        |   16 ++
>   osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc |  129 
> +++++++++++--------
>   osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc      |  129 
> ++++++++++++++-----
>   osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh      |   33 ++++-
>   osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc    |   15 ++
>   osaf/services/saf/smfsv/smfd/smfd_cb.h              |    1 +
>   9 files changed, 239 insertions(+), 96 deletions(-)
>
>
> If SMF config attr smfKeepDuState is set to >0 (true), the upgrade
> procedures will complete leaving the AU/DU in the same admin state
> as before the procedure was started.
>
> diff --git a/osaf/services/saf/smfsv/config/smfsv_classes.xml 
> b/osaf/services/saf/smfsv/config/smfsv_classes.xml
> --- a/osaf/services/saf/smfsv/config/smfsv_classes.xml
> +++ b/osaf/services/saf/smfsv/config/smfsv_classes.xml
> @@ -385,6 +385,13 @@
>                           <flag>SA_WRITABLE</flag>
>                           <default-value>0</default-value>
>               </attr>
> +             <attr>
> +                     <name>smfKeepDuState</name>
> +                     <type>SA_UINT32_T</type>
> +                     <category>SA_CONFIG</category>
> +                        <flag>SA_WRITABLE</flag>
> +                        <default-value>0</default-value>
> +             </attr>
>       </class>
>       <class name="OpenSafSmfCampRestartInfo">
>               <category>SA_RUNTIME</category>
> diff --git a/osaf/services/saf/smfsv/config/smfsv_objects.xml 
> b/osaf/services/saf/smfsv/config/smfsv_objects.xml
> --- a/osaf/services/saf/smfsv/config/smfsv_objects.xml
> +++ b/osaf/services/saf/smfsv/config/smfsv_objects.xml
> @@ -77,6 +77,10 @@
>                       <name>smfVerifyTimeout</name>
>                       <value>100000000000</value>
>               </attr>
> +             <attr>
> +                     <name>smfKeepDuState</name>
> +                     <value>0</value>
> +             </attr>
>       </object>
>       <object class="SaAmfCompBaseType">
>               <dn>safCompType=OpenSafCompTypeSMF</dn>
> diff --git a/osaf/services/saf/smfsv/smfd/SmfCampaign.hh 
> b/osaf/services/saf/smfsv/smfd/SmfCampaign.hh
> --- a/osaf/services/saf/smfsv/smfd/SmfCampaign.hh
> +++ b/osaf/services/saf/smfsv/smfd/SmfCampaign.hh
> @@ -47,6 +47,7 @@
>   #define SMF_VERIFY_TIMEOUT_ATTR   "smfVerifyTimeout"
>   #define SMF_CLUSTER_CONTROLLERS_ATTR "smfClusterControllers"
>   #define SMF_SS_AFFECTED_NODES_ENABLE_ATTR "smfSSAffectedNodesEnable"
> +#define SMF_KEEP_DU_STATE_ATTR    "smfKeepDuState"
>   #define SMF_UPDATE_ELAPSED_TIME_INTERVAL 10000
>   
>   class SmfUpgradeCampaign;
> 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
> @@ -396,6 +396,10 @@ SmfStepTypeAuLock::execute()
>                   return false;
>           }
>   
> +        /* Copy the initial states of the DUs to AUs, so the activation 
> phase will leave */
> +        /* the units in the same state as before locking                     
>             */
> +        m_step->copyDuInitStateToAu();
> +
>           /* Instantiate activation units */
>           LOG_NO("STEP: Instantiate activation units");
>           if (m_step->instantiateActivationUnits() == false) {
> @@ -669,6 +673,10 @@ SmfStepTypeAuLockAct::execute()
>                   return false;
>       }
>   
> +        /* Copy the initial states of the DUs to AUs, so the activation 
> phase will leave */
> +        /* the units in the same state as before locking                     
>             */
> +        m_step->copyDuInitStateToAu();
> +
>           /* Instantiate activation units */
>           LOG_NO("STEP: Instantiate activation units");
>           if (m_step->instantiateActivationUnits() == false) {
> @@ -1360,6 +1368,10 @@ SmfStepTypeNodeReboot::execute()
>                   return false;
>           }
>   
> +        /* Copy the initial states of the DUs to AUs, so the activation 
> phase will leave */
> +        /* the units in the same state as before locking                     
>             */
> +        m_step->copyDuInitStateToAu();
> +
>           /* Instantiate activation units */
>           LOG_NO("STEP: Instantiate activation units");
>           if (m_step->instantiateActivationUnits() == false) {
> @@ -1731,6 +1743,10 @@ SmfStepTypeNodeRebootAct::execute()
>           }
>           // Here the rebooted node is up and running
>   
> +        /* Copy the initial states of the DUs to AUs, so the activation 
> phase will leave */
> +        /* the units in the same state as before locking                     
>             */
> +        m_step->copyDuInitStateToAu();
> +
>           /* Instantiate activation units */
>           LOG_NO("STEP: Instantiate activation units");
>           if (m_step->instantiateActivationUnits() == false) {
> diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc 
> b/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc
> --- a/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc
> +++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeProcedure.cc
> @@ -543,8 +543,11 @@ SmfUpgradeProcedure::calculateRollingSte
>                       SmfUpgradeStep *newStep = new SmfUpgradeStep();
>                       newStep->setRdn(rdnStr);
>                       newStep->setDn(newStep->getRdn() + "," + getDn());
> -                     newStep->addActivationUnit(*it);
> -                     newStep->addDeactivationUnit(*it);
> +                     unitNameAndState tmp;
> +                     tmp.name = *it;
> +                        tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                     newStep->addActivationUnit(tmp);
> +                     newStep->addDeactivationUnit(tmp);
>                       
> newStep->setMaxRetry(i_rollingUpgrade->getStepMaxRetryCount());
>                       
> newStep->setRestartOption(i_rollingUpgrade->getStepRestartOption());
>                       newStep->addSwRemove(nodeTemplate->getSwRemoveList());
> @@ -598,8 +601,11 @@ SmfUpgradeProcedure::calculateRollingSte
>                           osafassert(newStep != NULL);
>                           newStep->setRdn(rdnStr);
>                           newStep->setDn(newStep->getRdn() + "," + getDn());
> -                        newStep->addActivationUnit(*itActDeact);
> -                        newStep->addDeactivationUnit(*itActDeact);
> +                        unitNameAndState tmp;
> +                        tmp.name = *itActDeact;
> +                        tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                        newStep->addActivationUnit(tmp);
> +                        newStep->addDeactivationUnit(tmp);
>                           
> newStep->setMaxRetry(i_rollingUpgrade->getStepMaxRetryCount());
>                           
> newStep->setRestartOption(i_rollingUpgrade->getStepRestartOption());
>                           
> newStep->addSwRemove(nodeTemplate->getSwRemoveList());
> @@ -805,7 +811,10 @@ bool SmfUpgradeProcedure::calculateSingl
>                               }
>                               std::list<std::string>::const_iterator a;
>                               for (a = actUnits.begin(); a != actUnits.end(); 
> a++) {
> -                                     newStep->addActivationUnit(*a);
> +                                     unitNameAndState tmp;
> +                                     tmp.name = *a;
> +                                        tmp.initState = 
> SA_AMF_ADMIN_UNLOCKED;
> +                                     newStep->addActivationUnit(tmp);
>                               }
>                       } else {
>                               if (e->getName().length() == 0) {
> @@ -826,7 +835,10 @@ bool SmfUpgradeProcedure::calculateSingl
>               entityList.unique();
>               std::list<std::string>::iterator entity;
>               for (entity = entityList.begin(); entity != entityList.end(); 
> entity++) {
> -                     newStep->addActivationUnit(*entity);
> +                     unitNameAndState tmp;
> +                     tmp.name = *entity;
> +                        tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                     newStep->addActivationUnit(tmp);
>               }
>               entityList.clear();
>   
> @@ -870,7 +882,10 @@ bool SmfUpgradeProcedure::calculateSingl
>                               }
>                               std::list<std::string>::const_iterator a;
>                               for (a = deactUnits.begin(); a != 
> deactUnits.end(); a++) {
> -                                     newStep->addDeactivationUnit(*a);
> +                                     unitNameAndState tmp;
> +                                     tmp.name = *a;
> +                                        tmp.initState = 
> SA_AMF_ADMIN_UNLOCKED;
> +                                     newStep->addDeactivationUnit(tmp);
>                               }
>                       } else {
>                               if (e->getName().length() == 0){
> @@ -901,7 +916,10 @@ bool SmfUpgradeProcedure::calculateSingl
>               entityList.sort();
>               entityList.unique();
>               for (entity = entityList.begin(); entity != entityList.end(); 
> entity++) {
> -                     newStep->addDeactivationUnit(*entity);
> +                     unitNameAndState tmp;
> +                     tmp.name = *entity;
> +                        tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                     newStep->addDeactivationUnit(tmp);
>               }
>               entityList.clear();
>   
> @@ -997,8 +1015,11 @@ bool SmfUpgradeProcedure::calculateSingl
>   
>               std::list<std::string>::const_iterator a;
>               for (a = actDeactUnits.begin(); a != actDeactUnits.end(); a++) {
> -                     newStep->addDeactivationUnit(*a);
> -                     newStep->addActivationUnit(*a);
> +                     unitNameAndState tmp;
> +                     tmp.name = *a;
> +                        tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                     newStep->addDeactivationUnit(tmp);
> +                     newStep->addActivationUnit(tmp);
>               }
>   
>               std::list<std::string>::const_iterator n;
> @@ -1372,7 +1393,7 @@ SmfUpgradeProcedure::addStepModification
>       SaImmAttrValuesT_2 **attributes;
>       std::list < std::string > objectList;
>       std::list < std::string >::const_iterator objit;
> -     const std::string & auNodeName = 
> i_newStep->getActivationUnitList().front();
> +     const std::string & auNodeName = 
> i_newStep->getActivationUnitList().front().name;
>       std::multimap<std::string, objectInst>::iterator iter;
>       std::pair<std::multimap<std::string, objectInst>::iterator, 
> std::multimap<std::string, objectInst>::iterator> nodeName_mm;
>   
> @@ -1575,10 +1596,10 @@ SmfUpgradeProcedure::addStepModification
>       } else {
>               //No parent type was set, apply the modifications on the entity 
> pointed out by the activation units.
>               //The optional modifyOperation RDN attribute if added when 
> applying the modification
> -             std::list < std::string >::const_iterator auEntityIt;
> -             const std::list < std::string > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
> +             std::list < unitNameAndState >::const_iterator auEntityIt;
> +             const std::list < unitNameAndState > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
>               for (auEntityIt = auEntityList.begin(); auEntityIt != 
> auEntityList.end(); ++auEntityIt) {
> -                     if (!addStepModificationList(i_newStep, *auEntityIt, 
> i_modificationList)) {
> +                     if (!addStepModificationList(i_newStep, 
> (*auEntityIt).name, i_modificationList)) {
>                               
> LOG_NO("SmfUpgradeProcedure::addStepModificationsSuOrComp: 
> addStepModificationList fails");
>                               return false;
>                       }
> @@ -1640,8 +1661,8 @@ SmfUpgradeProcedure::addStepModification
>           TRACE_ENTER();
>   
>       std::list < std::string >::const_iterator strIter;
> -        std::list < std::string >::const_iterator auEntityIt;
> -        const std::list < std::string > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
> +        std::list < unitNameAndState >::const_iterator auEntityIt;
> +        const std::list < unitNameAndState > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
>       std::string typeDn   = i_parentType->getTypeDn();
>       std::string parentDn = i_parentType->getParentDn();
>   
> @@ -1669,23 +1690,23 @@ SmfUpgradeProcedure::addStepModification
>                       for (auEntityIt = auEntityList.begin(); auEntityIt != 
> auEntityList.end(); ++auEntityIt) {
>                               //This test is because in single step upgrades 
> the SU/Comp step mod routines are called
>                               //also when the AU/DU is a node.
> -                             if((*auEntityIt).find("safAmfNode=") == 0) { 
> //Node as AU/DU
> -                                     if((*objit).second.nodeDN == 
> (*auEntityIt)) {
> -                                             TRACE("Instance %s is within 
> scope of %s", (*objit).second.suDN.c_str(), (*auEntityIt).c_str());
> +                             if((*auEntityIt).name.find("safAmfNode=") == 0) 
> { //Node as AU/DU
> +                                     if((*objit).second.nodeDN == 
> (*auEntityIt).name) {
> +                                             TRACE("Instance %s is within 
> scope of %s", (*objit).second.suDN.c_str(), (*auEntityIt).name.c_str());
>                                               
> matchingSU.push_back((*objit).second.suDN);
>                                               break;
>                                       }
>                               }
>   
> -                             if((*objit).second.suDN == (*auEntityIt)) {
> -                                     TRACE("Instance %s is within scope of 
> %s", (*objit).second.suDN.c_str(), (*auEntityIt).c_str());
> +                             if((*objit).second.suDN == (*auEntityIt).name) {
> +                                     TRACE("Instance %s is within scope of 
> %s", (*objit).second.suDN.c_str(), (*auEntityIt).name.c_str());
>                                       //The i_objects map contain all 
> instances on component level.
>                                       //One SU may give multiple matches 
> since one SU may contain several components.
>                                       //Save the matching enties and remove 
> duplicates when all matching is finished.
>                                       
> matchingSU.push_back((*objit).second.suDN);
>                                       break;
>                               } else {
> -                                     TRACE("Instance %s is NOT within scope 
> of %s", (*objit).second.suDN.c_str(), (*auEntityIt).c_str());
> +                                     TRACE("Instance %s is NOT within scope 
> of %s", (*objit).second.suDN.c_str(), (*auEntityIt).name.c_str());
>                               }
>                       }
>                       //Remove duplicates
> @@ -1717,8 +1738,8 @@ SmfUpgradeProcedure::addStepModification
>           TRACE_ENTER();
>   
>       std::list < std::string >::const_iterator strIter;
> -        std::list < std::string >::const_iterator auEntityIt;
> -        const std::list < std::string > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
> +        std::list < unitNameAndState >::const_iterator auEntityIt;
> +        const std::list < unitNameAndState > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
>       std::string typeDn   = i_parentType->getTypeDn();
>       std::string parentDn = i_parentType->getParentDn();
>   
> @@ -1744,29 +1765,29 @@ SmfUpgradeProcedure::addStepModification
>                       for (auEntityIt = auEntityList.begin(); auEntityIt != 
> auEntityList.end(); ++auEntityIt) {
>                               //This test is because in single step upgrades 
> the SU/Comp step mod routines are called
>                               //also when the AU/DU is a node.
> -                             if((*auEntityIt).find("safAmfNode=") == 0) { 
> //Node as AU/DU
> -                                     if((*objit).second.nodeDN == 
> (*auEntityIt)) {
> -                                             TRACE("Instance %s is within 
> scope of %s", (*objit).second.compDN.c_str(), (*auEntityIt).c_str());
> +                             if((*auEntityIt).name.find("safAmfNode=") == 0) 
> { //Node as AU/DU
> +                                     if((*objit).second.nodeDN == 
> (*auEntityIt).name) {
> +                                             TRACE("Instance %s is within 
> scope of %s", (*objit).second.compDN.c_str(), (*auEntityIt).name.c_str());
>                                               if 
> (!addStepModificationList(i_newStep, (*objit).second.compDN, 
> i_modificationList)) {
>                                                       
> LOG_NO("SmfUpgradeProcedure::addStepModificationsComp: 
> addStepModificationList fails");
>                                                       TRACE_LEAVE();
>                                                       return false;
>                                               }
>                                       } else {
> -                                             TRACE("Instance %s is NOT 
> within scope of %s", (*objit).second.compDN.c_str(), (*auEntityIt).c_str());
> +                                             TRACE("Instance %s is NOT 
> within scope of %s", (*objit).second.compDN.c_str(), 
> (*auEntityIt).name.c_str());
>                                       }
>                               }
>   
>                               //If the AU/DU DN is found within the Component 
> DN, the component is within the scope
> -                             if(((*objit).second.compDN).find(*auEntityIt) 
> != std::string::npos) {
> -                                     TRACE("Instance %s is within scope of 
> %s", (*objit).second.compDN.c_str(), (*auEntityIt).c_str());
> +                             
> if(((*objit).second.compDN).find((*auEntityIt).name) != std::string::npos) {
> +                                     TRACE("Instance %s is within scope of 
> %s", (*objit).second.compDN.c_str(), (*auEntityIt).name.c_str());
>                                       if (!addStepModificationList(i_newStep, 
> (*objit).second.compDN, i_modificationList)) {
>                                               
> LOG_NO("SmfUpgradeProcedure::addStepModificationsComp: 
> addStepModificationList fails");
>                                               TRACE_LEAVE();
>                                               return false;
>                                       }
>                               } else {
> -                                     TRACE("Instance %s is NOT within scope 
> of %s", (*objit).second.compDN.c_str(), (*auEntityIt).c_str());
> +                                     TRACE("Instance %s is NOT within scope 
> of %s", (*objit).second.compDN.c_str(), (*auEntityIt).name.c_str());
>                               }
>                       }
>               }
> @@ -1787,8 +1808,8 @@ SmfUpgradeProcedure::addStepModification
>           TRACE_ENTER();
>   
>       std::list < std::string >::const_iterator strIter;
> -        std::list < std::string >::const_iterator auEntityIt;
> -        const std::list < std::string > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
> +        std::list < unitNameAndState >::const_iterator auEntityIt;
> +        const std::list < unitNameAndState > &auEntityList = 
> i_newStep->getActivationUnitList(); //Single step may have many activation 
> units
>       std::string typeDn   = i_parentType->getTypeDn();
>       std::string parentDn = i_parentType->getParentDn();
>   
> @@ -1811,9 +1832,9 @@ SmfUpgradeProcedure::addStepModification
>               for (auEntityIt = auEntityList.begin(); auEntityIt != 
> auEntityList.end(); ++auEntityIt) {
>                       //This test is because in single step upgrades the 
> SU/Comp step mod routines are called
>                       //also when the AU/DU is a node.
> -                     if((*auEntityIt).find("safAmfNode=") == 0) { //Node as 
> AU/DU
> -                             if((*objit).second.nodeDN == (*auEntityIt)) {
> -                                     TRACE("Instance %s is within scope of 
> %s", (*objit).second.suDN.c_str(), (*auEntityIt).c_str());
> +                     if((*auEntityIt).name.find("safAmfNode=") == 0) { 
> //Node as AU/DU
> +                             if((*objit).second.nodeDN == 
> (*auEntityIt).name) {
> +                                     TRACE("Instance %s is within scope of 
> %s", (*objit).second.suDN.c_str(), (*auEntityIt).name.c_str());
>                                       //The i_objects map contain all 
> instances on component level.
>                                       //One SU may give multiple matches 
> since one SU may contain several components.
>                                       //Save the matching enties and remove 
> duplicates when all matching is finished.
> @@ -1822,15 +1843,15 @@ SmfUpgradeProcedure::addStepModification
>                               }
>                       }
>   
> -                     if((*objit).second.suDN == (*auEntityIt)) {
> -                             TRACE("Instance %s is within scope of %s", 
> (*objit).second.suDN.c_str(), (*auEntityIt).c_str());
> +                     if((*objit).second.suDN == (*auEntityIt).name) {
> +                             TRACE("Instance %s is within scope of %s", 
> (*objit).second.suDN.c_str(), (*auEntityIt).name.c_str());
>                               //The i_objects map contain all instances on 
> component level.
>                               //One SU may give multiple matches since one SU 
> may contain several components.
>                               //Save the matching enties and remove 
> duplicates when all matching is finished.
>                               matchingSU.push_back((*objit).second.suDN);
>                               break;
>                       } else {
> -                             TRACE("Instance %s is NOT within scope of %s", 
> (*objit).second.suDN.c_str(), (*auEntityIt).c_str());
> +                             TRACE("Instance %s is NOT within scope of %s", 
> (*objit).second.suDN.c_str(), (*auEntityIt).name.c_str());
>                       }
>               }
>               //Remove duplicates
> @@ -1944,11 +1965,11 @@ SmfUpgradeProcedure::createImmStep(SmfUp
>                   return rc;
>           }
>   
> -     std::list < std::string >::const_iterator iter;
> -     std::list < std::string >::const_iterator iterE;
> +     std::list < unitNameAndState >::const_iterator iter;
> +     std::list < unitNameAndState >::const_iterator iterE;
>   
>       /* Create the SaSmfDeactivationUnit object if there ia any object to 
> deactivate */
> -     const std::list < std::string >& deactList = 
> i_step->getDeactivationUnitList();
> +     const std::list < unitNameAndState >& deactList = 
> i_step->getDeactivationUnitList();
>       if (deactList.size() != 0) {
>               SmfImmRTCreateOperation icoSaSmfDeactivationUnit;
>               icoSaSmfDeactivationUnit.setClassName("SaSmfDeactivationUnit");
> @@ -1968,7 +1989,7 @@ SmfUpgradeProcedure::createImmStep(SmfUp
>               iter = deactList.begin();
>               iterE = deactList.end();
>               while (iter != iterE) {
> -                     attrsaSmfDuActedOn.addValue(*iter);
> +                     attrsaSmfDuActedOn.addValue((*iter).name);
>                       iter++;
>               }
>   
> @@ -2073,7 +2094,7 @@ SmfUpgradeProcedure::createImmStep(SmfUp
>       }
>   
>       /* Create the SaSmfActivationUnit object if there is any object to 
> activate */
> -     const std::list < std::string >& actList = 
> i_step->getActivationUnitList();
> +     const std::list < unitNameAndState >& actList = 
> i_step->getActivationUnitList();
>       if(actList.size() != 0) {
>               SmfImmRTCreateOperation icoSaSmfActivationUnit;
>               icoSaSmfActivationUnit.setClassName("SaSmfActivationUnit");
> @@ -2089,11 +2110,11 @@ SmfUpgradeProcedure::createImmStep(SmfUp
>               SmfImmAttribute attrsaSmfAuActedOn;
>               attrsaSmfAuActedOn.setName("saSmfAuActedOn");
>               attrsaSmfAuActedOn.setType("SA_IMM_ATTR_SANAMET");
> -             const std::list < std::string > actList = 
> i_step->getActivationUnitList();
> +             const std::list < unitNameAndState > actList = 
> i_step->getActivationUnitList();
>               iter = actList.begin();
>               iterE = actList.end();
>               while (iter != iterE) {
> -                     attrsaSmfAuActedOn.addValue(*iter);
> +                     attrsaSmfAuActedOn.addValue((*iter).name);
>                       iter++;
>               }
>   
> @@ -2522,9 +2543,11 @@ SmfUpgradeProcedure::readCampaignImmMode
>                       for(ix = 0; (au = immutil_getNameAttr((const 
> SaImmAttrValuesT_2 **)attributes,
>                                                             "saSmfAuActedOn", 
> ix)) != NULL; ix++) {
>                               TRACE("addActivationUnit %s", 
> osaf_extended_name_borrow(au));
> -                             std::string str = osaf_extended_name_borrow(au);
> -                             if(str != "") {
> -                                     
> i_newStep->addActivationUnit(osaf_extended_name_borrow(au));
> +                             unitNameAndState tmp;
> +                             tmp.name = osaf_extended_name_borrow(au);
> +                                tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                             if(tmp.name != "") {
> +                                     i_newStep->addActivationUnit(tmp);
>                               } else {
>                                       TRACE("No activation unit, must be SW 
> install");
>                               }
> @@ -2604,9 +2627,11 @@ SmfUpgradeProcedure::readCampaignImmMode
>                       for(ix = 0; (du = immutil_getNameAttr((const 
> SaImmAttrValuesT_2 **)attributes,
>                                                             "saSmfDuActedOn", 
> ix)) != NULL; ix++) {
>                               TRACE("addDeactivationUnit %s", 
> osaf_extended_name_borrow(du));
> -                             std::string str = osaf_extended_name_borrow(du);
> -                             if(str != "") {
> -                                     
> i_newStep->addDeactivationUnit(osaf_extended_name_borrow(du));
> +                             unitNameAndState tmp;
> +                             tmp.name = osaf_extended_name_borrow(du);
> +                                tmp.initState = SA_AMF_ADMIN_UNLOCKED;
> +                             if(tmp.name != "") {
> +                                     i_newStep->addDeactivationUnit(tmp);
>                               } else {
>                                       TRACE("No deactivation unit, must be SW 
> remove");
>                               }
> diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc 
> b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
> --- a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
> +++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
> @@ -372,7 +372,7 @@ SmfUpgradeStep::setImmStateAndSendNotifi
>   // addActivationUnit()
>   
> //------------------------------------------------------------------------------
>   void
> -SmfUpgradeStep::addActivationUnit(const std::string & i_activationUnit)
> +SmfUpgradeStep::addActivationUnit(const unitNameAndState & i_activationUnit)
>   {
>       m_activationUnit.m_actedOn.push_back(i_activationUnit);
>   }
> @@ -380,7 +380,7 @@ SmfUpgradeStep::addActivationUnit(const
>   
> //------------------------------------------------------------------------------
>   // getActivationUnits()
>   
> //------------------------------------------------------------------------------
> -const std::list < std::string > &
> +const std::list < unitNameAndState > &
>   SmfUpgradeStep::getActivationUnitList()
>   {
>       return m_activationUnit.m_actedOn;
> @@ -390,7 +390,7 @@ SmfUpgradeStep::getActivationUnitList()
>   // addDeactivationUnit()
>   
> //------------------------------------------------------------------------------
>   void
> -SmfUpgradeStep::addDeactivationUnit(const std::string & i_deactivationUnit)
> +SmfUpgradeStep::addDeactivationUnit(const unitNameAndState & 
> i_deactivationUnit)
>   {
>       m_deactivationUnit.m_actedOn.push_back(i_deactivationUnit);
>   }
> @@ -398,7 +398,7 @@ SmfUpgradeStep::addDeactivationUnit(cons
>   
> //------------------------------------------------------------------------------
>   // getDeactivationUnits()
>   
> //------------------------------------------------------------------------------
> -const std::list < std::string > &
> +const std::list < unitNameAndState > &
>   SmfUpgradeStep::getDeactivationUnitList()
>   {
>       return m_deactivationUnit.m_actedOn;
> @@ -649,7 +649,7 @@ bool
>   SmfUpgradeStep::lockDeactivationUnits()
>   {
>       TRACE("lock deactivation units");
> -     const SaImmAdminOperationParamsT_2 *params[1] = {NULL};
> +     const SaImmAdminOperationParamsT_2 *params[1] = {NULL};
>       return callAdminOperation(SA_AMF_ADMIN_LOCK, params, 
> m_deactivationUnit.m_actedOn);
>   }
>   
> @@ -671,7 +671,8 @@ bool
>   SmfUpgradeStep::terminateDeactivationUnits()
>   {
>       TRACE("terminate deactivation units");
> -     const SaImmAdminOperationParamsT_2 *params[1] = {NULL};
> +     const SaImmAdminOperationParamsT_2 *params[1] = {NULL};
> +     std::list < unitNameAndState >::iterator dnit;
>       return callAdminOperation(SA_AMF_ADMIN_LOCK_INSTANTIATION, params, 
> m_deactivationUnit.m_actedOn);
>   }
>   
> @@ -886,14 +887,15 @@ SmfUpgradeStep::setMaintenanceState(SmfA
>       SmfImmUtils immUtil;
>           std::list < std::string > suList;
>           std::list < std::string >::iterator it;
> +        std::list < unitNameAndState >::iterator unitIt;
>   
> -        for (it = i_units.m_actedOn.begin(); it != i_units.m_actedOn.end(); 
> ++it) {
> -                if ((*it).find("safAmfNode") == 0) {
> +        for (unitIt = i_units.m_actedOn.begin(); unitIt != 
> i_units.m_actedOn.end(); ++unitIt) {
> +             if ((*unitIt).name.find("safAmfNode") == 0) {
>                           //If DN is a node, set saAmfSUMaintenanceCampaign 
> for all SUs on the node
> -                     // Find all SU's on the node
> -                        std::list < std::string > objectList;
> -                        SaImmAttrValuesT_2 **attributes;
> -                     (void)immUtil.getChildren("", objectList, 
> SA_IMM_SUBTREE, "SaAmfSU");
> +                     // Find all SU's on the node
> +                     std::list < std::string > objectList;
> +                SaImmAttrValuesT_2 **attributes;
> +                (void)immUtil.getChildren("", objectList, SA_IMM_SUBTREE, 
> "SaAmfSU");
>   
>                           std::list < std::string >::const_iterator suit;
>                       for (suit = objectList.begin(); suit != 
> objectList.end(); ++suit) {
> @@ -905,28 +907,28 @@ SmfUpgradeStep::setMaintenanceState(SmfA
>                                                                       
> "saAmfSUHostedByNode",
>                                                                       0);
>                                           if ((hostedByNode != NULL)
> -                                            && (strcmp((*it).c_str(), 
> osaf_extended_name_borrow(hostedByNode)) == 0)) {
> +                                            && 
> (strcmp((*unitIt).name.c_str(), osaf_extended_name_borrow(hostedByNode)) == 
> 0)) {
>                                                   /* The SU is hosted by the 
> AU node */
>                                                   suList.push_back(*suit);
>                                           }
>                               }
>                       }
> -                } else if ((*it).find("safSu") == 0) {
> +                } else if ((*unitIt).name.find("safSu") == 0) {
>                           //If DN is a SU, set saAmfSUMaintenanceCampaign for 
> this SU only
> -                        suList.push_back(*it);
> -                } else if ((*it).find("safComp") == 0) {
> +                        suList.push_back((*unitIt).name);
> +                } else if ((*unitIt).name.find("safComp") == 0) {
>                           //IF DN is a component, set 
> saAmfSUMaintenanceCampaign for the hosting SU
>                           //Extract the SU name from the DN
> -                     std::string::size_type pos = (*it).find(",");
> +                     std::string::size_type pos = (*unitIt).name.find(",");
>                       if (pos == std::string::npos) {
> -                             LOG_NO("SmfUpgradeStep::setMaintenanceState(): 
> Separator \",\" not found in %s", (*it).c_str());
> +                             LOG_NO("SmfUpgradeStep::setMaintenanceState(): 
> Separator \",\" not found in %s", (*unitIt).name.c_str());
>                               TRACE_LEAVE();
>                               return false;
>                       }
> -                        std::string su = ((*it).substr(pos + 1, 
> std::string::npos));
> +                        std::string su = ((*unitIt).name.substr(pos + 1, 
> std::string::npos));
>                           suList.push_back(su);
>                   } else {
> -                        LOG_NO("SmfUpgradeStep::setMaintenanceState(): 
> unknown activation unit type %s", (*it).c_str());
> +                        LOG_NO("SmfUpgradeStep::setMaintenanceState(): 
> unknown activation unit type %s", (*unitIt).name.c_str());
>                           TRACE_LEAVE();
>                           return false;
>                   }
> @@ -1352,9 +1354,9 @@ SmfUpgradeStep::calculateStepType()
>               //Single step
>               //Try the activation unit list, if empty try the deactivation 
> unit list
>               if (!this->getActivationUnitList().empty()) {
> -                     firstAuDu = this->getActivationUnitList().front();
> +                     firstAuDu = this->getActivationUnitList().front().name;
>               } else if (!this->getDeactivationUnitList().empty()) {
> -                     firstAuDu = this->getDeactivationUnitList().front();
> +                     firstAuDu = 
> this->getDeactivationUnitList().front().name;
>               } else {
>                       //No activation/deactivation, just SW installation
>                       className = "SaAmfNode";
> @@ -1363,7 +1365,7 @@ SmfUpgradeStep::calculateStepType()
>       } else {
>               //Rolling
>               if (!this->getActivationUnitList().empty()) {
> -                     firstAuDu = this->getActivationUnitList().front();
> +                     firstAuDu = this->getActivationUnitList().front().name;
>               } else {
>                       //No activation/deactivation, just SW installation
>                       className = "SwInstallNode"; //Fake name for SW 
> installation only
> @@ -2085,69 +2087,93 @@ SmfUpgradeStep::callBundleScript(SmfInst
>   bool
>   SmfUpgradeStep::callAdminOperation(unsigned int i_operation,
>                                      const SaImmAdminOperationParamsT_2 ** 
> i_params,
> -                                   const std::list < std::string > &i_dnList)
> +                                   std::list <unitNameAndState> &i_dnList)
>   {
> -     std::list < std::string >::const_iterator dnit;
> +        //This routine is only used from the upgrade steps
> +     std::list < unitNameAndState >::iterator dnit;
>       SmfImmUtils immUtil;
>       bool result = true;
>   
>       TRACE_ENTER();
>   
>       for (dnit = i_dnList.begin(); dnit != i_dnList.end(); ++dnit) {
> -             SaAisErrorT rc = immUtil.callAdminOperation((*dnit), 
> i_operation, i_params, smfd_cb->adminOpTimeout);
> +                //The initial deactivation unit(DU) admin state is saved in 
> the given DU list (i_dnList).
> +                //The DU admin state is not read from IMM but is known from 
> the result from adminOp.
> +                //The saved DU admin state is used in the unlocking phase to 
> avoid the DU to enter a different admin state than it
> +                //originally have.
> +                //If the admin state is "empty" the unlocking will proceed 
> regardless of original state.
> +
> +                //If AU/DU original state was SA_AMF_ADMIN_LOCKED, don't 
> unlock
> +                if ((i_operation == SA_AMF_ADMIN_UNLOCK) && 
> ((*dnit).initState == SA_AMF_ADMIN_LOCKED)) {
> +                        LOG_NO("AU/DU [%s] shall remain SA_AMF_ADMIN_LOCKED, 
> continue", (*dnit).name.c_str());
> +                        continue;
> +                }
> +
> +                //If AU/DU original state was 
> SA_AMF_ADMIN_LOCKED_INSTANTIATION don't instantiate or unlock
> +                if (((i_operation == SA_AMF_ADMIN_UNLOCK_INSTANTIATION) || 
> (i_operation == SA_AMF_ADMIN_UNLOCK)) &&
> +                    ((*dnit).initState == 
> SA_AMF_ADMIN_LOCKED_INSTANTIATION)) {
> +                        LOG_NO("AU/DU [%s] shall remain 
> SA_AMF_ADMIN_LOCKED_INSTANTIATION, continue", (*dnit).name.c_str());
> +                        continue;
> +                }
> +
> +             SaAisErrorT rc = immUtil.callAdminOperation((*dnit).name, 
> i_operation, i_params, smfd_cb->adminOpTimeout);
>   
>               //In case the upgrade step is re-executed the operation may 
> result in the followng result codes
>               //depending on the state of the entity
>               // SA_AIS_ERR_NO_OP, in case the operation is already performed
> -             // SA_AIS_ERR_BAD_OPERATION, in case the entity is already in 
> loacked-instantiation admin state
> +             // SA_AIS_ERR_BAD_OPERATION, in case the entity is already in 
> locked-instantiation admin state
>               switch (i_operation) {
>               case SA_AMF_ADMIN_LOCK:
>                       if(rc == SA_AIS_ERR_NO_OP) {
> -                             TRACE("Entity %s already in state LOCKED, 
> continue", (*dnit).c_str());
> +                             TRACE("Entity %s already in state LOCKED, 
> continue", (*dnit).name.c_str());
> +                                //Save the state for act/deact pointed out
> +                               (*dnit).initState = SA_AMF_ADMIN_LOCKED;
>                       } else if (rc == SA_AIS_ERR_BAD_OPERATION) {
> -                             TRACE("Entity %s already in state 
> LOCKED-INSTANTIATION, continue", (*dnit).c_str());
> +                             TRACE("Entity %s already in state 
> LOCKED-INSTANTIATION, continue", (*dnit).name.c_str());
>                       } else if (rc != SA_AIS_OK) {
> -                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).c_str());
> +                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).name.c_str());
>                               result = false;
>                               goto done;
>                       }
>                       break;
>               case SA_AMF_ADMIN_UNLOCK:
>                       if(rc == SA_AIS_ERR_NO_OP) {
> -                             TRACE("Entity %s already in state UNLOCKED, 
> continue", (*dnit).c_str());
> +                             TRACE("Entity %s already in state UNLOCKED, 
> continue", (*dnit).name.c_str());
>                       } else if (rc != SA_AIS_OK) {
> -                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).c_str());
> +                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).name.c_str());
>                               result = false;
>                               goto done;
>                       }
>                       break;
>               case SA_AMF_ADMIN_LOCK_INSTANTIATION:
>                       if(rc == SA_AIS_ERR_NO_OP) {
> -                             TRACE("Entity %s already in state 
> LOCKED-INSTANTIATED, continue", (*dnit).c_str());
> +                             TRACE("Entity %s already in state 
> LOCKED-INSTANTIATED, continue", (*dnit).name.c_str());
> +                             //Save the state for act/deact pointed out
> +                             (*dnit).initState = 
> SA_AMF_ADMIN_LOCKED_INSTANTIATION;
>                       } else if (rc != SA_AIS_OK) {
> -                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).c_str());
> +                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).name.c_str());
>                               result = false;
>                               goto done;
>                       }
>                       break;
>               case SA_AMF_ADMIN_UNLOCK_INSTANTIATION:
>                       if(rc == SA_AIS_ERR_NO_OP) {
> -                             TRACE("Entity %s already in state 
> UNLOCKED-INSTANTIATED, continue", (*dnit).c_str());
> +                             TRACE("Entity %s already in state 
> UNLOCKED-INSTANTIATED, continue", (*dnit).name.c_str());
>                       } else if (rc != SA_AIS_OK) {
> -                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).c_str());
> +                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).name.c_str());
>                               result = false;
>                               goto done;
>                       }
>                       break;
>               case SA_AMF_ADMIN_RESTART:
>                       if (rc != SA_AIS_OK) {
> -                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).c_str());
> +                             LOG_NO("Failed to call admin operation %u on 
> %s", i_operation, (*dnit).name.c_str());
>                               result = false;
>                               goto done;
>                       }
>                       break;
>               default:
> -                     LOG_NO("Unknown admin operation %u on %s", i_operation, 
> (*dnit).c_str());
> +                     LOG_NO("Unknown admin operation %u on %s", i_operation, 
> (*dnit).name.c_str());
>                       result = false;
>                       goto done;
>                       break;
> @@ -2160,6 +2186,33 @@ done:
>   }
>   
>   
> //------------------------------------------------------------------------------
> +// copyDuInitStateToAu()
> +//------------------------------------------------------------------------------
> +void
> +SmfUpgradeStep::copyDuInitStateToAu()
> +{
> +             TRACE_ENTER();
> +             if (smfd_cb->smfKeepDuState == 0) { //Classic behavior, unlock 
> at deactivation
> +                     TRACE_LEAVE();
> +                     return;
> +             }
> +
> +             std::list < unitNameAndState >::iterator i_du;
> +             std::list < unitNameAndState >::iterator i_au;
> +             // For each DN given in m_activationUnit, check if DN is found 
> in m_deactivationUnit.
> +             // If DN is found copy the DU initial state.
> +             for (i_au = m_activationUnit.m_actedOn.begin(); i_au != 
> m_activationUnit.m_actedOn.end(); ++i_au) {
> +                     for (i_du = m_deactivationUnit.m_actedOn.begin(); i_du 
> != m_deactivationUnit.m_actedOn.end(); ++i_du) {
> +                             if ((*i_au).name == (*i_du).name) {
> +                                             (*i_au).initState = 
> (*i_du).initState;
> +                                             break;
> +                             }
> +                     }
> +             }
> +             TRACE_LEAVE();
> +}
> +
> +//------------------------------------------------------------------------------
>   // nodeReboot()
>   
> //------------------------------------------------------------------------------
>   bool
> diff --git a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh 
> b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh
> --- a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh
> +++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh
> @@ -27,6 +27,7 @@
>   #include <vector>
>   #include <list>
>   
> +#include <saAmf.h>
>   #include <saSmf.h>
>   #include <saImmOi.h>
>   #include "SmfStepState.hh"
> @@ -56,6 +57,11 @@ struct SmfNodeUpInfo {
>           unsigned int nd_up_cntr;
>   };
>   
> +struct unitNameAndState{
> +       std::string name;
> +       SaAmfAdminStateT initState;
> +};
> +
>   /* ========================================================================
>    *   DATA DECLARATIONS
>    * ========================================================================
> @@ -84,8 +90,16 @@ class SmfActivationUnit {
>         ~SmfActivationUnit()
>         {
>         }
> +#if 0
> +      typedef enum {
> +          SA_AMF_ADMIN_UNLOCKED =1,
> +          SA_AMF_ADMIN_LOCKED = 2,
> +          SA_AMF_ADMIN_LOCKED_INSTANTIATION = 3,
> +          SA_AMF_ADMIN_SHUTTING_DOWN = 4
> +      } SaAmfAdminStateT;
> +#endif
>   
> -      std::list < std::string > m_actedOn;
> +      std::list < unitNameAndState > m_actedOn;
>   };
>   
>   ///
> @@ -225,28 +239,28 @@ class SmfUpgradeStep {
>   /// @param    A DN to an activation unit
>   /// @return   None
>   ///
> -     void addActivationUnit(const std::string & i_activationUnit);
> +     void addActivationUnit(const unitNameAndState & i_activationUnit);
>   
>   ///
>   /// Purpose:  Get the activation unit DN
>   /// @param
>   /// @return   A list of DN to activation units
>   ///
> -     const std::list < std::string > &getActivationUnitList();
> +     const std::list < unitNameAndState > &getActivationUnitList();
>   
>   ///
>   /// Purpose:  Add an deactivation unit DN
>   /// @param    A DN to an deactivation unit
>   /// @return   None
>   ///
> -     void addDeactivationUnit(const std::string & i_deactivationUnit);
> +     void addDeactivationUnit(const unitNameAndState & i_deactivationUnit);
>   
>   ///
>   /// Purpose:  Get the deactivation unit DN
>   /// @param
>   /// @return   A list of DN to deactivation units
>   ///
> -     const std::list < std::string > &getDeactivationUnitList();
> +     const std::list < unitNameAndState > &getDeactivationUnitList();
>   
>   ///
>   /// Purpose:  Add a sw bundle to remove
> @@ -625,6 +639,13 @@ class SmfUpgradeStep {
>   ///
>       bool nodeReboot();
>   
> +///
> +/// Purpose:  Copy initial admin state of deactivation units to activation 
> units
> +/// @param    -
> +/// @return   -
> +///
> +     void copyDuInitStateToAu();
> +
>       bool checkAndInvokeCallback (const std::list < SmfCallback * > 
> &callback_list, unsigned int camp_phase);
>   
>           friend class SmfStepState;
> @@ -670,7 +691,7 @@ class SmfUpgradeStep {
>   /// @return   -
>   ///
>       bool callAdminOperation(unsigned int i_operation, const 
> SaImmAdminOperationParamsT_2 ** params,
> -                             const std::list < std::string > &i_dnList);
> +                             std::list < unitNameAndState > &i_dnList);
>   
>   ///
>   /// Purpose:  Set the state in IMM step object and send state change 
> notification
> diff --git a/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc 
> b/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc
> --- a/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc
> +++ b/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc
> @@ -1153,6 +1153,19 @@ uint32_t read_config_and_set_control_blo
>                   }
>           }
>   
> +     const SaUint32T *keepDuState = immutil_getUint32Attr((const 
> SaImmAttrValuesT_2 **)attributes,
> +                     SMF_KEEP_DU_STATE_ATTR, 0);
> +     unsigned int tmp_keep_du_state = 0;
> +
> +     if (keepDuState == NULL) {
> +             //Not found, set default value
> +             keepDuState = &tmp_keep_du_state;
> +             LOG_NO("Attr %s is not available in %s, using default value %d",
> +                    SMF_KEEP_DU_STATE_ATTR, SMF_CONFIG_OBJECT_DN, 
> *keepDuState);
> +     } else {
> +             LOG_NO("smfKeepDuState = %d", *keepDuState);
> +     }
> +
>       cb->backupCreateCmd = strdup(backupCreateCmd);
>       cb->bundleCheckCmd = strdup(bundleCheckCmd);
>       cb->nodeCheckCmd = strdup(nodeCheckCmd);
> @@ -1170,6 +1183,8 @@ uint32_t read_config_and_set_control_blo
>       cb->smfInactivatePbeDuringUpgrade = *smfInactivatePbeDuringUpgrade;
>       cb->smfVerifyEnable = *smfVerifyEnable;
>       cb->smfVerifyTimeout = *verifyTimeout;
> +     cb->smfKeepDuState = *keepDuState;
> +
>       TRACE_LEAVE();
>       return NCSCC_RC_SUCCESS;
>   }
> diff --git a/osaf/services/saf/smfsv/smfd/smfd_cb.h 
> b/osaf/services/saf/smfsv/smfd/smfd_cb.h
> --- a/osaf/services/saf/smfsv/smfd/smfd_cb.h
> +++ b/osaf/services/saf/smfsv/smfd/smfd_cb.h
> @@ -60,6 +60,7 @@ typedef struct smfd_cb {
>       SaUint32T smfVerifyEnable;                  /* dis/enable pre-campaign 
> verification callbacks */
>       SaTimeT smfVerifyTimeout;                   /* pre-campaign 
> verification timeout */
>           char *smfClusterControllers[2];/* list of nodes where amfd is 
> execting */
> +     SaUint32T smfKeepDuState;                   /* Keep DU state in an 
> upgrade if true (>0) */
>       SaInvocationT cbk_inv_id;                   /* Invocation ID of the 
> callback */
>       SMFD_SMFND_ADEST_INVID_MAP *smfnd_list;     /* SMFNDs need to respond 
> to the callback. */
>       uint32_t no_of_smfnd;
>
> ------------------------------------------------------------------------------
> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> with Interactivity, Sharing, Native Excel Exports, App Integration & more
> Get technology previously reserved for billion-dollar corporations, FREE
> http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
> _______________________________________________
> Opensaf-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to