Hi Canh Van Truong,

Sorry I was on vacation last week , will get back to soon.

-AVM


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


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to