Hi Lennart,

Reviewed the patch.
Following are the comments:

1. The timeout for each admin operation must be "smfd_cb->adminOpTimeout".
The smfd_cb->adminOpTimeout is configurable, if the adminoperation 
timeout passed is less than smfd_cb->adminOpTimeout there is a chance, 
to get TIMEOUT.

2. The maximum number of retries can be 25 with a sleep of 
500millseconds(will be ideal).

Regards,
Neel.


On 2016/10/07 05:55 PM, Lennart Lund wrote:
>   osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc |  253 
> ++++++++++++------------
>   1 files changed, 126 insertions(+), 127 deletions(-)
>
>
> Fix handling of AMF admin operation so that adminOpTimeout is
> respected both for timeout of the synchronous saImmOmAdminOperationInvoke_2
> IMM API and when handling TRY AGAIN replies from both 
> saImmOmAdminOperationInvoke_2
> and AMF OI
>
> 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
> @@ -55,7 +55,7 @@
>   #include "immutil.h"
>   #include "smfd_smfnd.h"
>   #include "smfd.h"
> -#include "osaf_time.h"
> +#include "base/time.h"
>   
>   /* ========================================================================
>    *   DEFINITIONS
> @@ -3536,52 +3536,52 @@ bool SmfAdminOperation::createNodeGroup(
>       // ------------------------------------
>       // Create the node group
>       bool method_rc = false;
> -        const uint32_t MAX_NO_RETRIES = 2;
> -        uint32_t retry_cnt = 0;
> -        while (++retry_cnt <= MAX_NO_RETRIES) {
> -                // Creating the node group object will fail if a previously
> -                // created node group was for some reason not deleted
> -                // If that's the case (SA_AIS_ERR_EXIST) try to delete the
> -                // node group and try again.
> -                m_errno = immutil_saImmOmCcbObjectCreate_2(
> -                    m_ccbHandle,
> -                    className,
> -                    &nodeGroupParentDn,
> -                    attrValues);
> -                TRACE("%s: immutil_saImmOmCcbObjectCreate_2 %s",
> -                        __FUNCTION__, saf_error(m_errno));
> -
> -                if (m_errno == SA_AIS_ERR_EXIST) {
> -                        // A node group with the same name already exist
> -                        // May happen if a previous delete after usage has
> -                        // failed
> -                        LOG_NO("%s: saImmOmCcbObjectCreate_2 Fail %s",
> -                               __FUNCTION__, saf_error(m_errno));
> -                        bool rc = deleteNodeGroup();
> -                        if (rc == false) {
> -                                LOG_NO("%s: deleteNodeGroup() Fail",
> -                                       __FUNCTION__);
> -                                method_rc = false;
> -                                break;
> -                        }
> -                        continue;
> -                } else if (m_errno != SA_AIS_OK) {
> -                        LOG_NO("%s: saImmOmCcbObjectCreate_2() '%s' Fail %s",
> -                                __FUNCTION__, nGnodeName, 
> saf_error(m_errno));
> -                        method_rc = false;
> -                        break;
> -                } else {
> -                        m_errno = saImmOmCcbApply(m_ccbHandle);
> -                        if (m_errno != SA_AIS_OK) {
> -                                LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
> -                                        __FUNCTION__, saf_error(m_errno));
> -                                method_rc = false;
> -                        } else {
> -                                method_rc = true;
> -                        }
> -                        break;
> -                }
> -        }
> +     const uint32_t MAX_NO_RETRIES = 2;
> +     uint32_t retry_cnt = 0;
> +     while (++retry_cnt <= MAX_NO_RETRIES) {
> +             // Creating the node group object will fail if a previously
> +             // created node group was for some reason not deleted
> +             // If that's the case (SA_AIS_ERR_EXIST) try to delete the
> +             // node group and try again.
> +             m_errno = immutil_saImmOmCcbObjectCreate_2(
> +                                                        m_ccbHandle,
> +                                                        className,
> +                                                        &nodeGroupParentDn,
> +                                                        attrValues);
> +             TRACE("%s: immutil_saImmOmCcbObjectCreate_2 %s",
> +                   __FUNCTION__, saf_error(m_errno));
> +
> +             if (m_errno == SA_AIS_ERR_EXIST) {
> +                     // A node group with the same name already exist
> +                     // May happen if a previous delete after usage has
> +                     // failed
> +                     LOG_NO("%s: saImmOmCcbObjectCreate_2 Fail %s",
> +                            __FUNCTION__, saf_error(m_errno));
> +                     bool rc = deleteNodeGroup();
> +                     if (rc == false) {
> +                             LOG_NO("%s: deleteNodeGroup() Fail",
> +                                    __FUNCTION__);
> +                             method_rc = false;
> +                             break;
> +                     }
> +                     continue;
> +             } else if (m_errno != SA_AIS_OK) {
> +                     LOG_NO("%s: saImmOmCcbObjectCreate_2() '%s' Fail %s",
> +                            __FUNCTION__, nGnodeName, saf_error(m_errno));
> +                     method_rc = false;
> +                     break;
> +             } else {
> +                     m_errno = saImmOmCcbApply(m_ccbHandle);
> +                     if (m_errno != SA_AIS_OK) {
> +                             LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
> +                                    __FUNCTION__, saf_error(m_errno));
> +                             method_rc = false;
> +                     } else {
> +                             method_rc = true;
> +                     }
> +                     break;
> +             }
> +     }
>   
>       if (nodeName != NULL)
>               free(nodeName);
> @@ -3607,51 +3607,51 @@ bool SmfAdminOperation::deleteNodeGroup(
>   
>       TRACE("\t Deleting nodeGroup '%s'", nodeGroupName_s.c_str());
>       bool method_rc = false;
> -        const uint32_t MAX_NO_RETRIES = 2;
> -        uint32_t retry_cnt = 0;
> -        while (++retry_cnt <= MAX_NO_RETRIES) {
> -                // Handles including ccb handle may have been invalidated by
> -                // IMM resulting in SA_AIS_ERR_BAD_HANDLE response on the
> -                // delete object request.
> -                // If that's the case: Try to create new handles and try 
> again
> -                ais_rc = immutil_saImmOmCcbObjectDelete(m_ccbHandle,
> -                        &nodeGroupName);
> -                TRACE("%s: immutil_saImmOmCcbObjectDelete %s",
> -                        __FUNCTION__, saf_error(m_errno));
> -
> -                if (ais_rc == SA_AIS_ERR_BAD_HANDLE) {
> -                        LOG_NO("%s: saImmOmCcbObjectDelete Fail %s",
> -                               __FUNCTION__, saf_error(m_errno));
> -                        finalizeAllImmHandles();
> -                        bool rc = initAllImmHandles();
> -                        if (rc == false) {
> -                                LOG_NO("%s: getAllImmHandles() Fail",
> -                                       __FUNCTION__);
> -                                method_rc = false;
> -                                break;
> -                        }
> -                        continue;
> -                } else if (ais_rc != SA_AIS_OK) {
> -                      LOG_NO("%s: saImmOmCcbObjectDelete() '%s' Fail %s",
> -                                __FUNCTION__, nodeGroupName_s.c_str(),
> -                      saf_error(ais_rc));
> -                      method_rc = false;
> -                      break;
> -                } else {
> -                        ais_rc = saImmOmCcbApply(m_ccbHandle);
> -                        if (ais_rc != SA_AIS_OK) {
> -                                LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
> -                                        __FUNCTION__, saf_error(ais_rc));
> -                                method_rc = false;
> -                        } else {
> -                                method_rc = true;
> -                        }
> -                        break;
> -                }
> -        }
> -
> -     TRACE_LEAVE2("rc %s, ais_rc %s", method_rc? "Ok":"Fail",
> -                 saf_error(ais_rc));
> +     const uint32_t MAX_NO_RETRIES = 2;
> +     uint32_t retry_cnt = 0;
> +     while (++retry_cnt <= MAX_NO_RETRIES) {
> +             // Handles including ccb handle may have been invalidated by
> +             // IMM resulting in SA_AIS_ERR_BAD_HANDLE response on the
> +             // delete object request.
> +             // If that's the case: Try to create new handles and try again
> +             ais_rc = immutil_saImmOmCcbObjectDelete(m_ccbHandle,
> +                                                     &nodeGroupName);
> +             TRACE("%s: immutil_saImmOmCcbObjectDelete %s",
> +                   __FUNCTION__, saf_error(m_errno));
> +
> +             if (ais_rc == SA_AIS_ERR_BAD_HANDLE) {
> +                     LOG_NO("%s: saImmOmCcbObjectDelete Fail %s",
> +                            __FUNCTION__, saf_error(m_errno));
> +                     finalizeAllImmHandles();
> +                     bool rc = initAllImmHandles();
> +                     if (rc == false) {
> +                             LOG_NO("%s: getAllImmHandles() Fail",
> +                                    __FUNCTION__);
> +                             method_rc = false;
> +                             break;
> +                     }
> +                     continue;
> +             } else if (ais_rc != SA_AIS_OK) {
> +                     LOG_NO("%s: saImmOmCcbObjectDelete() '%s' Fail %s",
> +                            __FUNCTION__, nodeGroupName_s.c_str(),
> +                            saf_error(ais_rc));
> +                     method_rc = false;
> +                     break;
> +             } else {
> +                     ais_rc = saImmOmCcbApply(m_ccbHandle);
> +                     if (ais_rc != SA_AIS_OK) {
> +                             LOG_NO("%s: saImmOmCcbApply() Fail '%s'",
> +                                    __FUNCTION__, saf_error(ais_rc));
> +                             method_rc = false;
> +                     } else {
> +                             method_rc = true;
> +                     }
> +                     break;
> +             }
> +     }
> +
> +     TRACE_LEAVE2("rc %s, ais_rc %s", method_rc ? "Ok" : "Fail",
> +             saf_error(ais_rc));
>       return method_rc;
>   }
>   
> @@ -3660,10 +3660,6 @@ bool SmfAdminOperation::deleteNodeGroup(
>   ///
>   bool SmfAdminOperation::nodeGroupAdminOperation(SaAmfAdminOperationIdT 
> adminOp)
>   {
> -     bool rc = true;
> -     SaAisErrorT oi_rc = SA_AIS_OK;
> -     m_errno = SA_AIS_OK;
> -
>       TRACE_ENTER();
>   
>       // Create the object name
> @@ -3679,42 +3675,45 @@ bool SmfAdminOperation::nodeGroupAdminOp
>       // There are no operation parameters
>       const SaImmAdminOperationParamsT_2 *params[1] = {NULL};
>   
> -     int retry = 100;
> -     do {
> -             TRACE("immutil_saImmOmAdminOperationInvoke_2 %s", __FUNCTION__);
> -             m_errno = immutil_saImmOmAdminOperationInvoke_2(
> -                     m_ownerHandle,
> -                     &nodeGroupName, 0, adminOp, params,
> -                     &oi_rc, smfd_cb->adminOpTimeout);
> -
> -                if (m_errno == SA_AIS_OK && oi_rc == SA_AIS_OK)
> -                        break;
> -
> -             if (retry <= 0) {
> -                     LOG_NO("Fail to invoke admin operation, too many OI "
> -                             "TRY_AGAIN, giving up. %s", __FUNCTION__);
> +     // ===================================
> +     // Create the node group
> +     SaAisErrorT oi_rc = SA_AIS_OK;
> +     m_errno = SA_AIS_OK;
> +     bool method_rc = false;
> +     base::Timer adminOpTimeout(smfd_cb->adminOpTimeout);
> +
> +     while (adminOpTimeout.isTimeout() == false) {
> +             TRACE("saImmOmAdminOperationInvoke_2 %s", __FUNCTION__);
> +             m_errno = saImmOmAdminOperationInvoke_2(
> +                                     m_ownerHandle,
> +                                     &nodeGroupName, 0, adminOp, params,
> +                                     &oi_rc, adminOpTimeout.timeLeft());
> +             if ((m_errno == SA_AIS_ERR_TRY_AGAIN) ||
> +                 (m_errno == SA_AIS_OK && oi_rc == SA_AIS_ERR_TRY_AGAIN)) {
> +                     base::Sleep(base::MillisToTimespec(1000));
> +                     continue;
> +             } else if (m_errno != SA_AIS_OK) {
> +                     LOG_NO("%s: saImmOmAdminOperationInvoke_2 "
> +                             "Fail %s", __FUNCTION__, saf_error(m_errno));
> +                     break;
> +             } else if (oi_rc != SA_AIS_OK) {
> +                     LOG_NO("%s: SaAmfAdminOperationId %d Fail %s",
> +                             __FUNCTION__, adminOp, saf_error(oi_rc));
> +                     m_errno = oi_rc;
> +                     break;
> +             } else {
> +                     // Operation success
> +                     method_rc = true;
>                       break;
>               }
> -             sleep(2);
> -             retry--;
> -     } while (m_errno == SA_AIS_OK && oi_rc == SA_AIS_ERR_TRY_AGAIN);
> -
> -     if (m_errno != SA_AIS_OK) {
> -             LOG_NO("%s: saImmOmAdminOperationInvoke_2 Fail %s",
> -                     __FUNCTION__, saf_error(m_errno));
> -             rc = false;
>       }
> -
> -     if ((m_errno == SA_AIS_OK) && (oi_rc != SA_AIS_OK)){
> -             /* IMM om admin operation was ok but amf oi reported an error */
> -             LOG_NO("%s: Set adminstate (%d) Fail %s",
> -                     __FUNCTION__, adminOp, saf_error(oi_rc));
> -             m_errno = oi_rc;
> -             rc = false;
> +     if (adminOpTimeout.isTimeout()) {
> +             LOG_NO("%s adminOpTimeout", __FUNCTION__);
> +             method_rc = false;
>       }
>   
> -     TRACE_LEAVE();
> -     return rc;
> +     TRACE_LEAVE2("%s", method_rc? "OK":"FAIL");
> +     return method_rc;
>   }
>   
>   /// Set given admin state to all units in the given unitList


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to