Hi Canh Just adding some more points to Lennart comments :
1) Please do change the logVersion in tests/logsv to `SaVersionT logVersion = {'A', 0x02, 0x03};` in all locations 2) Also add some test cases that do saLogInitializ(previous versions) with SaVersionT logPreviousVersion = { 'A', 0x02, 0x02 }; so that it covers the test case of previous versions client has in-service upgrade. example : suite_14 test case `saLogStreamOpen_14_08()` of tests/logsv/tet_Log_clm.c 3) Update osaf/services/saf/logsv/README with the new SaLogFilterSetCallbackT supported version details -AVM On 11/18/2016 4:55 PM, Lennart Lund wrote: > Hi Canh > > Some more comments about version handling and optimization of sending > callback data: > > 1. > I think that minor version has to be increased to 3 (2 is already used for > CLM handling). The reason is that it must be possible for a client to get > information if filter callback is supported > 2. > When doing this, minor version 2 has to be changed to be handled as a "real" > minor version. As is it's more like a configuration e.g. the reported highest > version is .1 also if .2 is supported > 3. > Also after minor version 3 is implemented Vu:s comment about not using an > extra flag for optimizing sending of filter info is valid i.e. the extra code > for handling this could be omitted > 4. > Test cases should be done so that versions of logtest that includes tests of > features not supported in older log server versions should be possible to run > also if the log server is an older version without fail. This can be done by > using version handling so that test cases testing features that only are > supported in e.g. version .3 and later checks version and do not run if an > older version instead of failing > > Thanks > Lennart > >> -----Original Message----- >> From: Canh Truong [mailto:canh.v.tru...@dektech.com.au] >> Sent: den 17 november 2016 08:45 >> 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, >> >> 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