Hi Lennart, Please see my comment with [Canh]
Regards, Canh -----Original Message----- From: Lennart Lund [mailto:lennart.l...@ericsson.com] Sent: Wednesday, November 16, 2016 9:44 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 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 [Canh] Because I change message format version (LGA_SVC_PVT_SUBPART_VERSION = 2) when encoding message, and it is problem with compatibility between version. I will find the way to solve this problem. - 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 [Canh] New test case will be added 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_DATA256 > > +#define MAX_CLIENTS2 > > +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