For Example 64 or 128 ....
---
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");
[Thang]: It's better to inform default value(16) will be used.