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:[email protected]]
>> Sent: den 17 november 2016 08:45
>> To: Lennart Lund <[email protected]>; Vu Minh Nguyen
>> <[email protected]>; [email protected]; Anders Widell
>> <[email protected]>
>> Cc: [email protected]
>> 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:[email protected]]
>> Sent: Wednesday, November 16, 2016 9:44 PM
>> To: Canh Van Truong; Vu Minh Nguyen; [email protected]; Anders
>> Widell
>> Cc: [email protected]
>> 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 <[email protected]>; Vu Minh Nguyen
>>> <[email protected]>; [email protected]; Anders
>> Widell
>>> <[email protected]>
>>> Cc: [email protected]
>>> 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:[email protected]]
>>> Sent: Tuesday, November 15, 2016 11:16 PM
>>> To: Canh Van Truong; Vu Minh Nguyen; [email protected]; Anders
>>> Widell
>>> Cc: [email protected]
>>> 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:[email protected]]
>>>> Sent: den 14 november 2016 11:43
>>>> To: Lennart Lund <[email protected]>; Vu Minh Nguyen
>>>> <[email protected]>; [email protected]; Anders
>>> Widell
>>>> <[email protected]>
>>>> Cc: [email protected]
>>>> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel