Hi Danh, Ack with minor comments.
My opinion is that, the newly added function `get_evt_data` should be used only inside the immnd_evt.c (C code) and should only be used when receiving fevs msg from IMMD regardless the immnd_evt_proc_fevs_dispatch() returns OK or not. With that, we should locate `get_evt_data` function internally inside immnd_evt.c. Regards, Vu > -----Original Message----- > From: Danh Vo <danh.c...@dektech.com.au> > Sent: Monday, July 30, 2018 6:33 PM > To: hans.nordeb...@ericsson.com; lennart.l...@ericsson.com; > gary....@dektech.com.au; vu.m.ngu...@dektech.com.au > Cc: opensaf-devel@lists.sourceforge.net; Danh Vo > <danh.c...@dektech.com.au> > Subject: [PATCH 1/1] imm: syslog recent fevs evts when immnd down [#2898] > > An enhancement for IMM to print out 5 last FEVS events into syslog when > IMMND down for any reason. > --- > src/imm/common/immsv_evt.c | 2 +- > src/imm/common/immsv_evt.h | 1 + > src/imm/immnd/immnd_evt.c | 209 > ++++++++++++++++++++++++++++++++++++++++++++- > 3 files changed, 208 insertions(+), 4 deletions(-) > > diff --git a/src/imm/common/immsv_evt.c b/src/imm/common/immsv_evt.c > index b0e36d3..03a7f81 100644 > --- a/src/imm/common/immsv_evt.c > +++ b/src/imm/common/immsv_evt.c > @@ -189,7 +189,7 @@ static const char *immnd_evt_names[] = { > "IMMND_EVT_D2ND_IMPLDELETE", > "undefined (high)"}; > > -static const char *immsv_get_immnd_evt_name(unsigned int id) > +const char *immsv_get_immnd_evt_name(unsigned int id) > { > if (id < IMMND_EVT_MAX) > return immnd_evt_names[id]; > diff --git a/src/imm/common/immsv_evt.h b/src/imm/common/immsv_evt.h > index 3e96c98..156220d 100644 > --- a/src/imm/common/immsv_evt.h > +++ b/src/imm/common/immsv_evt.h > @@ -676,6 +676,7 @@ void > immsv_evt_free_att_val(IMMSV_EDU_ATTR_VAL *v, SaImmValueTypeT t); > void immsv_evt_free_att_val_raw(IMMSV_EDU_ATTR_VAL *v, long t); > void immsv_free_attr_list_raw(IMMSV_EDU_ATTR_VAL_LIST *al, const long > avt); > > +const char *immsv_get_immnd_evt_name(unsigned int id); > void immsv_msg_trace_send(MDS_DEST to, IMMSV_EVT *evt); > void immsv_msg_trace_rec(MDS_DEST from, IMMSV_EVT *evt); > > diff --git a/src/imm/immnd/immnd_evt.c b/src/imm/immnd/immnd_evt.c > index 730c490..e277fb5 100644 > --- a/src/imm/immnd/immnd_evt.c > +++ b/src/imm/immnd/immnd_evt.c > @@ -32,6 +32,7 @@ > #include "immnd.h" > #include "imm/common/immsv_api.h" > #include "base/ncssysf_mem.h" > +#include "base/saf_error.h" > #include "mds/mds_papi.h" > #include "base/osaf_extended_name.h" > > @@ -39,6 +40,21 @@ > #define IMMND_SEARCH_BUNDLE_SIZE ((MDS_DIRECT_BUF_MAXSIZE / > 100) * 90) > #define IMMND_MAX_SEARCH_RESULT (IMMND_SEARCH_BUNDLE_SIZE / > 300) > > +#define MAX_INDEX_FEVS_MSG 5 > +#define MAX_LENGTH_FEVS_MSG 256 > + [Vu] Add a comment here to stress that this global array should be used only to contain debugging data. > +static char latest_fevs[MAX_INDEX_FEVS_MSG][MAX_LENGTH_FEVS_MSG] > = { > + "(none)", "(none)", "(none)", "(none)", "(none)" > +}; > + > +static void syslog_recent_fevs() > +{ > + LOG_NO("Recent fevs"); > + for (int i = 0; i < MAX_INDEX_FEVS_MSG; i++) { > + LOG_NO("%s", latest_fevs[i]); > + } > +} > + > static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS > *fevsReq, > const IMMSV_SEND_INFO *sinfo); > static uint32_t immnd_evt_proc_cb_dump(IMMND_CB *cb); > @@ -287,6 +303,8 @@ static uint32_t immnd_evt_proc_reset(IMMND_CB > *cb, IMMND_EVT *evt, > > static uint32_t immnd_evt_impl_delete(IMMND_CB *cb, IMMND_EVT *evt); > > +static void get_evt_data(IMMND_CB *cb, IMMND_EVT *evt, char* > evt_data); > + > #if 0 /* Only for debug */ > static void printImmValue(SaImmValueTypeT t, IMMSV_EDU_ATTR_VAL *v) > { > @@ -9601,7 +9619,8 @@ static uint32_t immnd_restricted_ok(IMMND_CB > *cb, uint32_t id) > static SaAisErrorT > immnd_evt_proc_fevs_dispatch(IMMND_CB *cb, IMMSV_OCTET_STRING > *msg, > bool originatedAtThisNd, SaImmHandleT clnt_hdl, > - MDS_DEST reply_dest, SaUint64T msgNo) > + MDS_DEST reply_dest, SaUint64T msgNo, > + char* evt_data) > { > SaAisErrorT error = SA_AIS_OK; > IMMSV_EVT frwrd_evt; > @@ -9665,7 +9684,7 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *cb, > IMMSV_OCTET_STRING *msg, > > /*Dispatch the unpacked FEVS message */ > immsv_msg_trace_rec(frwrd_evt.sinfo.dest, &frwrd_evt); > - > + get_evt_data(immnd_cb, &frwrd_evt.info.immnd, evt_data); > switch (frwrd_evt.info.immnd.type) { > case IMMND_EVT_A2ND_OBJ_CREATE: > case IMMND_EVT_A2ND_OBJ_CREATE_2: > @@ -10735,7 +10754,11 @@ static uint32_t > immnd_evt_proc_fevs_rcv(IMMND_CB *cb, IMMND_EVT *evt, > bool isObjSync = (evt->type == > IMMND_EVT_D2ND_GLOB_FEVS_REQ_2) > ? evt->info.fevsReq.isObjSync > : false; > + static int index = 0; > + char evt_data[MAX_LENGTH_FEVS_MSG]; > + > TRACE_ENTER(); > + memset(evt_data, 0, sizeof(evt_data)); > > if (cb->highestProcessed >= msgNo) { > /*We have already received this message, discard it. */ > @@ -10784,6 +10807,7 @@ static uint32_t > immnd_evt_proc_fevs_rcv(IMMND_CB *cb, IMMND_EVT *evt, > LOG_ER( > "MESSAGE:%llu OUT OF ORDER my highest > processed:%llu - exiting", > msgNo, cb->highestProcessed); > + syslog_recent_fevs(); > immnd_ackToNid(NCSCC_RC_FAILURE); > exit(1); > } else if (cb > @@ -10792,6 +10816,7 @@ static uint32_t > immnd_evt_proc_fevs_rcv(IMMND_CB *cb, IMMND_EVT *evt, > LOG_ER( > "Sync MESSAGE:%llu OUT OF ORDER my highest > processed:%llu - exiting", > msgNo, cb->highestProcessed); > + syslog_recent_fevs(); > immnd_ackToNid(NCSCC_RC_FAILURE); > exit(1); > } else if (cb->mState < IMM_SERVER_LOADING_PENDING) { > @@ -10816,7 +10841,8 @@ static uint32_t > immnd_evt_proc_fevs_rcv(IMMND_CB *cb, IMMND_EVT *evt, > TRACE("Coord discards object sync message"); > } else { > err = immnd_evt_proc_fevs_dispatch(cb, msg, > originatedAtThisNd, > - clnt_hdl, reply_dest, msgNo); > + clnt_hdl, reply_dest, > + msgNo, evt_data); > } > > if (err != SA_AIS_OK) { > @@ -10827,6 +10853,10 @@ static uint32_t > immnd_evt_proc_fevs_rcv(IMMND_CB *cb, IMMND_EVT *evt, > } > } > > + snprintf(latest_fevs[index], MAX_LENGTH_FEVS_MSG, > + "<%llu>[%s]", msgNo, evt_data); > + > + if (++index > MAX_INDEX_FEVS_MSG - 1) index = 0; > done: > cb->highestProcessed++; > dequeue_outgoing(cb); > @@ -10912,6 +10942,8 @@ static void > immnd_evt_proc_discard_node(IMMND_CB *cb, IMMND_EVT *evt, > cb->node_id); > exit(1); > } > + > + syslog_recent_fevs(); > LOG_NO("Global discard node received for nodeId:%x pid:%u", > evt->info.ctrl.nodeId, evt->info.ctrl.ndExecPid); > /* We should remember the nodeId/pid pair to avoid a redundant > message > @@ -12379,3 +12411,174 @@ static uint32_t > immnd_evt_impl_delete(IMMND_CB *cb, IMMND_EVT *evt) > failed: > return rc; > } > + > + > +/************************************************************* > ********* > + * An enhancement from ticket #2898 to get more info from events [Vu] Should only describe what below method does. > + > ************************************************************** > ********/ > +static void get_evt_data(IMMND_CB *cb, IMMND_EVT *evt, char* > evt_data) [Vu] If the function says "get", the declaration should be: static const char* get_evt_data(const IMMND_CB *cb, const IMMND_EVT *evt) and using const for read-only parameters. > +{ > + const char* evt_name = immsv_get_immnd_evt_name(evt->type); > + char evt_info[MAX_LENGTH_FEVS_MSG]; > + int is_no_info = 0; > + > + switch (evt->type) { > + case IMMND_EVT_A2ND_OBJ_CREATE: > + case IMMND_EVT_A2ND_OBJ_CREATE_2: > + case IMMND_EVT_A2ND_OI_OBJ_CREATE: > + case IMMND_EVT_A2ND_OI_OBJ_CREATE_2: > + snprintf(evt_info, sizeof(evt_info), "Create object of class %s", > + (const char*)evt->info.objCreate.className.buf); > + break; > + > + case IMMND_EVT_A2ND_OBJ_MODIFY: > + case IMMND_EVT_A2ND_OI_OBJ_MODIFY: > + snprintf(evt_info, sizeof(evt_info), "%s", > + (const char*)evt->info.objModify.objectName.buf); > + break; > + > + case IMMND_EVT_A2ND_OBJ_DELETE: > + case IMMND_EVT_A2ND_OI_OBJ_DELETE: > + snprintf(evt_info, sizeof(evt_info), "%s", > + (const char*)evt->info.objDelete.objectName.buf); > + break; > + > + case IMMND_EVT_A2ND_OBJ_SYNC: > + case IMMND_EVT_A2ND_OBJ_SYNC_2: > + snprintf(evt_info, sizeof(evt_info), "%s", > + (const char*)evt->info.obj_sync.objectName.buf); > + break; > + > + case IMMND_EVT_A2ND_IMM_ADMOP: > + case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC: > + snprintf(evt_info, sizeof(evt_info), "%s(op_id:%llu)", > + (const char*)evt->info.admOpReq.objectName.buf, > + evt->info.admOpReq.operationId); > + break; > + > + case IMMND_EVT_A2ND_CLASS_CREATE: > + case IMMND_EVT_A2ND_CLASS_DELETE: > + snprintf(evt_info, sizeof(evt_info), "%s", > + (const char*)evt->info.classDescr.className.buf); > + break; > + > + case IMMND_EVT_D2ND_DISCARD_IMPL: > + case IMMND_EVT_A2ND_OI_IMPL_CLR: > + case IMMND_EVT_D2ND_IMPLSET_RSP: > + case IMMND_EVT_D2ND_IMPLSET_RSP_2: > + snprintf(evt_info, sizeof(evt_info), "%s(%u)", > + (const char*)evt->info.implSet.impl_name.buf, > + evt->info.implSet.impl_id); > + break; > + > + case IMMND_EVT_D2ND_ADMINIT: > + snprintf(evt_info, sizeof(evt_info), "%s(%d)", > + osaf_extended_name_borrow( > + &(evt->info.adminitGlobal.i.adminOwnerName)), > + evt->info.adminitGlobal.globalOwnerId); > + break; > + > + case IMMND_EVT_D2ND_CCBINIT: > + snprintf(evt_info, sizeof(evt_info), "ccb_id:%u", > + evt->info.ccbinitGlobal.globalCcbId); > + break; > + > + case IMMND_EVT_A2ND_AUG_ADMO: > + snprintf(evt_info, sizeof(evt_info), "Add admo_id:%u to ccb_id:%u", > + evt->info.objDelete.adminOwnerId, evt->info.objDelete.ccbId); > + break; > + > + case IMMND_EVT_A2ND_OI_CL_IMPL_SET: > + case IMMND_EVT_A2ND_OI_OBJ_IMPL_SET: > + snprintf(evt_info, sizeof(evt_info), "Set impl_id:%u to %s", > + evt->info.implSet.impl_id, > + (const char*)evt->info.implSet.impl_name.buf); > + break; > + > + case IMMND_EVT_A2ND_OI_CL_IMPL_REL: > + case IMMND_EVT_A2ND_OI_OBJ_IMPL_REL: > + snprintf(evt_info, sizeof(evt_info), "Release impl_id:%u out of %s", > + evt->info.implSet.impl_id, > + (const char*)evt->info.implSet.impl_name.buf); > + break; > + > + case IMMND_EVT_A2ND_ADMO_FINALIZE: > + case IMMND_EVT_D2ND_ADMO_HARD_FINALIZE: > + case IMMND_EVT_A2ND_ADMO_SET: > + case IMMND_EVT_A2ND_ADMO_RELEASE: > + case IMMND_EVT_A2ND_ADMO_CLEAR: > + snprintf(evt_info, sizeof(evt_info), "admo_id:%u", > + evt->info.admFinReq.adm_owner_id); > + break; > + > + case IMMND_EVT_A2ND_OI_CCB_AUG_INIT: > + snprintf(evt_info, sizeof(evt_info), "ccb_id:%u", > + evt->info.ccbUpcallRsp.ccbId); > + break; > + > + case IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP: > + case IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2: > + case IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP: > + case IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2: > + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP: > + case IMMND_EVT_A2ND_CCB_OBJ_DELETE_RSP_2: > + case IMMND_EVT_A2ND_CCB_COMPLETED_RSP: > + case IMMND_EVT_A2ND_CCB_COMPLETED_RSP_2: > + snprintf(evt_info, sizeof(evt_info), "ccb_id:%u, rc:%s", > + evt->info.ccbUpcallRsp.ccbId, > + saf_error(evt->info.ccbUpcallRsp.result)); > + break; > + > + case IMMND_EVT_A2ND_CCB_APPLY: > + case IMMND_EVT_A2ND_CCB_VALIDATE: > + case IMMND_EVT_A2ND_CCB_FINALIZE: > + case IMMND_EVT_D2ND_ABORT_CCB: > + snprintf(evt_info, sizeof(evt_info), "ccb_id:%u", > + evt->info.ccbId); > + break; > + > + case IMMND_EVT_A2ND_PBE_ADMOP_RSP: > + snprintf(evt_info, sizeof(evt_info), "rc:%s", > + saf_error(evt->info.admOpRsp.result)); > + break; > + > + case IMMND_EVT_A2ND_PBE_PRT_OBJ_CREATE_RSP: > + case IMMND_EVT_A2ND_PBE_PRTO_DELETES_COMPLETED_RSP: > + case IMMND_EVT_A2ND_PBE_PRT_ATTR_UPDATE_RSP: > + snprintf(evt_info, sizeof(evt_info), "rc:%s", > + saf_error(evt->info.ccbUpcallRsp.result)); > + break; > + > + case IMMND_EVT_D2ND_SYNC_FEVS_BASE: > + snprintf(evt_info, sizeof(evt_info), "sync fevs base: %llu", > + evt->info.syncFevsBase); > + break; > + > + case IMMND_EVT_A2ND_OBJ_SAFE_READ: > + snprintf(evt_info, sizeof(evt_info), "ccb_id:%u locks %s", > + evt->info.searchInit.ccbId, > + (const char*)evt->info.searchInit.rootName.buf); > + break; > + > + case IMMND_EVT_D2ND_IMPLDELETE: > + snprintf(evt_info, sizeof(evt_info), "Delete %u implementer(s)", > + evt->info.impl_delete.size); > + break; > + > + case IMMND_EVT_D2ND_DISCARD_NODE: > + snprintf(evt_info, sizeof(evt_info), "node_id:%u", > + evt->info.ctrl.nodeId); > + break; > + > + default: > + is_no_info = 1; > + break; > + } > + > + if (is_no_info){ [Vu] Add a space before the `{`. > + snprintf(evt_data, MAX_LENGTH_FEVS_MSG, "%s", evt_name); > + } else { > + snprintf(evt_data, MAX_LENGTH_FEVS_MSG, "%s -> %s", > + evt_name, (const char*) evt_info); [Vu] Data casting here is needed? > + } > +} > -- > 2.7.4 ------------------------------------------------------------------------------ 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