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"); ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel