Immnd allows IMMSV_FEVS_MAX_PENDING sourced from enviroment variable, or uses default value (16) otherwise --- src/imm/common/immsv_api.h | 4 ---- src/imm/immloadd/imm_loader.cc | 2 +- src/imm/immnd/ImmModel.cc | 2 +- src/imm/immnd/immnd.conf | 4 ++++ src/imm/immnd/immnd_cb.h | 1 + src/imm/immnd/immnd_evt.c | 41 ++++++++++++++++------------------ src/imm/immnd/immnd_main.c | 15 +++++++++++++ 7 files changed, 41 insertions(+), 28 deletions(-)
diff --git a/src/imm/common/immsv_api.h b/src/imm/common/immsv_api.h index c37a624ed..f809c8168 100644 --- a/src/imm/common/immsv_api.h +++ b/src/imm/common/immsv_api.h @@ -77,10 +77,6 @@ typedef enum { ACCESS_CONTROL_ENFORCING = 2 } OsafImmAccessControlModeT; -/*Max # of outstanding fevs messages towards director.*/ -/*Note max-max is 255. cb->fevs_replies_pending is an uint8_t*/ -#define IMMSV_DEFAULT_FEVS_MAX_PENDING 16 - #define IMMSV_MAX_OBJECTS 10000 #define IMMSV_MAX_ATTRIBUTES 128 #define IMMSV_MAX_ADMO_NAME_LENGTH 256 diff --git a/src/imm/immloadd/imm_loader.cc b/src/imm/immloadd/imm_loader.cc index 516fb24ec..fadb0da51 100644 --- a/src/imm/immloadd/imm_loader.cc +++ b/src/imm/immloadd/imm_loader.cc @@ -2318,7 +2318,7 @@ int syncObjectsOfClass(std::string className, SaImmHandleT &immHandle, do { if (retries) { /* TRY_AGAIN while sync is in progress means *this* IMMND most likely - has reached IMMSV_DEFAULT_FEVS_MAX_PENDING. This means that *this* + has reached max pending fevs messages. This means that *this* IMMND has sent its quota of fevs messages to IMMD without having received them back via broadcast from IMMD. diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc index 2d750040e..8631dc21f 100644 --- a/src/imm/immnd/ImmModel.cc +++ b/src/imm/immnd/ImmModel.cc @@ -1614,7 +1614,7 @@ SaAisErrorT immModel_nextResult(IMMND_CB* cb, void* searchOp, TRACE_2( "ERR_TRY_AGAIN: Too many pending incoming fevs " "messages (> %u) rejecting sync iteration next request", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); return SA_AIS_ERR_TRY_AGAIN; } err = ImmModel::instance(&cb->immModel)->nextSyncResult(rsp, *op); diff --git a/src/imm/immnd/immnd.conf b/src/imm/immnd/immnd.conf index e62367654..f9a809e16 100644 --- a/src/imm/immnd/immnd.conf +++ b/src/imm/immnd/immnd.conf @@ -95,3 +95,7 @@ export IMMSV_ENV_HEALTHCHECK_KEY="Default" # objects, objects_blob_multi, # objects_int_multi, objects_real_multi, # objects_text_multi, pbe_rep_version"; + +# Max outstanding fevs messages towards director without having received +# them back via director's broadcast message. Default value is 16. +# export IMMSV_FEVS_MAX_PENDING=64 diff --git a/src/imm/immnd/immnd_cb.h b/src/imm/immnd/immnd_cb.h index bb3bb8493..bc2d75b05 100644 --- a/src/imm/immnd/immnd_cb.h +++ b/src/imm/immnd/immnd_cb.h @@ -209,6 +209,7 @@ typedef struct immnd_cb_tag { NCS_PATRICIA_TREE immnd_clm_list; /* IMMND_IMM_CLIENT_NODE - node */ tmr_t splitbrain_tmr; bool splitbrain_tmr_run; + uint8_t mFevsMaxPending; /* Max pending fevs messages towards director */ } IMMND_CB; /* CB prototypes */ diff --git a/src/imm/immnd/immnd_evt.c b/src/imm/immnd/immnd_evt.c index 0e801a942..64c5223c4 100644 --- a/src/imm/immnd/immnd_evt.c +++ b/src/imm/immnd/immnd_evt.c @@ -1787,7 +1787,7 @@ static uint32_t immnd_evt_proc_search_next(IMMND_CB *cb, IMMND_EVT *evt, IMMSV_OM_RSP_SEARCH_NEXT **rspList = NULL; MDS_DEST implDest = 0LL; bool retardSync = - ((cb->fevs_replies_pending >= IMMSV_DEFAULT_FEVS_MAX_PENDING) && + ((cb->fevs_replies_pending >= cb->mFevsMaxPending) && cb->mIsCoord && (cb->syncPid > 0)); SaUint32T resultSize = 0; IMMSV_OM_RSP_SEARCH_BUNDLE_NEXT bundleSearch = {0, NULL}; @@ -2767,10 +2767,10 @@ static uint32_t immnd_evt_proc_admowner_init(IMMND_CB *cb, IMMND_EVT *evt, goto agent_rsp; } - if (cb->fevs_replies_pending >= IMMSV_DEFAULT_FEVS_MAX_PENDING) { + if (cb->fevs_replies_pending >= cb->mFevsMaxPending) { TRACE_2( "ERR_TRY_AGAIN: Too many pending incoming fevs messages (> %u) rejecting admo_init request", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); send_evt.info.imma.info.admInitRsp.error = SA_AIS_ERR_TRY_AGAIN; goto agent_rsp; } @@ -2895,10 +2895,10 @@ static uint32_t immnd_evt_proc_impl_set(IMMND_CB *cb, IMMND_EVT *evt, goto agent_rsp; } - if (cb->fevs_replies_pending >= IMMSV_DEFAULT_FEVS_MAX_PENDING) { + if (cb->fevs_replies_pending >= cb->mFevsMaxPending) { TRACE_2( "ERR_TRY_AGAIN: Too many pending incoming fevs messages (> %u) rejecting impl_set request", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); send_evt.info.imma.info.implSetRsp.error = SA_AIS_ERR_TRY_AGAIN; goto agent_rsp; } @@ -3061,10 +3061,10 @@ static uint32_t immnd_evt_proc_ccb_init(IMMND_CB *cb, IMMND_EVT *evt, goto agent_rsp; } - if (cb->fevs_replies_pending >= IMMSV_DEFAULT_FEVS_MAX_PENDING) { + if (cb->fevs_replies_pending >= cb->mFevsMaxPending) { TRACE_2( "ERR_TRY_AGAIN: Too many pending incoming fevs messages (> %u) rejecting ccb_init request", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); send_evt.info.imma.info.ccbInitRsp.error = SA_AIS_ERR_TRY_AGAIN; goto agent_rsp; } @@ -3220,11 +3220,10 @@ static uint32_t immnd_evt_proc_rt_update(IMMND_CB *cb, IMMND_EVT *evt, writbale. */ - if (cb->fevs_replies_pending >= - IMMSV_DEFAULT_FEVS_MAX_PENDING) { + if (cb->fevs_replies_pending >= cb->mFevsMaxPending) { TRACE_2( "ERR_TRY_AGAIN: Too many pending incoming fevs messages (> %u) rejecting rt_update request", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); err = SA_AIS_ERR_TRY_AGAIN; goto agent_rsp; } @@ -3497,7 +3496,7 @@ static uint32_t immnd_evt_proc_fevs_forward(IMMND_CB *cb, IMMND_EVT *evt, /* If overflow .....OR IMMD is down.....OR sync is on-going AND out-queue is not empty => go via out-queue. The sync should be throttled by immnd_evt_proc_search_next. */ - if ((cb->fevs_replies_pending >= IMMSV_DEFAULT_FEVS_MAX_PENDING) || + if ((cb->fevs_replies_pending >= cb->mFevsMaxPending) || !immnd_is_immd_up(cb) || ((cb->mState == IMM_SERVER_SYNC_SERVER) && cb->fevs_out_count && asyncReq && newMsg)) { @@ -3518,12 +3517,12 @@ static uint32_t immnd_evt_proc_fevs_forward(IMMND_CB *cb, IMMND_EVT *evt, TRACE_2( "Too many pending incoming FEVS messages (> %u) " "enqueueing async message. Backlog:%u", - IMMSV_DEFAULT_FEVS_MAX_PENDING, backlog); + cb->mFevsMaxPending, backlog); } else { LOG_IN( "Too many pending incoming FEVS messages (> %u) " "enqueueing async message. Backlog:%u", - IMMSV_DEFAULT_FEVS_MAX_PENDING, backlog); + cb->mFevsMaxPending, backlog); } return NCSCC_RC_SUCCESS; @@ -3533,7 +3532,7 @@ static uint32_t immnd_evt_proc_fevs_forward(IMMND_CB *cb, IMMND_EVT *evt, case. */ TRACE_2( "ERR_TRY_AGAIN: Too many pending FEVS message replies (> %u) rejecting request", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); error = SA_AIS_ERR_TRY_AGAIN; goto agent_rsp; } @@ -3824,8 +3823,7 @@ static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq, break; } if (immModel_pbeNotWritable(cb) || - (cb->fevs_replies_pending >= - IMMSV_DEFAULT_FEVS_MAX_PENDING) || + (cb->fevs_replies_pending >= cb->mFevsMaxPending) || !immnd_is_immd_up(cb)) { /* NO_RESOURCES is here imm internal proxy for TRY_AGAIN. The library code for saImmOmCcbApply will @@ -3836,12 +3834,11 @@ static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq, TRY_AGAIN towards that particular library code. */ error = SA_AIS_ERR_NO_RESOURCES; - if (cb->fevs_replies_pending >= - IMMSV_DEFAULT_FEVS_MAX_PENDING) { + if (cb->fevs_replies_pending >= cb->mFevsMaxPending) { TRACE_2( "ERR_TRY_AGAIN: Too many pending FEVS message replies (> %u) rejecting request" "for CcbApply", - IMMSV_DEFAULT_FEVS_MAX_PENDING); + cb->mFevsMaxPending); } } break; @@ -10731,15 +10728,15 @@ void dequeue_outgoing(IMMND_CB *cb) IMMND_EVT dummy_evt; unsigned int space = - (cb->fevs_replies_pending < IMMSV_DEFAULT_FEVS_MAX_PENDING) - ? (IMMSV_DEFAULT_FEVS_MAX_PENDING - cb->fevs_replies_pending) + (cb->fevs_replies_pending < cb->mFevsMaxPending) + ? (cb->mFevsMaxPending - cb->fevs_replies_pending) : 0; TRACE("Pending replies:%u space:%u out list?:%p", cb->fevs_replies_pending, space, cb->fevs_out_list); while (cb->fevs_out_list && space && - (cb->fevs_replies_pending < IMMSV_DEFAULT_FEVS_MAX_PENDING) && + (cb->fevs_replies_pending < cb->mFevsMaxPending) && immnd_is_immd_up(cb)) { memset(&dummy_evt, '\0', sizeof(IMMND_EVT)); unsigned int backlog = immnd_dequeue_outgoing_fevs_msg( diff --git a/src/imm/immnd/immnd_main.c b/src/imm/immnd/immnd_main.c index 410134c97..a26005528 100644 --- a/src/imm/immnd/immnd_main.c +++ b/src/imm/immnd/immnd_main.c @@ -337,6 +337,21 @@ static uint32_t immnd_initialize(char *progname) "Persistent Back-End capability configured, Pbe file:%s (suffix may get added)", immnd_cb->mPbeFile); } + immnd_cb->mFevsMaxPending = 16; + if ((envVar = getenv("IMMSV_FEVS_MAX_PENDING"))) { + int maxFevsPending = atoi(envVar); + if (maxFevsPending > UINT8_MAX) { + LOG_WA("IMMSV_FEVS_MAX_PENDING set too large(%u)", + maxFevsPending); + maxFevsPending = UINT8_MAX; + } else if (maxFevsPending <= 0) { + LOG_WA("Invalid IMMSV_FEVS_MAX_PENDING environment" + " variable"); + maxFevsPending = 16; + } + immnd_cb->mFevsMaxPending = maxFevsPending; + LOG_NO("Use IMMSV_FEVS_MAX_PENDING (%u)", maxFevsPending); + } FILE *fp; char node_type[20]; -- 2.20.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel