osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc |  41 +++++++++++--------------
 osaf/services/saf/smfsv/smfd/SmfUpgradeStep.hh |   4 +-
 2 files changed, 21 insertions(+), 24 deletions(-)


Fixes a bug introduced with opensaf change: 7354. The effect of the bug is
that bundle scripts do not get executed when rolling back. In the software
loading thread a bundle list is passed down.

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
@@ -1942,9 +1942,7 @@ SmfUpgradeStep::callActivationCmd()
                //Start a load thread for each node
                std::list <std::string>::iterator nodeIt;
                for (nodeIt = swNodeList.begin(); nodeIt != swNodeList.end(); 
++nodeIt) {
-                       SmfNodeSwLoadThread *swLoadThread = new 
SmfNodeSwLoadThread(this,
-                                                                               
    *nodeIt,
-                                                                               
    SMF_ACTIVATE_ALL);
+                       SmfNodeSwLoadThread *swLoadThread = new 
SmfNodeSwLoadThread(this, *nodeIt, SMF_ACTIVATE_ALL);
                        swLoadThread->start();
                }
 
@@ -2027,9 +2025,7 @@ SmfUpgradeStep::callBundleScript(SmfInst
                //Start a load thread for each node
                std::list <std::string>::iterator nodeIt;
                for (nodeIt = swNodeList.begin(); nodeIt != swNodeList.end(); 
++nodeIt) {
-                       SmfNodeSwLoadThread *swLoadThread = new 
SmfNodeSwLoadThread(this,
-                                                                               
    *nodeIt,
-                                                                               
    i_order);
+                       SmfNodeSwLoadThread *swLoadThread = new 
SmfNodeSwLoadThread(this, *nodeIt, i_order, &i_bundleList);
                        swLoadThread->start();
                }
 
@@ -2845,14 +2841,20 @@ SmfNodeSwLoadThread::main(NCSCONTEXT inf
 
 /** 
  * Constructor
+ *
+ * This class operates in two main modes: activate and install/remove. When
+ * install/remove is used a bundle list must be specified. The reason for not
+ * using the bundle list directly from the step is that install and remove
+ * operations are switched during rollback.
  */
-SmfNodeSwLoadThread::SmfNodeSwLoadThread(SmfUpgradeStep * i_step,
-                                        std::string i_nodeName,
-                                        SmfUpgradeStep::SmfInstallRemoveT 
i_order):
+SmfNodeSwLoadThread::SmfNodeSwLoadThread(SmfUpgradeStep * i_step, std::string 
i_nodeName, 
+                                        SmfUpgradeStep::SmfInstallRemoveT 
i_order, 
+                                        const std::list<SmfBundleRef> 
*i_bundleList):
        m_task_hdl(0),
        m_step(i_step),
        m_amfNode(i_nodeName),
-       m_order(i_order)
+        m_order(i_order),
+        m_bundleList(i_bundleList)
 {
        sem_init(&m_semaphore, 0, 0);
 }
@@ -2914,7 +2916,6 @@ void
 SmfNodeSwLoadThread::main(void)
 {
        std::list < SmfBundleRef >::const_iterator bundleit;
-       std::list < SmfBundleRef > bundleList;
        std::string command;
        std::string cmdAttr;
        std::string argsAttr;
@@ -2932,15 +2933,8 @@ SmfNodeSwLoadThread::main(void)
 
        TRACE("Bundle command thread for node [%s] started", m_amfNode.c_str());
        uint32_t rc = 0;
-       if ((m_order == SmfUpgradeStep::SMF_STEP_OFFLINE_INSTALL) ||
-           (m_order == SmfUpgradeStep::SMF_STEP_ONLINE_INSTALL)) {
-                   bundleList = m_step->getSwAddList();
-       }
-       else if ((m_order == SmfUpgradeStep::SMF_STEP_OFFLINE_REMOVE) ||
-                (m_order == SmfUpgradeStep::SMF_STEP_ONLINE_REMOVE)) {
-                   bundleList = m_step->getSwRemoveList();
-       }
-       else if (m_order == SmfUpgradeStep::SMF_ACTIVATE_ALL) {
+
+       if (m_order == SmfUpgradeStep::SMF_ACTIVATE_ALL) {
                command = smfd_cb->nodeBundleActCmd;
                swNodeList.push_back(m_amfNode);
                std::list<std::string>::const_iterator n;
@@ -2968,13 +2962,14 @@ SmfNodeSwLoadThread::main(void)
                }
                goto done;
        }
-       else {
-               LOG_NO("Unknown bundle command order");
+
+       if (m_bundleList == NULL) {
+               LOG_ER("Bundle list must be set for installation/removal");
                rc = 1;
                goto done;
        }
 
-       for (bundleit = bundleList.begin(); bundleit != bundleList.end(); 
++bundleit) {
+       for (bundleit = m_bundleList->begin(); bundleit != m_bundleList->end(); 
++bundleit) {
                /* Get bundle object from IMM */
                if (immUtil.getObject((*bundleit).getBundleDn(), &attributes) 
== false) {
                        LOG_NO("Fail to read bundle object for bundle DN [%s]",
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
@@ -808,7 +808,8 @@ class SmfUpgradeStep {
 //////////////////////////////////////////////////
 class SmfNodeSwLoadThread {
  public:
-  SmfNodeSwLoadThread(SmfUpgradeStep * i_step, std::string i_nodeName, 
SmfUpgradeStep::SmfInstallRemoveT i_order);
+       SmfNodeSwLoadThread(SmfUpgradeStep * i_step, std::string i_nodeName, 
SmfUpgradeStep::SmfInstallRemoveT i_order,
+                           const std::list<SmfBundleRef> *i_bundleList=NULL);
        ~SmfNodeSwLoadThread();
        int start(void);
 
@@ -824,6 +825,7 @@ class SmfNodeSwLoadThread {
        std::string       m_amfNode;
        SmfUpgradeStep::SmfInstallRemoveT m_order;
        sem_t             m_semaphore;
+       const std::list < SmfBundleRef > *m_bundleList;
 };
 
 #endif                         // SMFUPGRADESTEP_HH

------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial!
https://ad.doubleclick.net/ddm/clk/302982198;130105516;z
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to