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