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

Reply via email to