Hi Canh, I have some comments:
- API version handling (minor version) is a bit questionable. Maybe Mahesh CLM handling should get an "official" version 2 (is somewhat hidden as is) and version 3 to be used for the callback addition. I think there is a possibility that someone will set version 2 when initializing and assume that filter callback is supported but the server is running 5.1 that will accept version 2 but does not support filter callback. - It would be nice if you could find a way to contain filter handling in a better way. I can see that some of the new handling is hidden in the anonymous utility.cc file - This is not a part of the new code but is there any test that verifies that filtered out log records are not written to the log files if sent by the client Thanks Lennart > -----Original Message----- > From: Canh Van Truong > Sent: den 16 november 2016 08:11 > To: Lennart Lund <lennart.l...@ericsson.com>; Vu Minh Nguyen > <vu.m.ngu...@dektech.com.au>; mahesh.va...@oracle.com; Anders Widell > <anders.wid...@ericsson.com> > Cc: opensaf-devel@lists.sourceforge.net > Subject: RE: [PATCH 1 of 1] log: implement SaLogFilterSetCallbackT [#2146] > > Hi Lennart, > > I already did the upgrade test as your below and it was passed from my side. > I will check and run all test again > > Regards, > Canh > > -----Original Message----- > From: Lennart Lund [mailto:lennart.l...@ericsson.com] > Sent: Tuesday, November 15, 2016 11:16 PM > To: Canh Van Truong; Vu Minh Nguyen; mahesh.va...@oracle.com; Anders > Widell > Cc: opensaf-devel@lists.sourceforge.net > Subject: RE: [PATCH 1 of 1] log: implement SaLogFilterSetCallbackT [#2146] > > Hi Canh > > I have done some testing and have found problems with compatibility > between > versions that will cause problems e.g. during an upgrade. > I have used three nodes running different variants of OpenSAF 5.1 and > default with your patch (5.2) and have found the following: > > All nodes running 5.2: All tests Ok > SC-1 and SC-2 (5.2) and PL-3 (5.1): Many tests fail. No test should fail > SC-1 and SC-2 (5.1) and PL-3 (5.2): Many tests fail. No test except suite 17 > should fail > SC-1 (5.2) SC-2 (5.1) and PL-3 (5.2): Ok > > Yet to test: > Does filter settings still work after switch over or fail over? > > Thanks > Lennart > > > > -----Original Message----- > > From: Canh Van Truong [mailto:canh.v.tru...@dektech.com.au] > > Sent: den 14 november 2016 11:43 > > To: Lennart Lund <lennart.l...@ericsson.com>; Vu Minh Nguyen > > <vu.m.ngu...@dektech.com.au>; mahesh.va...@oracle.com; Anders > Widell > > <anders.wid...@ericsson.com> > > Cc: opensaf-devel@lists.sourceforge.net > > Subject: [PATCH 1 of 1] log: implement SaLogFilterSetCallbackT [#2146] > > > > osaf/libs/agents/saf/lga/lga.h | 7 +- > > osaf/libs/agents/saf/lga/lga_api.c | 4 +- > > osaf/libs/agents/saf/lga/lga_mds.c | 72 +++++- > > osaf/libs/agents/saf/lga/lga_util.c | 58 ++++- > > osaf/libs/common/logsv/include/lgsv_msg.h | 8 + > > osaf/libs/saf/include/saLog.h | 4 + > > osaf/services/saf/logsv/lgs/lgs_cb.h | 1 + > > osaf/services/saf/logsv/lgs/lgs_evt.cc | 9 +- > > osaf/services/saf/logsv/lgs/lgs_evt.h | 2 +- > > osaf/services/saf/logsv/lgs/lgs_imm.cc | 7 + > > osaf/services/saf/logsv/lgs/lgs_mbcsv.cc | 3 +- > > osaf/services/saf/logsv/lgs/lgs_mbcsv.h | 1 + > > osaf/services/saf/logsv/lgs/lgs_mds.cc | 76 ++++-- > > osaf/services/saf/logsv/lgs/lgs_recov.cc | 5 +- > > osaf/services/saf/logsv/lgs/lgs_recov.h | 1 + > > osaf/services/saf/logsv/lgs/lgs_util.cc | 81 ++++++ > > osaf/services/saf/logsv/lgs/lgs_util.h | 3 +- > > tests/logsv/tet_saLogFilterSetCallbackT.c | 364 > > +++++++++++++++++++++++++++++- > > tests/logsv/tet_saLogStreamOpen_2.c | 2 - > > 19 files changed, 663 insertions(+), 45 deletions(-) > > > > > > Implement SaLogFilterSetCallbackT which is mentioned at section 3.6.5 > > SaLogFilterSetCallbackT @ AIS LOG document. > > > > LGS: - Storing filter callback flag when client request open stream > > - Whenever severity filter is changed for app and systerm > > streams, lgs will find which clients that need severity filter > > callback and associate with the stream. Then lgs sends message callback to > clients. > > - Encoding callback message for severity filter callback > > > > LGA: - Sending filter callback flag to lgs when open stream > > - Decoding callback message for severity callback from lgs > > - Dispatching severity filter callback > > > > diff --git a/osaf/libs/agents/saf/lga/lga.h > > b/osaf/libs/agents/saf/lga/lga.h > > --- a/osaf/libs/agents/saf/lga/lga.h > > +++ b/osaf/libs/agents/saf/lga/lga.h > > @@ -35,9 +35,9 @@ > > #include "lgsv_msg.h" > > #include "lgsv_defs.h" > > > > -#define LGA_SVC_PVT_SUBPART_VERSION 1 > > +#define LGA_SVC_PVT_SUBPART_VERSION 2 > > #define LGA_WRT_LGS_SUBPART_VER_AT_MIN_MSG_FMT 1 -#define > > LGA_WRT_LGS_SUBPART_VER_AT_MAX_MSG_FMT 1 > > +#define LGA_WRT_LGS_SUBPART_VER_AT_MAX_MSG_FMT 2 > > #define LGA_WRT_LGS_SUBPART_VER_RANGE \ > > (LGA_WRT_LGS_SUBPART_VER_AT_MAX_MSG_FMT - \ > > LGA_WRT_LGS_SUBPART_VER_AT_MIN_MSG_FMT + 1) @@ -153,6 > +153,9 @@ > > extern bool lga_validate_lga_client_hdl( > > > > /* lga_util.c */ > > extern lga_client_hdl_rec_t *lga_find_hdl_rec_by_regid(lga_cb_t > > *lga_cb, uint32_t client_id); > > +extern lga_log_stream_hdl_rec_t > > *lga_find_stream_hdl_rec_by_regid(lga_cb_t *lga_cb, > > + uint32_t > > client_id, > > + uint32_t > > stream_id); > > extern void lga_msg_destroy(lgsv_msg_t *msg); extern bool > > lga_is_extended_name_valid(const SaNameT* name); > > > > diff --git a/osaf/libs/agents/saf/lga/lga_api.c > > b/osaf/libs/agents/saf/lga/lga_api.c > > --- a/osaf/libs/agents/saf/lga/lga_api.c > > +++ b/osaf/libs/agents/saf/lga/lga_api.c > > @@ -81,6 +81,8 @@ static void populate_open_params(lgsv_st { > > TRACE_ENTER(); > > open_param->client_id = hdl_rec->lgs_client_id; > > + open_param->filter_cb_flags = hdl_rec- > > >reg_cbk.saLogFilterSetCallback == NULL ? > > + 0 : > > SA_LOG_STREAM_FILTER_CALLBACK; > > osaf_extended_name_lend(logStreamName, &open_param- > > >lstr_name); > > > > if (logFileCreateAttributes == NULL || @@ -406,11 +408,11 @@ > > SaAisErrorT saLogDispatch(SaLogHandleT l > > rc = SA_AIS_ERR_UNAVAILABLE; > > goto done; > > } > > - osaf_mutex_unlock_ordie(&lga_cb.cb_lock); > > > > if ((rc = lga_hdl_cbk_dispatch(&lga_cb, hdl_rec, dispatchFlags)) != > > SA_AIS_OK) > > TRACE("LGA_DISPATCH_FAILURE"); > > > > + osaf_mutex_unlock_ordie(&lga_cb.cb_lock); > > ncshm_give_hdl(logHandle); > > > > done: > > diff --git a/osaf/libs/agents/saf/lga/lga_mds.c > > b/osaf/libs/agents/saf/lga/lga_mds.c > > --- a/osaf/libs/agents/saf/lga/lga_mds.c > > +++ b/osaf/libs/agents/saf/lga/lga_mds.c > > @@ -24,7 +24,7 @@ > > > > static MDS_CLIENT_MSG_FORMAT_VER > > > > > LGA_WRT_LGS_MSG_FMT_ARRAY[LGA_WRT_LGS_SUBPART_VER_RANGE] > > = { > > - 1 /*msg format version for LGA subpart > > version 1 */ > > + 1, 2 /* msg format version for LGA subpart */ > > }; > > > > > > > /********************************************************** > > ****************** > > @@ -233,15 +233,16 @@ static uint32_t lga_enc_lstr_open_sync_m > > } > > > > /* Encode last item in struct => open flags!!!! */ > > - p8 = ncs_enc_reserve_space(uba, 1); > > + p8 = ncs_enc_reserve_space(uba, 2); > > if (!p8) { > > TRACE("p8 NULL!!!"); > > goto done; > > } > > > > ncs_encode_8bit(&p8, param->lstr_open_flags); > > - ncs_enc_claim_space(uba, 1); > > - total_bytes += 1; > > + ncs_encode_8bit(&p8, param->filter_cb_flags); > > + ncs_enc_claim_space(uba, 2); > > + total_bytes += 2; > > > > done: > > TRACE_LEAVE(); > > @@ -558,6 +559,33 @@ static uint32_t lga_lgs_msg_proc(lga_cb_ > > lga_msg_destroy(lgsv_msg); > > } > > break; > > + case LGSV_SEVERITY_FILTER_CALLBACK: > > + { > > + lga_client_hdl_rec_t *lga_hdl_rec; > > + > > + > > TRACE_2("LGSV_SEVERITY_FILTER_CALLBACK: client_id = %d, > stream_id > %d, > > serverity=%d", > > + (int)lgsv_msg- > > >info.cbk_info.lgs_client_id, > > + (int)lgsv_msg- > > >info.cbk_info.lgs_stream_id, > > + (int)lgsv_msg- > > >info.cbk_info.serverity_filter_cbk.log_severity); > > + > > + /** Lookup the hdl rec by client_id **/ > > + if (NULL == (lga_hdl_rec = > > + lga_find_hdl_rec_by_regid(cb, > > lgsv_msg->info.cbk_info.lgs_client_id))) { > > + TRACE("regid not found"); > > + lga_msg_destroy(lgsv_msg); > > + TRACE_LEAVE(); > > + return NCSCC_RC_FAILURE; > > + } > > + > > + /** enqueue this message **/ > > + if (NCSCC_RC_SUCCESS != > > m_NCS_IPC_SEND(&lga_hdl_rec->mbx, lgsv_msg, prio)) { > > + TRACE("IPC SEND FAILED"); > > + lga_msg_destroy(lgsv_msg); > > + TRACE_LEAVE(); > > + return NCSCC_RC_FAILURE; > > + } > > + } > > + break; > > > > default: > > TRACE("unknown type %d", lgsv_msg- > > >info.cbk_info.type); > > @@ -932,6 +960,35 @@ static uint32_t lga_dec_clm_node_status_ } > > > > > > > /********************************************************** > > ****************** > > + Name : lga_dec_serverity_cbk_msg > > + > > + Description : This routine decodes message > > + > > + Arguments : NCS_UBAID *uba, > > + LGSV_MSG *msg > > + > > + Return Values : uint32_t > > + > > + Notes : None. > > > +********************************************************* > > *********************/ > > +static uint32_t lga_dec_serverity_cbk_msg(NCS_UBAID *uba, lgsv_msg_t > > *msg) > > +{ > > + uint8_t *p8; > > + uint32_t total_bytes = 0; > > + lgsv_cbk_info_t *cbk_infos = &msg->info.cbk_info; > > + uint8_t local_data[100]; > > + > > + osafassert(uba != NULL); > > + > > + p8 = ncs_dec_flatten_space(uba, local_data, 6); > > + cbk_infos->lgs_stream_id = ncs_decode_32bit(&p8); > > + cbk_infos->serverity_filter_cbk.log_severity = > > ncs_decode_16bit(&p8); > > + ncs_dec_skip_space(uba, 6); > > + total_bytes += 6; > > + > > + return total_bytes; > > +} > > > +/********************************************************* > > ******************* > > Name : lga_dec_lstr_open_sync_rsp_msg > > > > Description : This routine decodes a log stream open sync response > > message > > @@ -1053,6 +1110,13 @@ static uint32_t lga_mds_dec(struct ncsmd > > msg- > > >info.cbk_info.lgs_client_id); > > total_bytes += > > lga_dec_clm_node_status_cbk_msg(uba, msg); > > break; > > + case LGSV_SEVERITY_FILTER_CALLBACK: > > + total_bytes += > > lga_dec_serverity_cbk_msg(uba, msg); > > + TRACE_2("decode severity filter message, > > lgs_client_id=%d" > > + " lgs_stream_id=%d", > > + msg- > > >info.cbk_info.lgs_client_id, > > + msg- > > >info.cbk_info.lgs_stream_id); > > + break; > > default: > > TRACE_2("Unknown callback type = %d!", > > msg->info.cbk_info.type); > > break; > > diff --git a/osaf/libs/agents/saf/lga/lga_util.c > > b/osaf/libs/agents/saf/lga/lga_util.c > > --- a/osaf/libs/agents/saf/lga/lga_util.c > > +++ b/osaf/libs/agents/saf/lga/lga_util.c > > @@ -171,6 +171,17 @@ static void lga_hdl_cbk_rec_prc(lga_cb_t > > reg_cbk->saLogWriteLogCallback(cbk_info- > > >inv, cbk_info->write_cbk.error); > > } > > break; > > + case LGSV_SEVERITY_FILTER_CALLBACK: > > + { > > + if (reg_cbk->saLogFilterSetCallback) { > > + lga_log_stream_hdl_rec_t *lga_str_hdl_rec = > > + > > lga_find_stream_hdl_rec_by_regid(cb, cbk_info->lgs_client_id, > > + > > cbk_info->lgs_stream_id); > > + reg_cbk- > > >saLogFilterSetCallback(lga_str_hdl_rec->log_stream_hdl, > > + cbk_info- > > >serverity_filter_cbk.log_severity); > > + } > > + } > > + break; > > default: > > TRACE("unknown callback type: %d", cbk_info->type); > > break; > > @@ -197,7 +208,8 @@ static SaAisErrorT lga_hdl_cbk_dispatch_ > > /* Nonblk receive to obtain the message from priority queue */ > > while (NULL != (cbk_msg = (lgsv_msg_t *) > > m_NCS_IPC_NON_BLK_RECEIVE(&hdl_rec->mbx, > > cbk_msg))) { > > - if (cbk_msg->info.cbk_info.type == > > LGSV_WRITE_LOG_CALLBACK_IND) { > > + if (cbk_msg->info.cbk_info.type == > > LGSV_WRITE_LOG_CALLBACK_IND || > > + cbk_msg->info.cbk_info.type == > > LGSV_SEVERITY_FILTER_CALLBACK) { > > lga_hdl_cbk_rec_prc(cb, cbk_msg, &hdl_rec- > > >reg_cbk); > > lga_msg_destroy(cbk_msg); > > break; > > @@ -232,7 +244,8 @@ static uint32_t lga_hdl_cbk_dispatch_all > > do { > > if (NULL == (cbk_msg = (lgsv_msg_t > > *)m_NCS_IPC_NON_BLK_RECEIVE(&hdl_rec->mbx, cbk_msg))) > > break; > > - if (cbk_msg->info.cbk_info.type == > > LGSV_WRITE_LOG_CALLBACK_IND) { > > + if (cbk_msg->info.cbk_info.type == > > LGSV_WRITE_LOG_CALLBACK_IND || > > + cbk_msg->info.cbk_info.type == > > LGSV_SEVERITY_FILTER_CALLBACK) { > > TRACE_2("LGSV_LGS_DELIVER_EVENT"); > > lga_hdl_cbk_rec_prc(cb, cbk_msg, &hdl_rec- > > >reg_cbk); > > } else { > > @@ -268,7 +281,8 @@ static uint32_t lga_hdl_cbk_dispatch_blo > > if (NULL != (cbk_msg = (lgsv_msg_t *) > > m_NCS_IPC_RECEIVE(&hdl_rec->mbx, cbk_msg))) > { > > > > - if (cbk_msg->info.cbk_info.type == > > LGSV_WRITE_LOG_CALLBACK_IND) { > > + if (cbk_msg->info.cbk_info.type == > > LGSV_WRITE_LOG_CALLBACK_IND || > > + cbk_msg->info.cbk_info.type == > > LGSV_SEVERITY_FILTER_CALLBACK) { > > TRACE_2("LGSV_LGS_DELIVER_EVENT"); > > lga_hdl_cbk_rec_prc(cb, cbk_msg, &hdl_rec- > > >reg_cbk); > > } else { > > @@ -461,6 +475,44 @@ lga_client_hdl_rec_t *lga_find_hdl_rec_b } > > > > > > > /********************************************************** > > ****************** > > + Name : lga_find_stream_hdl_rec_by_regid > > + > > + Description : This routine looks up a lga_log_stream_hdl_rec by > client_id > > + and stream_id > > + > > + Arguments : cb > > + client_id > > + stream_id > > + > > + Return Values : LGA_LOG_STREAM_HDL_REC * or NULL > > + > > + Notes : The lga_cb in-parameter is most likely pointing to the > global > > + lga_cb structure and that is not thread safe. If that > is the > > + case the lga_cb data must be protected by a mutex > before > > + calling this function. > > + > > > +********************************************************* > > *********************/ > > +lga_log_stream_hdl_rec_t *lga_find_stream_hdl_rec_by_regid(lga_cb_t > > *lga_cb, > > + uint32_t client_id, uint32_t > > stream_id) > > +{ > > + TRACE_ENTER(); > > + lga_client_hdl_rec_t *lga_hdl_rec = > > lga_find_hdl_rec_by_regid(lga_cb, client_id); > > + > > + if (lga_hdl_rec != NULL) { > > + lga_log_stream_hdl_rec_t *lga_str_hdl_rec = lga_hdl_rec- > > >stream_list; > > + > > + while (lga_str_hdl_rec != NULL) { > > + if (lga_str_hdl_rec->lgs_log_stream_id == stream_id) > > + return lga_str_hdl_rec; > > + lga_str_hdl_rec = lga_str_hdl_rec->next; > > + } > > + } > > + > > + TRACE_LEAVE(); > > + return NULL; > > +} > > + > > > +/********************************************************* > > ******************* > > Name : lga_hdl_list_del > > > > Description : This routine deletes all handles for this library. > > diff --git a/osaf/libs/common/logsv/include/lgsv_msg.h > > b/osaf/libs/common/logsv/include/lgsv_msg.h > > --- a/osaf/libs/common/logsv/include/lgsv_msg.h > > +++ b/osaf/libs/common/logsv/include/lgsv_msg.h > > @@ -46,6 +46,7 @@ typedef enum { > > typedef enum { > > LGSV_WRITE_LOG_CALLBACK_IND = 0, > > LGSV_CLM_NODE_STATUS_CALLBACK = 1, > > + LGSV_SEVERITY_FILTER_CALLBACK = 2, > > LGSV_LGS_CBK_MAX > > } lgsv_cbk_msg_type_t; > > > > @@ -87,6 +88,7 @@ typedef struct { > > SaUint16T logFileFmtLength; > > SaStringT logFileFmt; > > SaUint8T lstr_open_flags; > > + SaUint8T filter_cb_flags; > > } lgsv_stream_open_req_t; > > > > typedef struct { > > @@ -127,12 +129,18 @@ typedef struct logsv_loga_clm_status_par > > uint32_t clm_node_status; > > } logsv_lga_clm_status_cbk_t; > > > > +typedef struct { > > +SaLogSeverityFlagsT log_severity; > > +} lgsv_severity_filter_callback_t; > > + > > /* wrapper structure for all the callbacks */ typedef struct { > > lgsv_cbk_msg_type_t type; /* callback type */ > > uint32_t lgs_client_id; /* lgs client_id */ > > + uint32_t lgs_stream_id; > > SaInvocationT inv; /* invocation value */ > > /* union {*/ > > + lgsv_severity_filter_callback_t serverity_filter_cbk; > > lgsv_write_log_callback_ind_t write_cbk; > > logsv_lga_clm_status_cbk_t clm_node_status_cbk; > > /* } param; */ > > diff --git a/osaf/libs/saf/include/saLog.h > > b/osaf/libs/saf/include/saLog.h > > --- a/osaf/libs/saf/include/saLog.h > > +++ b/osaf/libs/saf/include/saLog.h > > @@ -99,6 +99,10 @@ extern "C" { > > > > #define SA_LOG_STREAM_CREATE 0x1 > > > > +/* Indicate if the stream need severity filter callback */ > > + > > +#define SA_LOG_STREAM_FILTER_CALLBACK 0x1 > > + > > /* > > * SAF Notification Service abstractions are used in the SAF Log service > > * APIs. These data types are resolved by including saNtf.h diff > > --git a/osaf/services/saf/logsv/lgs/lgs_cb.h > > b/osaf/services/saf/logsv/lgs/lgs_cb.h > > --- a/osaf/services/saf/logsv/lgs/lgs_cb.h > > +++ b/osaf/services/saf/logsv/lgs/lgs_cb.h > > @@ -52,6 +52,7 @@ typedef enum checkpoint_status { > > > > typedef struct lgs_stream_list { > > uint32_t stream_id; > > + SaUint8T filter_cb_flags; > > struct lgs_stream_list *next; > > } lgs_stream_list_t; > > > > diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.cc > > b/osaf/services/saf/logsv/lgs/lgs_evt.cc > > --- a/osaf/services/saf/logsv/lgs/lgs_evt.cc > > +++ b/osaf/services/saf/logsv/lgs/lgs_evt.cc > > @@ -192,7 +192,8 @@ done: > > * > > * @return int > > */ > > -int lgs_client_stream_add(uint32_t client_id, uint32_t stream_id) { > > +int lgs_client_stream_add(uint32_t client_id, uint32_t stream_id, > > + SaUint8T filter_cb_flag) { > > uint32_t rs = 0; > > log_client_t *client; > > lgs_stream_list_t *stream; > > @@ -213,6 +214,7 @@ int lgs_client_stream_add(uint32_t clien > > > > stream->next = client->stream_list_root; > > stream->stream_id = stream_id; > > + stream->filter_cb_flags = filter_cb_flag; > > client->stream_list_root = stream; > > > > err_exit: > > @@ -763,6 +765,7 @@ static uint32_t lgs_ckpt_stream_open(lgs > > header_ptr->data_len = 1; > > ckpt_rec_open_ptr->clientId = open_sync_param->client_id; > > ckpt_rec_open_ptr->streamId = logStream->streamId; > > + ckpt_rec_open_ptr->filter_cb_flags = open_sync_param- > > >filter_cb_flags; > > > > ckpt_rec_open_ptr->logFile = const_cast<char *>(logStream- > > >fileName.c_str()); > > ckpt_rec_open_ptr->logPath = const_cast<char *>(logStream- > > >pathName.c_str()); > > @@ -1040,6 +1043,7 @@ static uint32_t proc_stream_open_msg(lgs > > TRACE("%s LGS_RECOVERY",__FUNCTION__); > > i_rc = lgs_restore_one_app_stream(name, > > open_sync_param->client_id, > > + > > + open_sync_param->filter_cb_flags, > > &logStream); > > if (i_rc == -1) { > > // Not find the opening stream in recovery database. > > @@ -1097,7 +1101,8 @@ static uint32_t proc_stream_open_msg(lgs > > log_stream_print(logStream); /* TRACE */ > > > > /* Create an association between this client and the stream */ > > - rc = lgs_client_stream_add(open_sync_param->client_id, logStream- > > >streamId); > > + rc = lgs_client_stream_add(open_sync_param->client_id, logStream- > > >streamId, > > + open_sync_param->filter_cb_flags); > > if (rc != 0) { > > log_stream_close(&logStream, &file_closetime); > > ais_rv = SA_AIS_ERR_TRY_AGAIN; > > diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.h > > b/osaf/services/saf/logsv/lgs/lgs_evt.h > > --- a/osaf/services/saf/logsv/lgs/lgs_evt.h > > +++ b/osaf/services/saf/logsv/lgs/lgs_evt.h > > @@ -66,7 +66,7 @@ typedef struct lgsv_lgs_evt { typedef uint32_t > > (*LGSV_LGS_LGA_API_MSG_HANDLER) (lgs_cb_t *, lgsv_lgs_evt_t *evt); > > typedef uint32_t (*LGSV_LGS_EVT_HANDLER) (lgsv_lgs_evt_t *evt); > > > > -extern int lgs_client_stream_add(uint32_t client_id, uint32_t > > stream_id); > > +extern int lgs_client_stream_add(uint32_t client_id, uint32_t > > +stream_id, > > SaUint8T filter_cb_flag); > > extern int lgs_client_stream_rmv(uint32_t client_id, uint32_t > > stream_id); extern log_client_t *lgs_client_new(MDS_DEST mds_dest, > > uint32_t client_id, lgs_stream_list_t *stream_list); extern > > log_client_t *lgs_client_get_by_id(uint32_t client_id); diff --git > > a/osaf/services/saf/logsv/lgs/lgs_imm.cc > > b/osaf/services/saf/logsv/lgs/lgs_imm.cc > > --- a/osaf/services/saf/logsv/lgs/lgs_imm.cc > > +++ b/osaf/services/saf/logsv/lgs/lgs_imm.cc > > @@ -472,6 +472,8 @@ static void adminOperationCallback(SaImm > > osaf_abort(0); > > } > > > > + /* Send changed severity filter to clients */ > > + lgs_send_severity_filter_to_clients(stream->streamId, > > + severityFilter); > > > > /* Checkpoint to standby LOG server */ > > ckpt_stream_config(stream); > > @@ -2307,6 +2309,11 @@ static void stream_ccb_apply_modify(cons > > } else if (!strcmp(attribute->attrName, "saLogStreamSeverityFilter")) > { > > SaUint32T severityFilter = *((SaUint32T *)value); > > stream->severityFilter = severityFilter; > > + > > + /* Send changed severity filter to clients */ > > + if (stream->streamType != STREAM_TYPE_ALARM && > > + stream->streamType != STREAM_TYPE_NOTIFICATION) > > + lgs_send_severity_filter_to_clients(stream->streamId, > > + severityFilter); > > } else { > > LOG_ER("Error: Unknown attribute name"); > > osafassert(0); > > diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc > > b/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc > > --- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc > > +++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc > > @@ -1923,7 +1923,8 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t > > ** A client ID of -1 indicates that no client exist, skip this step. > > */ > > if ((param->clientId != invalidClient) && > > - lgs_client_stream_add(param->clientId, stream->streamId) != 0) { > > + lgs_client_stream_add(param->clientId, stream->streamId, > > + param->filter_cb_flags) != 0) { > > /* Do not allow standby to get out of sync */ > > LOG_ER("%s - Failed to add stream '%s' to client %u", __FUNCTION__, > > param->logStreamName, param->clientId); diff --git > > a/osaf/services/saf/logsv/lgs/lgs_mbcsv.h > > b/osaf/services/saf/logsv/lgs/lgs_mbcsv.h > > --- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.h > > +++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.h > > @@ -82,6 +82,7 @@ typedef struct { > > > > typedef struct { > > uint32_t streamId; > > + SaUint8T filter_cb_flags; > > uint32_t clientId; > > /* correspond to SaLogFileCreateAttributes */ > > char *logFile; /* log file name */ > > diff --git a/osaf/services/saf/logsv/lgs/lgs_mds.cc > > b/osaf/services/saf/logsv/lgs/lgs_mds.cc > > --- a/osaf/services/saf/logsv/lgs/lgs_mds.cc > > +++ b/osaf/services/saf/logsv/lgs/lgs_mds.cc > > @@ -21,19 +21,18 @@ > > #include "osaf_time.h" > > #include "osaf_extended_name.h" > > > > -#define LGS_SVC_PVT_SUBPART_VERSION 1 > > +#define LGS_SVC_PVT_SUBPART_VERSION 2 > > #define LGS_WRT_LGA_SUBPART_VER_AT_MIN_MSG_FMT 1 -#define > > LGS_WRT_LGA_SUBPART_VER_AT_MAX_MSG_FMT 1 > > +#define LGS_WRT_LGA_SUBPART_VER_AT_MAX_MSG_FMT 2 > > #define LGS_WRT_LGA_SUBPART_VER_RANGE \ > > (LGS_WRT_LGA_SUBPART_VER_AT_MAX_MSG_FMT - \ > > LGS_WRT_LGA_SUBPART_VER_AT_MIN_MSG_FMT + 1) > > > > static MDS_CLIENT_MSG_FORMAT_VER > > > LGS_WRT_LGA_MSG_FMT_ARRAY[LGS_WRT_LGA_SUBPART_VER_RANGE] > > = { > > - 1 /*msg format version for LGA subpart version 1 > */ > > + 1, 2 /* msg format version for LGA subpart */ > > }; > > > > - > > > > > /********************************************************** > > ****************** > > * Name : lgs_evt_destroy > > * > > @@ -120,7 +119,8 @@ static uint32_t dec_finalize_msg(NCS_UBA > > > > Notes : None. > > > > > ********************************************************** > > ********************/ > > -static uint32_t dec_lstr_open_sync_msg(NCS_UBAID *uba, lgsv_msg_t > > *msg) { > > +static uint32_t dec_lstr_open_sync_msg(NCS_UBAID *uba, lgsv_msg_t > > *msg, > > + MDS_CLIENT_MSG_FORMAT_VER > > + i_msg_fmt_version) { > > int len; > > uint8_t *p8; > > uint32_t rc = NCSCC_RC_SUCCESS; > > @@ -238,6 +238,13 @@ static uint32_t dec_lstr_open_sync_msg(N > > param->lstr_open_flags = ncs_decode_8bit(&p8); > > ncs_dec_skip_space(uba, 1); > > > > + /* support filter_cb_flags from msg fmt version 2 */ if > > + (i_msg_fmt_version >= 2) { > > + p8 = ncs_dec_flatten_space(uba, local_data, 1); > > + param->filter_cb_flags = ncs_decode_8bit(&p8); > > + ncs_dec_skip_space(uba, 1); > > + } > > + > > // Everything is ok. Do not free the allocated memories. > > goto done; > > > > @@ -807,6 +814,7 @@ static uint32_t mds_enc(struct ncsmds_ca > > rc = enc_lstr_close_rsp_msg(uba, msg); > > break; > > default: > > + rc = NCSCC_RC_FAILURE; > > TRACE("Unknown API RSP type = %d", msg->info.api_resp_info.type); > > break; > > } > > @@ -824,26 +832,44 @@ static uint32_t mds_enc(struct ncsmds_ca > > ncs_encode_32bit(&p8, msg->info.cbk_info.lgs_client_id); > > ncs_encode_64bit(&p8, msg->info.cbk_info.inv); > > ncs_enc_claim_space(uba, 16); > > - if (msg->info.cbk_info.type == LGSV_WRITE_LOG_CALLBACK_IND) { > > - p8 = ncs_enc_reserve_space(uba, 4); > > - if (!p8) { > > - TRACE("ncs_enc_reserve_space failed"); > > - goto err; > > - } > > - ncs_encode_32bit(&p8, msg->info.cbk_info.write_cbk.error); > > - TRACE_8("LGSV_WRITE_LOG_CALLBACK_IND"); > > - } else if (msg->info.cbk_info.type == > > LGSV_CLM_NODE_STATUS_CALLBACK) { > > - p8 = ncs_enc_reserve_space(uba, 4); > > - if (!p8) { > > - TRACE("ncs_enc_reserve_space failed"); > > - goto err; > > - } > > - ncs_encode_32bit(&p8, msg- > > >info.cbk_info.clm_node_status_cbk.clm_node_status); > > - TRACE_8("LGSV_CLM_NODE_STATUS_CALLBACK"); > > - } else { > > - TRACE("unknown callback type %d", msg->info.cbk_info.type); > > + > > + switch (msg->info.cbk_info.type) { > > + case LGSV_WRITE_LOG_CALLBACK_IND: > > + p8 = ncs_enc_reserve_space(uba, 4); > > + if (!p8) { > > + TRACE("ncs_enc_reserve_space failed"); > > + goto err; > > + } > > + ncs_encode_32bit(&p8, msg->info.cbk_info.write_cbk.error); > > + TRACE_8("LGSV_WRITE_LOG_CALLBACK_IND"); > > + break; > > + case LGSV_CLM_NODE_STATUS_CALLBACK: > > + p8 = ncs_enc_reserve_space(uba, 4); > > + if (!p8) { > > + TRACE("ncs_enc_reserve_space failed"); > > + goto err; > > + } > > + ncs_encode_32bit(&p8, msg- > > >info.cbk_info.clm_node_status_cbk.clm_node_status); > > + TRACE_8("LGSV_CLM_NODE_STATUS_CALLBACK"); > > + break; > > + case LGSV_SEVERITY_FILTER_CALLBACK: > > + p8 = ncs_enc_reserve_space(uba, 6); > > + if (!p8) { > > + TRACE("ncs_enc_reserve_space failed"); > > + goto err; > > + } > > + ncs_encode_32bit(&p8, msg->info.cbk_info.lgs_stream_id); > > + ncs_encode_16bit(&p8, msg- > > >info.cbk_info.serverity_filter_cbk.log_severity); > > + TRACE_8("LGSV_SEVERITY_FILTER_CALLBACK"); > > + break; > > + default: > > + rc = NCSCC_RC_FAILURE; > > + TRACE("unknown callback type %d", msg->info.cbk_info.type); > > + break; > > + } > > + if (rc == NCSCC_RC_FAILURE) > > goto err; > > - } > > + > > } else { > > TRACE("unknown msg type %d", msg->type); > > goto err; > > @@ -910,7 +936,7 @@ static uint32_t mds_dec(struct ncsmds_ca > > rc = dec_finalize_msg(uba, &evt->info.msg); > > break; > > case LGSV_STREAM_OPEN_REQ: > > - rc = dec_lstr_open_sync_msg(uba, &evt->info.msg); > > + rc = dec_lstr_open_sync_msg(uba, &evt->info.msg, info- > > >info.dec.i_msg_fmt_ver); > > break; > > case LGSV_STREAM_CLOSE_REQ: > > rc = dec_lstr_close_msg(uba, &evt->info.msg); diff --git > > a/osaf/services/saf/logsv/lgs/lgs_recov.cc > > b/osaf/services/saf/logsv/lgs/lgs_recov.cc > > --- a/osaf/services/saf/logsv/lgs/lgs_recov.cc > > +++ b/osaf/services/saf/logsv/lgs/lgs_recov.cc > > @@ -313,7 +313,7 @@ static int lgs_get_file_params_h(gfp_in_ > > */ > > int lgs_restore_one_app_stream( > > const std::string &stream_name, uint32_t client_id, > > - log_stream_t **o_stream) { > > + SaUint8T filter_cb_flag, log_stream_t **o_stream) { > > int int_rc = 0; > > int rc_out = 0; > > SaImmHandleT immOmHandle; > > @@ -561,7 +561,8 @@ int lgs_restore_one_app_stream( > > } > > > > /* Create an association between this client and the stream */ > > - int_rc = lgs_client_stream_add(client_id, log_stream->streamId); > > + int_rc = lgs_client_stream_add(client_id, log_stream->streamId, > > + filter_cb_flag); > > if (int_rc == -1) { > > TRACE("%s: lgs_client_stream_add Fail", __FUNCTION__); > > log_stream_delete(&log_stream); > > diff --git a/osaf/services/saf/logsv/lgs/lgs_recov.h > > b/osaf/services/saf/logsv/lgs/lgs_recov.h > > --- a/osaf/services/saf/logsv/lgs/lgs_recov.h > > +++ b/osaf/services/saf/logsv/lgs/lgs_recov.h > > @@ -30,6 +30,7 @@ void log_rtobj_list_free(); int > > lgs_restore_one_app_stream( > > const std::string &stream_name, > > uint32_t client_id, > > + SaUint8T filter_cb_flag, > > log_stream_t **o_stream > > ); > > int log_stream_open_file_restore(log_stream_t *log_stream); diff > > --git a/osaf/services/saf/logsv/lgs/lgs_util.cc > > b/osaf/services/saf/logsv/lgs/lgs_util.cc > > --- a/osaf/services/saf/logsv/lgs/lgs_util.cc > > +++ b/osaf/services/saf/logsv/lgs/lgs_util.cc > > @@ -834,3 +834,84 @@ bool lgs_is_extended_name_valid(const Sa > > > > return true; > > } > > + > > +/** > > + * Send a severity callback callback message to a client > > + * > > + * @param client_id > > + * @param stream_id > > + * @param severityFilter > > + * @param mds_dest > > + */ > > +static void lgs_send_filter_msg(uint32_t client_id, uint32_t stream_id, > > + SaLogSeverityFlagsT severity_filter, > > +MDS_DEST mds_dest) { > > + uint32_t rc; > > + NCSMDS_INFO mds_info = {0}; > > + lgsv_msg_t msg; > > + > > + TRACE_ENTER(); > > + TRACE_3("client_id: %u, stream_id: %u, modified severity filter: %u", > > + client_id, stream_id, severity_filter); > > + > > + msg.type = LGSV_LGS_CBK_MSG; > > + msg.info.cbk_info.type = LGSV_SEVERITY_FILTER_CALLBACK; > > + msg.info.cbk_info.lgs_client_id = client_id; > > + msg.info.cbk_info.lgs_stream_id = stream_id; msg.info.cbk_info.inv > > + = 0; msg.info.cbk_info.serverity_filter_cbk.log_severity = > > + severity_filter; > > + > > + mds_info.i_mds_hdl = lgs_cb->mds_hdl; mds_info.i_svc_id = > > + NCSMDS_SVC_ID_LGS; mds_info.i_op = MDS_SEND; > > + mds_info.info.svc_send.i_msg = &msg; > > + mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_LGA; > > + mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; > > + mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; > > + mds_info.info.svc_send.info.snd.i_to_dest = mds_dest; > > + > > + rc = ncsmds_api(&mds_info); > > + if (rc != NCSCC_RC_SUCCESS) > > + LOG_NO("Failed (%u) to send of severity filter callback to: %" > > + PRIx64, rc, > > mds_dest); > > + > > + TRACE_LEAVE(); > > +} > > + > > +/** > > + * Send a changed severity filter to a client > > + * > > + * @param stream_id > > + * @param severityFilter > > + */ > > +void lgs_send_severity_filter_to_clients(uint32_t stream_id, > > + SaLogSeverityFlagsT > > +severity_filter) { > > + log_client_t *rp = NULL; > > + uint32_t client_id_net; > > + lgs_stream_list_t *stream; > > + > > + TRACE_ENTER(); > > + TRACE_3("stream_id: %u, severity filter:%u", stream_id, > > + severity_filter); > > + > > + rp = reinterpret_cast<log_client_t *> > > + (ncs_patricia_tree_getnext(&lgs_cb->client_tree, NULL)); > > + > > + while (rp != NULL) { > > + /* Store the client_id_net for getting next */ > > + client_id_net = rp->client_id_net; > > + /* Do not send to all client. Send to clients that need filter > > + callback and associate with this stream */ > > + stream = rp->stream_list_root; > > + while (stream != NULL) { > > + if (stream->stream_id == stream_id && > > + stream->filter_cb_flags == SA_LOG_STREAM_FILTER_CALLBACK) { > > + lgs_send_filter_msg(rp->client_id, stream_id, > > + severity_filter, rp- > > >mds_dest); > > + break; > > + } > > + stream = stream->next; > > + } > > + rp = reinterpret_cast<log_client_t *>(ncs_patricia_tree_getnext( > > + &lgs_cb->client_tree, reinterpret_cast<uint8_t > > + *>(&client_id_net))); } > > + > > + TRACE_LEAVE(); > > +} > > + > > diff --git a/osaf/services/saf/logsv/lgs/lgs_util.h > > b/osaf/services/saf/logsv/lgs/lgs_util.h > > --- a/osaf/services/saf/logsv/lgs/lgs_util.h > > +++ b/osaf/services/saf/logsv/lgs/lgs_util.h > > @@ -82,5 +82,6 @@ int lgs_init_timer(time_t timeout_s); void > > lgs_close_timer(int ufd); > > > > bool lgs_is_extended_name_valid(const SaNameT* name); > > - > > +void lgs_send_severity_filter_to_clients(uint32_t stream_id, > > + SaLogSeverityFlagsT serverity); > > #endif /* ifndef __LGS_UTIL_H */ > > diff --git a/tests/logsv/tet_saLogFilterSetCallbackT.c > > b/tests/logsv/tet_saLogFilterSetCallbackT.c > > --- a/tests/logsv/tet_saLogFilterSetCallbackT.c > > +++ b/tests/logsv/tet_saLogFilterSetCallbackT.c > > @@ -15,10 +15,372 @@ > > * > > */ > > > > +#include <poll.h> > > #include "logtest.h" > > > > +#define MAX_DATA 256 > > +#define MAX_CLIENTS 2 > > +static SaLogSeverityFlagsT log_severity[8]; static SaLogStreamHandleT > > +log_streamHandle[8]; static int cb_index; > > + > > +static void logFilterSetCallbackT(SaLogStreamHandleT logStreamHandle, > > SaLogSeverityFlagsT logSeverity) > > +{ > > + log_streamHandle[cb_index] = logStreamHandle; > > + log_severity[cb_index] = logSeverity; > > + cb_index++; > > +} > > + > > +static SaLogFileCreateAttributesT_2 appStreamLogFileCreateAttributes > > += { > > + .logFilePathName = DEFAULT_APP_FILE_PATH_NAME, > > + .logFileName = DEFAULT_APP_FILE_NAME, > > + .maxLogFileSize = DEFAULT_APP_LOG_FILE_SIZE, > > + .maxLogRecordSize = DEFAULT_APP_LOG_REC_SIZE, > > + .haProperty = SA_TRUE, > > + .logFileFullAction = SA_LOG_FILE_FULL_ACTION_ROTATE, > > + .maxFilesRotated = DEFAULT_MAX_FILE_ROTATED, > > + .logFileFmt = DEFAULT_FORMAT_EXPRESSION }; > > + > > void saLogFilterSetCallbackT_01(void) { > > - test_validate(SA_AIS_ERR_NOT_SUPPORTED, > > SA_AIS_ERR_NOT_SUPPORTED); > > + int ret; > > + SaAisErrorT rc; > > + struct pollfd fds[1]; > > + char command[MAX_DATA]; > > + const unsigned int serverity_filter = 7; > > + SaUint32T v_saLogStreamSeverityFilter = 127; > > + > > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT; > > + rc = logInitialize(); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + return; > > + } > > + rc = saLogSelectionObjectGet(logHandle, &selectionObject); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + rc = logStreamOpen(&systemStreamName); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + cb_index = 0; > > + /* Backup saLogStreamSeverityFilter value */ > > + get_attr_value(&systemStreamName, "saLogStreamSeverityFilter", > > + &v_saLogStreamSeverityFilter); > > + > > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2> > > /dev/null", > > + SA_LOG_STREAM_SYSTEM, serverity_filter); > > + ret = systemCall(command); > > + if (ret != 0) { > > + test_validate(ret, 0); > > + goto done; > > + } > > + > > + fds[0].fd = (int) selectionObject; > > + fds[0].events = POLLIN; > > + ret = poll(fds, 1, 1000); > > + if (ret != 1) { > > + fprintf(stderr, " poll log callback failed: %d \n", ret); > > + test_validate(ret, 1); > > + goto done; > > + } > > + > > + rc = saLogDispatch(logHandle, SA_DISPATCH_ONE); > > + if (rc != SA_AIS_OK) { > > + fprintf(stderr, " saLogDispatch failed: %d \n", (int)rc); > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + if (log_streamHandle[0] == logStreamHandle && log_severity[0] == > > serverity_filter) { > > + test_validate(SA_AIS_OK, SA_AIS_OK); > > + } else { > > + test_validate(0, SA_AIS_OK); > > + } > > + > > +done: > > + logCallbacks.saLogFilterSetCallback = NULL; > > + logFinalize(); > > + /* Restore saLogStreamSeverityFilter attribute */ > > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2> > > /dev/null", > > + SA_LOG_STREAM_SYSTEM, v_saLogStreamSeverityFilter); > > + systemCall(command); > > } > > > > +void saLogFilterSetCallbackT_02(void) { > > + int ret; > > + SaAisErrorT rc; > > + struct pollfd fds[1]; > > + char command[MAX_DATA]; > > + const unsigned int serverity_filter = 7; > > + > > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT; > > + rc = logInitialize(); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + return; > > + } > > + rc = saLogSelectionObjectGet(logHandle, &selectionObject); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + rc = logAppStreamOpen(&app1StreamName, > > &appStreamLogFileCreateAttributes); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + cb_index = 0; > > + sprintf(command, "immadm -o 1 -p > > saLogStreamSeverityFilter:SA_UINT32_T:%d %s 2> /dev/null", > > + serverity_filter, SA_LOG_STREAM_APPLICATION1); > > + ret = systemCall(command); > > + if (ret != 0) { > > + test_validate(ret, 0); > > + goto done; > > + } > > + > > + fds[0].fd = (int) selectionObject; > > + fds[0].events = POLLIN; > > + ret = poll(fds, 1, 1000); > > + if (ret != 1) { > > + fprintf(stderr, " poll log callback failed: %d \n", ret); > > + test_validate(ret, 1); > > + goto done; > > + } > > + > > + rc = saLogDispatch(logHandle, SA_DISPATCH_ONE); > > + if (rc != SA_AIS_OK) { > > + fprintf(stderr, " saLogDispatch failed: %d \n", (int)rc); > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + if (log_streamHandle[0] == logStreamHandle && log_severity[0] == > > serverity_filter) { > > + test_validate(SA_AIS_OK, SA_AIS_OK); > > + } else { > > + test_validate(0, SA_AIS_OK); > > + } > > + > > +done: > > + logCallbacks.saLogFilterSetCallback = NULL; > > + logFinalize(); > > +} > > + > > +void saLogFilterSetCallbackT_03(void) { > > + int ret; > > + SaAisErrorT rc; > > + struct pollfd fds[1]; > > + char command[MAX_DATA]; > > + const unsigned int serverity_filter[2] = {7, 15}; > > + SaUint32T v_saLogStreamSeverityFilter = 127; > > + SaLogStreamHandleT logStreamHandle[2]; > > + > > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT; > > + rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + return; > > + } > > + rc = saLogSelectionObjectGet(logHandle, &selectionObject); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + rc = saLogStreamOpen_2(logHandle, &systemStreamName, NULL, 0, > > + SA_TIME_ONE_SECOND, &logStreamHandle[0]); > > + if (rc != SA_AIS_OK) { > > + fprintf(stderr, " saLogStreamOpen_2 for system stream > > failed: %d \n", (int)rc); > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + rc = saLogStreamOpen_2(logHandle, &app1StreamName, > > &appStreamLogFileCreateAttributes, > > + SA_LOG_STREAM_CREATE, > > SA_TIME_ONE_SECOND, &logStreamHandle[1]); > > + if (rc != SA_AIS_OK) { > > + fprintf(stderr, " saLogStreamOpen_2 app stream failed: %d > > \n", (int)rc); > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + cb_index = 0; > > + /* Backup saLogStreamSeverityFilter value */ > > + get_attr_value(&systemStreamName, "saLogStreamSeverityFilter", > > + &v_saLogStreamSeverityFilter); > > + /* Changing severity filter for system and app1 stream */ > > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2> > > /dev/null", > > + SA_LOG_STREAM_SYSTEM, serverity_filter[0]); > > + ret = systemCall(command); > > + if (ret != 0) { > > + test_validate(ret, 0); > > + goto done; > > + } > > + sleep(1); > > + sprintf(command, "immadm -o 1 -p > > saLogStreamSeverityFilter:SA_UINT32_T:%d %s 2> /dev/null", > > + serverity_filter[1], SA_LOG_STREAM_APPLICATION1); > > + ret = systemCall(command); > > + if (ret != 0) { > > + test_validate(ret, 0); > > + goto done; > > + } > > + > > + fds[0].fd = (int) selectionObject; > > + fds[0].events = POLLIN; > > + ret = poll(fds, 1, 1000); > > + if (ret != 1) { > > + fprintf(stderr, " poll log callback failed: %d \n", ret); > > + test_validate(ret, 1); > > + goto done; > > + } > > + > > + rc = saLogDispatch(logHandle, SA_DISPATCH_ALL); > > + if (rc != SA_AIS_OK) { > > + fprintf(stderr, " saLogDispatch failed: %d \n", (int)rc); > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + if (cb_index != 2) { > > + printf("cb_index = %u\n", cb_index); > > + test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK); > > + goto done; > > + } > > + > > + for (int i = 0; i < 2; i++) { > > + if ((log_streamHandle[i] != logStreamHandle[i]) || > > (log_severity[i] != serverity_filter[i])) { > > + printf("log streamHandle: %llu, expected %llu \n", > > log_streamHandle[i], logStreamHandle[i]); > > + printf("log severity filter: %d, expected %d \n", > > +log_severity[i], > > serverity_filter[i]); > > + test_validate(0, SA_AIS_OK); > > + goto done; > > + } > > + } > > + > > + test_validate(SA_AIS_OK, SA_AIS_OK); > > + > > +done: > > + logCallbacks.saLogFilterSetCallback = NULL; > > + logFinalize(); > > + /* Restore saLogStreamSeverityFilter attribute */ > > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2> > > /dev/null", > > + SA_LOG_STREAM_SYSTEM, v_saLogStreamSeverityFilter); > > + systemCall(command); > > +} > > + > > + > > +void saLogFilterSetCallbackT_04(void) { > > + int ret; > > + SaAisErrorT rc; > > + struct pollfd fds[MAX_CLIENTS]; > > + char command[MAX_DATA]; > > + const unsigned int serverity_filter[MAX_CLIENTS] = {7, 15}; > > + SaUint32T v_saLogStreamSeverityFilter = 127; > > + SaLogStreamHandleT logStreamHandle[MAX_CLIENTS]; > > + SaLogHandleT logHandle[MAX_CLIENTS]; > > + SaSelectionObjectT selectionObject[MAX_CLIENTS]; > > + > > + logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT; > > + for (int i = 0; i < MAX_CLIENTS; i++) { > > + rc = saLogInitialize(&logHandle[i], &logCallbacks, > > &logVersion); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + return; > > + } > > + > > + rc = saLogSelectionObjectGet(logHandle[i], > > &selectionObject[i]); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + fds[i].fd = (int) selectionObject[i]; > > + fds[i].events = POLLIN; > > + > > + rc = saLogStreamOpen_2(logHandle[i], > > &systemStreamName, NULL, 0, > > + SA_TIME_ONE_SECOND, > > &logStreamHandle[i]); > > + if (rc != SA_AIS_OK) { > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + } > > + > > + /* Close stream handle 1 */ > > + saLogStreamClose(logStreamHandle[1]); > > + > > + cb_index = 0; > > + /* Backup saLogStreamSeverityFilter value */ > > + get_attr_value(&systemStreamName, "saLogStreamSeverityFilter", > > + &v_saLogStreamSeverityFilter); > > + /* Changing severity filter for system and app1 stream */ > > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2> > > /dev/null", > > + SA_LOG_STREAM_SYSTEM, serverity_filter[0]); > > + ret = systemCall(command); > > + if (ret != 0) { > > + test_validate(ret, 0); > > + goto done; > > + } > > + > > + ret = poll(fds, 2, 1000); > > + if (ret <= 0) { > > + fprintf(stderr, " poll log callback failed: %d \n", ret); > > + test_validate(ret, 1); > > + goto done; > > + } > > + > > + if (fds[1].revents & POLLIN) { > > + fprintf(stderr, " ERROR, get callback while handle closed > > stream\n"); > > + test_validate(0, SA_AIS_OK); > > + } > > + > > + if (fds[0].revents & POLLIN) { > > + rc = saLogDispatch(logHandle[0], SA_DISPATCH_ALL); > > + if (rc != SA_AIS_OK) { > > + fprintf(stderr, " saLogDispatch failed: %d \n", > (int)rc); > > + test_validate(rc, SA_AIS_OK); > > + goto done; > > + } > > + > > + if (cb_index != 1) { > > + fprintf(stderr, "cb_index = %u\n", cb_index); > > + test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK); > > + goto done; > > + } > > + > > + if (log_streamHandle[0] == logStreamHandle[0] && > > log_severity[0] == serverity_filter[0]) { > > + test_validate(SA_AIS_OK, SA_AIS_OK); > > + } else { > > + test_validate(0, SA_AIS_OK); > > + } > > + } else { > > + fprintf(stderr, " ERROR, Can not receive any callback\n"); > > + test_validate(0, SA_AIS_OK); > > + } > > + > > +done: > > + logCallbacks.saLogFilterSetCallback = NULL; > > + logFinalize(); > > + /* Restore saLogStreamSeverityFilter attribute */ > > + sprintf(command, "immcfg %s -a saLogStreamSeverityFilter=%d 2> > > /dev/null", > > + SA_LOG_STREAM_SYSTEM, v_saLogStreamSeverityFilter); > > + systemCall(command); > > +} > > + > > + > > +__attribute__ ((constructor)) static void > > saLibraryLifeCycle_constructor(void) > > +{ > > + test_suite_add(17, "Log Severity filter Callback"); > > + test_case_add(17, saLogFilterSetCallbackT_01, > > +"saLogFilterSetCallbackT, > > severity filter is changed for cfg stream"); > > + test_case_add(17, saLogFilterSetCallbackT_02, > > + "saLogFilterSetCallbackT, > > severity filter is changed for runtime stream"); > > + test_case_add(17, saLogFilterSetCallbackT_03, > > + "saLogFilterSetCallbackT, > > severity filter is changed for runtime & cfg streams"); > > + test_case_add(17, saLogFilterSetCallbackT_04, > > + "saLogFilterSetCallbackT, > > after closing stream"); > > +} > > diff --git a/tests/logsv/tet_saLogStreamOpen_2.c > > b/tests/logsv/tet_saLogStreamOpen_2.c > > --- a/tests/logsv/tet_saLogStreamOpen_2.c > > +++ b/tests/logsv/tet_saLogStreamOpen_2.c > > @@ -1052,7 +1052,6 @@ extern void saLogWriteLogAsync_19(void); > extern > > void saLogWriteLogCallbackT_01(void); extern void > > saLogWriteLogCallbackT_02(void); extern void > > saLogWriteLogCallbackT_03(void); -extern void > > saLogFilterSetCallbackT_01(void); extern void > > saLogStreamClose_01(void); > > > > __attribute__ ((constructor)) static void > > saLibraryLifeCycle_constructor(void) > > @@ -1105,7 +1104,6 @@ extern void saLogStreamClose_01(void); > > test_case_add(2, saLogWriteLogAsync_19, "saLogWriteLogAsync() > > logBufSize > SA_LOG_MAX_RECORD_SIZE"); > > test_case_add(2, saLogWriteLogCallbackT_01, > > "saLogWriteLogCallbackT() SA_DISPATCH_ONE"); > > test_case_add(2, saLogWriteLogCallbackT_02, > > "saLogWriteLogCallbackT() SA_DISPATCH_ALL"); > > - test_case_add(2, saLogFilterSetCallbackT_01, "saLogFilterSetCallbackT > > OK"); > > test_case_add(2, saLogStreamClose_01, "saLogStreamClose OK"); > > test_case_add(2, saLogStreamOpen_2_46, "saLogStreamOpen_2 with > > maxFilesRotated = 0, ERR"); > > test_case_add(2, saLogStreamOpen_2_47, "saLogStreamOpen_2 with > > maxFilesRotated = 128, ERR"); > > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel