Hi Mathi,

Please find my review comments inline[Ramesh].

Thanks,
Ramesh.

On 11/15/2013 12:58 PM, mathi.naic...@oracle.com wrote:
>   osaf/services/saf/clmsv/clms/clms_amf.c  |    9 +-
>   osaf/services/saf/clmsv/clms/clms_cb.h   |    4 +
>   osaf/services/saf/clmsv/clms/clms_imm.c  |  243 
> +++++++++++++++++++++++++++---
>   osaf/services/saf/clmsv/clms/clms_imm.h  |    3 +
>   osaf/services/saf/clmsv/clms/clms_main.c |   25 ++-
>   5 files changed, 252 insertions(+), 32 deletions(-)
>
>
> ERR_EXIST and TRY_AGAIN are treated the same. Also, a rtu_pending flag is 
> introduced.
> The flag is toggled when an IMM API throws a TRY_AGAIN or ERR_EXIST and when 
> the
> call is reattempted later and if the call succeeds the flag is turned off.
>
> diff --git a/osaf/services/saf/clmsv/clms/clms_amf.c 
> b/osaf/services/saf/clmsv/clms/clms_amf.c
> --- a/osaf/services/saf/clmsv/clms/clms_amf.c
> +++ b/osaf/services/saf/clmsv/clms/clms_amf.c
> @@ -256,8 +256,11 @@ static void clms_amf_csi_set_callback(Sa
>   
>       if (role_change == true) {
>   
> -             if(clms_cb->ha_state == SA_AMF_HA_ACTIVE)
> +             if(clms_cb->ha_state == SA_AMF_HA_ACTIVE) {
>                       clms_imm_impl_set(clms_cb);
> +                     /* Unconditionally refresh IMM for runtime attributes
> +                     clms_switchon_all_pending_rtupdates(); */
> +             }
>   
>               if ((rc = clms_mds_change_role(clms_cb)) != NCSCC_RC_SUCCESS) {
>                       LOG_ER("clms_mds_change_role FAILED");
> @@ -266,6 +269,10 @@ static void clms_amf_csi_set_callback(Sa
>               /* Inform MBCSV of HA state change */
>               if (NCSCC_RC_SUCCESS != (error = 
> clms_mbcsv_change_HA_state(clms_cb)))
>                       error = SA_AIS_ERR_FAILED_OPERATION;
> +
> +             /* Clear up any rtu updates, the active will take care of it */
> +             if (clms_cb->ha_state == SA_AMF_HA_STANDBY)
> +                     clms_switchoff_all_pending_rtupdates();
>       }
>   
[Ramesh]: To be consistent with role changes, better to do  
clms_switchon_all_pending_rtupdates(); when role change to ACTIVE else 
clms_switchoff_all_pending_rtupdates();
>    response:
> diff --git a/osaf/services/saf/clmsv/clms/clms_cb.h 
> b/osaf/services/saf/clmsv/clms/clms_cb.h
> --- a/osaf/services/saf/clmsv/clms/clms_cb.h
> +++ b/osaf/services/saf/clmsv/clms/clms_cb.h
> @@ -40,6 +40,7 @@ typedef struct cluster_db_t {
>       SaNameT name;
>       SaUint32T num_nodes;
>       SaTimeT init_time;
> +        SaBoolT rtu_pending;
>       /*struct cluster_db_t *next; */ /* Multiple cluster is not supported as 
> of now */
>   } CLMS_CLUSTER_INFO;
>   
> @@ -69,6 +70,8 @@ typedef struct cluster_node_t {
>       ADMIN_OP admin_op;      /*plm or clm operation */
>       timer_t lock_timerid;   /*Timer id for admin lock operation */
>       SaInvocationT plm_invid;        /*plmtrack callback invocation id */
> +     SaBoolT rtu_pending; /* Flag to mark whether an IMM RunTime attribute 
> Update is pending and to be retried */
> +     SaBoolT admin_rtu_pending; /* Flag to mark whether an IMM RunTime 
> attribute Update is pending and to be retried */
>       struct cluster_node_t *dep_node_list;   /*Dependent nodes list - in 
> case of plm operation */
>       struct cluster_node_t *next;
>   } CLMS_CLUSTER_NODE;
> @@ -172,6 +175,7 @@ typedef struct clms_cb_t {
>       SaSelectionObjectT plm_sel_obj; /* PLMSv selection object */
>       SaNtfHandleT ntf_hdl;   /* Handled obtained from NTFSv */
>       SaBoolT reg_with_plm;   /*plm present in system */
> +        SaBoolT rtu_pending; /* Global flag to determine a pending RTU 
> update and the poll timeout */
>       CLMA_DOWN_LIST *clma_down_list_head;    /* CLMA down reccords - Fix for 
> Failover missed
>                                                  down events Processing */
>       CLMA_DOWN_LIST *clma_down_list_tail;
> diff --git a/osaf/services/saf/clmsv/clms/clms_imm.c 
> b/osaf/services/saf/clmsv/clms/clms_imm.c
> --- a/osaf/services/saf/clmsv/clms/clms_imm.c
> +++ b/osaf/services/saf/clmsv/clms/clms_imm.c
> @@ -22,6 +22,9 @@
>   extern struct ImmutilWrapperProfile immutilWrapperProfile;
>   
>   void clms_all_node_rattr_update(void);
> +void clms_retry_pending_rtupdates(void);
> +void clms_switchoff_all_pending_rtupdates(void);
> +void clms_switchon_all_pending_rtupdates(void);
>   SaAisErrorT clms_node_ccb_comp_cb(CcbUtilOperationData_t * opdata);
>   uint32_t clms_imm_node_unlock(CLMS_CLUSTER_NODE * nodeop);
>   uint32_t clms_imm_node_lock(CLMS_CLUSTER_NODE * nodeop);
> @@ -32,6 +35,10 @@ static uint32_t clms_lock_send_no_start_
>   
>   static SaVersionT immVersion = { 'A', 2, 1 };
>   
> +
> +const unsigned int sleep_delay_ms = 500;
> +const unsigned int max_waiting_time_ms = 60 * 1000;     /* 60 seconds */
> +
>   /**
>   * Initialize the track response patricia tree for the node
>   * @param[in] node node to initialize trackresponse tree
> @@ -64,22 +71,49 @@ static void *imm_impl_set_node_down_proc
>       NODE_DOWN_LIST *node_down_rec = NULL;
>       NODE_DOWN_LIST *temp_node_down_rec = NULL;
>       CLMS_CLUSTER_NODE *node = NULL;
> +     int msecs_waited;
>   
>       TRACE_ENTER();
>   
>       /* Update IMM */
> -     if ((rc = immutil_saImmOiImplementerSet(cb->immOiHandle, 
> IMPLEMENTER_NAME)) != SA_AIS_OK) {
> -             LOG_ER("saImmOiImplementerSet failed rc:%u, exiting", rc);
> +
> +     msecs_waited = 0;
> +     rc = saImmOiImplementerSet(cb->immOiHandle, IMPLEMENTER_NAME);
> +     while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_EXIST)) &&
> +                                             (msecs_waited < 
> max_waiting_time_ms)) {
> +             usleep(sleep_delay_ms * 1000);
> +             msecs_waited += sleep_delay_ms;
> +             rc = saImmOiImplementerSet(cb->immOiHandle, IMPLEMENTER_NAME);
> +     }
> +     if (rc != SA_AIS_OK) {
> +             /* We have tried enough, now just exit */
> +             LOG_ER("saImmOiImplementerSet failed, rc = %u", rc);
>               exit(EXIT_FAILURE);
>       }
> -
> -     if ((rc = immutil_saImmOiClassImplementerSet(cb->immOiHandle, 
> "SaClmNode")) != SA_AIS_OK) {
> -             LOG_ER("saImmOiClassImplementerSet failed for class SaClmNode 
> rc:%u, exiting", rc);
> +     
> +     msecs_waited = 0;
> +     rc = saImmOiClassImplementerSet(cb->immOiHandle, "SaClmNode");
> +     while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_EXIST)) &&
> +                                             (msecs_waited < 
> max_waiting_time_ms)) {
> +             usleep(sleep_delay_ms * 1000);
> +             msecs_waited += sleep_delay_ms;
> +             rc = saImmOiClassImplementerSet(cb->immOiHandle, "SaClmNode");
> +     }
> +     if (rc != SA_AIS_OK) {
> +             LOG_ER("saImmOiClassImplementerSet failed for class SaClmNode, 
> rc = %u", rc);
>               exit(EXIT_FAILURE);
>       }
> -
> -     if ((rc = immutil_saImmOiClassImplementerSet(cb->immOiHandle, 
> "SaClmCluster")) != SA_AIS_OK) {
> -             LOG_ER("saImmOiClassImplementerSet failed for class 
> SaClmCluster rc:%u, exiting", rc);
> +     
> +     msecs_waited = 0;
> +     rc = saImmOiClassImplementerSet(cb->immOiHandle, "SaClmCluster");
> +     while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_EXIST)) &&
> +                                             (msecs_waited < 
> max_waiting_time_ms)) {
> +             usleep(sleep_delay_ms * 1000);
> +             msecs_waited += sleep_delay_ms;
> +             rc = saImmOiClassImplementerSet(cb->immOiHandle, 
> "SaClmCluster");
> +     }
> +     if (rc != SA_AIS_OK) {
> +             LOG_ER("saImmOiClassImplementerSet failed for class 
> SaClmCluster, rc = %u,", rc);
>               exit(EXIT_FAILURE);
>       }
>   
> @@ -175,7 +209,10 @@ CLMS_CLUSTER_NODE *clms_node_new(SaNameT
>       node->node_name.length = name->length;
>       node->node_addr.family = 1;
>       node->admin_state = SA_CLM_ADMIN_UNLOCKED;
> +     node->rtu_pending = false;
> +     node->admin_rtu_pending = false;
>   
> +     TRACE("RTU pending flag is switched off");
>       TRACE("nodename %s", node->node_name.value);
>   
>       while ((attr = attrs[i++]) != NULL) {
> @@ -350,6 +387,9 @@ SaAisErrorT clms_cluster_config_get(void
>               if (clms_cb->ha_state == SA_AMF_HA_ACTIVE) {
>                       osaf_cluster->init_time = clms_get_SaTime();
>               }
> +
> +             osaf_cluster->rtu_pending = false;
> +             TRACE("RTU pending flag is switched off");
>       }
>       rc = SA_AIS_OK;
>    done2:
> @@ -405,8 +445,8 @@ SaAisErrorT clms_imm_activate(CLMS_CB *c
>                       goto done;
>               }
>   
> +             cb->is_impl_set = true;
>               clms_all_node_rattr_update();
> -             cb->is_impl_set = true;
>       }
>   
>       rc = SA_AIS_OK;
> @@ -428,6 +468,13 @@ void clms_admin_state_update_rattr(CLMS_
>   
>       TRACE_ENTER2("Admin state %d update for node %s", nd->admin_state, 
> nd->node_name.value);
>   
> +     CLMS_CLUSTER_NODE *node = NULL;
> +     /* If this update was attempted was for a node down and as a part of 
> try-again-later, then
> +      * we need to lookup using name, because the node_id record would
> +      * have been deleted as a part of node down processing
> +      */
> +     node = clms_node_get_by_name(&nd->node_name);
> +
[Ramesh]: Take appropriate action if node == NULL;
>       SaImmAttrValueT attrUpdateValue[] = { &nd->admin_state };
>       const SaImmAttrModificationT_2 *attrMods[] = {
>               &attr_Mod[0],
> @@ -440,13 +487,33 @@ void clms_admin_state_update_rattr(CLMS_
>       attr_Mod[0].modAttr.attrValueType = SA_IMM_ATTR_SAUINT32T;
>       attr_Mod[0].modAttr.attrValues = attrUpdateValue;
>   
> -     int errorsAreFatal = immutilWrapperProfile.errorsAreFatal;
> -     immutilWrapperProfile.errorsAreFatal = 0;
> -     rc = immutil_saImmOiRtObjectUpdate_2(clms_cb->immOiHandle, 
> &nd->node_name, attrMods);
> -     immutilWrapperProfile.errorsAreFatal = errorsAreFatal;
> +     rc = saImmOiRtObjectUpdate_2(clms_cb->immOiHandle, &nd->node_name, 
> attrMods);
> +     if (rc == SA_AIS_OK) {
> +             node->admin_rtu_pending = false;
> +             /* Update the global flag for try-again only if cluster update 
> is done.
> +              * Note the cluster is done only after node update.
> +              */
> +             if ((clms_cb->rtu_pending == true) && (node->rtu_pending == 
> false)
> +                                             && (osaf_cluster->rtu_pending 
> == false)){
[Ramesh]: Not required to specifically check (clms_cb->rtu_pending == true);
> +                     clms_cb->rtu_pending = false;
[Ramesh]: Cannot set clms_cb->rtu_pending = false; need to check all 
node's rtu_pending and admin_rtu_pending + osaf_cluster->rtu_pending 
states are false.
> +                     TRACE("RTUpdate success. Turning off flag");
> +             }
> +     } else if ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT)) {
> +             LOG_IN("saImmOiRtObjectUpdate for %s failed with rc = %u. 
> Trying again", node->node_name.value, rc);
> +             node->admin_rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +     } else {
> +             /* Right now, there is no guarantee on IMM error codes. So 
> Reinit for everything else */
> +             LOG_IN("saImmOiRtObjectUpdate for %s failed with rc = %u. 
> Reinit with IMM", node->node_name.value, rc);
> +             node->admin_rtu_pending = true;
> +             clms_cb->rtu_pending = true;
>   
> -     if (rc != SA_AIS_OK) {
> -             LOG_ER("saImmOiRtObjectUpdate FAILED %u, '%s'", rc, 
> nd->node_name.value);
> +             saImmOiFinalize(clms_cb->immOiHandle);
> +             clms_cb->immOiHandle = 0;
> +             clms_cb->is_impl_set = false;
> +
> +             /* Initiate IMM reinitializtion in the background */
> +             clm_imm_reinit_bg(clms_cb);
>       }
>   
>       TRACE_LEAVE();
> @@ -473,7 +540,18 @@ void clms_node_update_rattr(CLMS_CLUSTER
>               NULL
>       };
>   
> +     CLMS_CLUSTER_NODE *node = NULL;
> +
>       TRACE_ENTER();
> +     node = clms_node_get_by_name(&nd->node_name);
> +
[Ramesh]: Take appropriate action of node == NULL;
> +     if (clms_cb->is_impl_set == false) {
> +             TRACE("Implementer not yet set: Switching on the tryagain 
> flag");
> +             node->rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +             TRACE_LEAVE();
> +             return;
> +     }
>   
>       attr_Mod[0].modType = SA_IMM_ATTR_VALUES_REPLACE;
>       attr_Mod[0].modAttr.attrName = "saClmNodeIsMember";
> @@ -499,20 +577,37 @@ void clms_node_update_rattr(CLMS_CLUSTER
>       attr_Mod[3].modAttr.attrValueType = SA_IMM_ATTR_SAUINT64T;
>       attr_Mod[3].modAttr.attrValues = attrUpdateValue3;
>   
> -     int errorsAreFatal = immutilWrapperProfile.errorsAreFatal;
> -     immutilWrapperProfile.errorsAreFatal = 0;
> -     rc = immutil_saImmOiRtObjectUpdate_2(clms_cb->immOiHandle, 
> &nd->node_name, attrMods);
> -     immutilWrapperProfile.errorsAreFatal = errorsAreFatal;
> +     rc = saImmOiRtObjectUpdate_2(clms_cb->immOiHandle, &nd->node_name, 
> attrMods);
>   
> -     if (rc != SA_AIS_OK) {
> -             LOG_ER("saImmOiRtObjectUpdate FAILED %u, '%s'", rc, 
> nd->node_name.value);
> +     if (rc == SA_AIS_OK) {
> +             node->rtu_pending = false;
> +             if ((clms_cb->rtu_pending == true) && (node->rtu_pending == 
> false)
> +                                             && (osaf_cluster->rtu_pending 
> == false)){
[Ramesh]: Not required to specifically check (clms_cb->rtu_pending == 
true);  Also (node->rtu_pending == false) should be 
(node->admin_rtu_pending)
> +                     clms_cb->rtu_pending = false;
[Ramesh]: As mentioned above, Cannot set clms_cb->rtu_pending = false; 
need to check all node's rtu_pending and admin_rtu_pending + 
osaf_cluster->rtu_pending states are false.

> +                     TRACE("RTU success. Turning off tryagain flag");
> +             }
> +     } else if ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT)) {
> +             LOG_IN("saImmOiRtObjectUpdate for %s failed with rc = %u. 
> Trying again", node->node_name.value, rc);
> +             node->rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +     } else {
> +             LOG_IN("saImmOiRtObjectUpdate for %s failed with rc = %u. 
> Reinit with IMM", node->node_name.value, rc);
> +             node->rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +
> +             saImmOiFinalize(clms_cb->immOiHandle);
> +             clms_cb->immOiHandle = 0;
> +             clms_cb->is_impl_set = false;
> +
> +             /* Initiate IMM reinitializtion in the background */
> +             clm_imm_reinit_bg(clms_cb);
>       }
>   
>       TRACE_LEAVE();
>   }
>   
>   /**
> -* Update IMMSv the runtime info of all node
> +* Update IMMSv the runtime info of all nodes
>   */
>   void clms_all_node_rattr_update(void)
>   {
> @@ -528,6 +623,74 @@ void clms_all_node_rattr_update(void)
>   }
>   
>   /**
> +*  Process all pending runtime attribute updates toward IMM
> +*/
> +void clms_retry_pending_rtupdates(void)
> +{
> +     CLMS_CLUSTER_NODE *node = NULL;
> +     SaNameT nodename = {0};
> +     TRACE_ENTER();
> +
> +     if (clms_cb->is_impl_set == false) {
> +             TRACE_LEAVE2("Implementerset yet to happen, try later");
> +             return;
> +     }
> +     for (node = clms_node_getnext_by_name(&nodename); node != NULL; node = 
> clms_node_getnext_by_name(&nodename)) {
> +             if (node->rtu_pending == true)
> +                     clms_node_update_rattr(node);
> +             if (node->admin_rtu_pending == true)
> +                     clms_admin_state_update_rattr(node);
> +             memcpy(&nodename, &node->node_name, sizeof(SaNameT));
> +     }
> +
> +     if (osaf_cluster->rtu_pending == true)
> +             clms_cluster_update_rattr(osaf_cluster);
[Ramesh]: What about setting "clms_cb->rtu_pending = false";
> +     TRACE_LEAVE();
> +}
> +
> +/**
> +*  As a standby, clear all pending runtime attribute updates toward IMM
> +*  The new active will take care of it.
> +*/
> +void clms_switchoff_all_pending_rtupdates(void)
> +{
> +     CLMS_CLUSTER_NODE *node = NULL;
> +     SaNameT nodename = {0};
> +     TRACE_ENTER();
> +
> +     for (node = clms_node_getnext_by_name(&nodename); node != NULL; node = 
> clms_node_getnext_by_name(&nodename)) {
> +             TRACE("Switching on the tryagain flag");
> +             node->rtu_pending = false;
> +             node->admin_rtu_pending = false;
> +             memcpy(&nodename, &node->node_name, sizeof(SaNameT));
> +     }
> +     osaf_cluster->rtu_pending = false;
> +     clms_cb->rtu_pending = false;
> +     TRACE_LEAVE();
> +}
> +
> +/**
> +*  As a standby, clear all pending runtime attribute updates toward IMM
> +*  The new active will take care of it.
> +*/
> +void clms_switchon_all_pending_rtupdates(void)
> +{
> +     CLMS_CLUSTER_NODE *node = NULL;
> +     SaNameT nodename = {0};
> +     TRACE_ENTER();
> +
> +     for (node = clms_node_getnext_by_name(&nodename); node != NULL; node = 
> clms_node_getnext_by_name(&nodename)) {
> +             TRACE("Switching on the pending RTUs");
> +             node->rtu_pending = true;
> +             node->admin_rtu_pending = true;
> +             memcpy(&nodename, &node->node_name, sizeof(SaNameT));
> +     }
> +     osaf_cluster->rtu_pending = true;
> +     clms_cb->rtu_pending = true;
> +     TRACE_LEAVE();
> +}
> +
> +/**
>   * Update IMMSv with the runtime info of the osaf cluster
>   * @param[in] osaf_cluster pointer to CLM Cluster
>   */
> @@ -546,6 +709,14 @@ void clms_cluster_update_rattr(CLMS_CLUS
>   
>       TRACE_ENTER();
>   
> +     if (clms_cb->is_impl_set == false) {
> +             TRACE("Implementer is not set. Switching on flag in %s", 
> __FUNCTION__);
> +             osaf_cluster->rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +             TRACE_LEAVE();
> +             return;
> +     }
> +
>       attr_Mod[0].modType = SA_IMM_ATTR_VALUES_REPLACE;
>       attr_Mod[0].modAttr.attrName = "saClmClusterNumNodes";
>       attr_Mod[0].modAttr.attrValuesNumber = 1;
> @@ -558,13 +729,29 @@ void clms_cluster_update_rattr(CLMS_CLUS
>       attr_Mod[1].modAttr.attrValueType = SA_IMM_ATTR_SATIMET;
>       attr_Mod[1].modAttr.attrValues = attrUpdateValue1;
>   
> -     int errorsAreFatal = immutilWrapperProfile.errorsAreFatal;
> -     immutilWrapperProfile.errorsAreFatal = 0;
> -     rc = immutil_saImmOiRtObjectUpdate_2(clms_cb->immOiHandle, 
> &osaf_cluster->name, attrMods);
> -     immutilWrapperProfile.errorsAreFatal = errorsAreFatal;
> +     rc = saImmOiRtObjectUpdate_2(clms_cb->immOiHandle, &osaf_cluster->name, 
> attrMods);
>   
> -     if (rc != SA_AIS_OK) {
> -             LOG_ER("saImmOiRtObjectUpdate FAILED %u, '%s'", rc, 
> osaf_cluster->name.value);
> +     if (rc == SA_AIS_OK){
> +             osaf_cluster->rtu_pending = false;
> +             if (clms_cb->rtu_pending == true) {/* Cluster update is done 
> after node update */
> +                     clms_cb->rtu_pending = false;
[Ramesh]: As mentioned above, Cannot set clms_cb->rtu_pending = false; 
need to check all node's rtu_pending and admin_rtu_pending + 
osaf_cluster->rtu_pending states are false.
> +                     TRACE("RTU success, Switching off");
> +             }
> +     } else if ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT)) {
> +             LOG_IN("saImmOiRtObjectUpdate failed for cluster object with rc 
> = %u. Trying again", rc);
> +             osaf_cluster->rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +     } else {
> +             LOG_IN("saImmOiRtObjectUpdate failed for cluster object with rc 
> = %u. Reinit with IMM", rc);
> +             osaf_cluster->rtu_pending = true;
> +             clms_cb->rtu_pending = true;
> +
> +             saImmOiFinalize(clms_cb->immOiHandle);
> +             clms_cb->immOiHandle = 0;
> +             clms_cb->is_impl_set = false;
> +
> +             /* Initiate IMM reinitializtion in the background */
> +             clm_imm_reinit_bg(clms_cb);
>       }
>   
>       /* TBD: We need to handle a case where there's only one node,
> diff --git a/osaf/services/saf/clmsv/clms/clms_imm.h 
> b/osaf/services/saf/clmsv/clms/clms_imm.h
> --- a/osaf/services/saf/clmsv/clms/clms_imm.h
> +++ b/osaf/services/saf/clmsv/clms/clms_imm.h
> @@ -45,4 +45,7 @@ extern uint32_t clms_prep_and_send_track
>   extern uint32_t clms_send_track_local(CLMS_CLUSTER_NODE * node, 
> CLMS_CLIENT_INFO * client,
>                                    SaClmChangeStepT step);
>   extern void clms_trackresp_patricia_init(CLMS_CLUSTER_NODE * node);
> +extern void clms_switchoff_all_pending_rtupdates(void);
> +extern void clms_switchon_all_pending_rtupdates(void);
> +extern void clms_retry_pending_rtupdates(void);
>   #endif
> diff --git a/osaf/services/saf/clmsv/clms/clms_main.c 
> b/osaf/services/saf/clmsv/clms/clms_main.c
> --- a/osaf/services/saf/clmsv/clms/clms_main.c
> +++ b/osaf/services/saf/clmsv/clms/clms_main.c
> @@ -227,6 +227,7 @@ uint32_t clms_cb_init(CLMS_CB * clms_cb)
>       clms_cb->curr_invid = 1;
>       clms_cb->immOiHandle = 0;
>       clms_cb->is_impl_set = false;
> +     clms_cb->rtu_pending = false; /* Flag to control try-again of 
> rt-updates */
>   
>       /* Assign Version. Currently, hardcoded, This will change later */
>       clms_cb->clm_ver.releaseCode = CLM_RELEASE_CODE;
> @@ -378,6 +379,7 @@ int main(int argc, char *argv[])
>       SaAisErrorT error = SA_AIS_OK;
>       uint32_t rc;
>       osaf_cluster = NULL;
> +     int timeout = -1;
>   
>       daemonize(argc, argv);
>   
> @@ -405,6 +407,13 @@ int main(int argc, char *argv[])
>   
>       while (1) {
>   
> +             if (clms_cb->rtu_pending == true) {
> +                     LOG_IN("There is an IMM task to be tried again. setting 
> poll time out to 500");
> +                     timeout = 500;
> +             }else {
> +                     timeout = -1;
> +             }
> +
>               if ((clms_cb->immOiHandle != 0) && (clms_cb->is_impl_set == 
> true)) {
>                       fds[FD_IMM].fd = clms_cb->imm_sel_obj;
>                       fds[FD_IMM].events = POLLIN;
> @@ -412,8 +421,7 @@ int main(int argc, char *argv[])
>               } else {
>                       nfds = NUM_FD - 1;
>               }
> -
> -             int ret = poll(fds, nfds, -1);
> +             int ret = poll(fds, nfds, timeout);
>   
>               if (ret == -1) {
>                       if (errno == EINTR)
> @@ -422,6 +430,14 @@ int main(int argc, char *argv[])
>                       LOG_ER("poll failed - %s", strerror(errno));
>                       break;
>               }
> +
> +             if (ret == 0) {
> +                     /* Process any/all pending RTAttribute updates to IMM */
> +                     TRACE("poll time out processing pending updates");
> +                     clms_retry_pending_rtupdates();
> +                     continue;
> +             }
> +
>               if (fds[FD_AMF].revents & POLLIN) {
>                       if (clms_cb->amf_hdl != 0) {
>                               if ((error = saAmfDispatch(clms_cb->amf_hdl, 
> SA_DISPATCH_ALL)) != SA_AIS_OK) {
> @@ -496,7 +512,10 @@ int main(int argc, char *argv[])
>                               }
>                       }
>               }
> -     }
> +             /* Retry any pending updates */
> +             if (clms_cb->rtu_pending == true)
> +                     clms_retry_pending_rtupdates();
> +     } /* End while (1) */
>   
>    done:
>       LOG_ER("Failed, exiting...");

------------------------------------------------------------------------------
Shape the Mobile Experience: Free Subscription
Software experts and developers: Be at the forefront of tech innovation.
Intel(R) Software Adrenaline delivers strategic insight and game-changing 
conversations that shape the rapidly evolving mobile landscape. Sign up now. 
http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to