Hi Thien, See 2 my comments inline.
-----Original Message----- From: Nguyen Minh Vu <vu.m.ngu...@dektech.com.au> Sent: Friday, January 17, 2020 10:46 AM To: thien.m.huynh <thien.m.hu...@dektech.com.au> Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1/3] log: make facility ID configurable [#3131] Hi Thien, See my comments inline. Regards, Vu On 1/16/20 11:08 AM, thien.m.huynh wrote: > Streaming log record is packaged in RFC5424 format and they all carry > a fixed facility ID (16). Therefore, log record receiver i.e. rsyslogd > is not able to filter log records on their facility id such as which > ones are regular logs or which ones are security. > > The ticket to have the facility ID configurable so that the receiver > can [Vu] the ticket is to have ... > differentiate among types of log records based on that number. > Configure facility id via a new attribute `saLogStreamFacilityId` in > class `SaLogStreamConfig`. The valid range is [0-23]. The default > value is 16 to keep the streaming feature backward compatible. Always > keep the value of attribute `saLogStreamFacilityId` in sync with the > standby. If user deletes value of the attribute `saLogStreamFacilityId`, it > will go back to the default value (16). > --- > src/log/Makefile.am | 2 + > src/log/config/logsv_classes.xml | 14 ++ > src/log/logd/lgs_cache.cc | 1 + > src/log/logd/lgs_dest.cc | 1 + > src/log/logd/lgs_dest.h | 6 +- > src/log/logd/lgs_imm.cc | 74 ++++++++- > src/log/logd/lgs_mbcsv.cc | 187 +++++++++++++++++++++-- > src/log/logd/lgs_mbcsv.h | 5 +- > src/log/logd/lgs_mbcsv_v9.cc | 243 ++++++++++++++++++++++++++++++ > src/log/logd/lgs_mbcsv_v9.h | 67 ++++++++ > src/log/logd/lgs_recov.cc | 10 ++ > src/log/logd/lgs_stream.cc | 9 ++ > src/log/logd/lgs_stream.h | 1 + > src/log/logd/lgs_unixsock_dest.cc | 7 +- > 14 files changed, 610 insertions(+), 17 deletions(-) > create mode 100644 src/log/logd/lgs_mbcsv_v9.cc > create mode 100644 src/log/logd/lgs_mbcsv_v9.h > > diff --git a/src/log/Makefile.am b/src/log/Makefile.am index > 767e25369..a2a98baec 100644 > --- a/src/log/Makefile.am > +++ b/src/log/Makefile.am > @@ -87,6 +87,7 @@ noinst_HEADERS += \ > src/log/logd/lgs_mbcsv_v3.h \ > src/log/logd/lgs_mbcsv_v5.h \ > src/log/logd/lgs_mbcsv_v6.h \ > + src/log/logd/lgs_mbcsv_v9.h \ > src/log/logd/lgs_oi_admin.h \ > src/log/logd/lgs_recov.h \ > src/log/logd/lgs_stream.h \ > @@ -151,6 +152,7 @@ bin_osaflogd_SOURCES = \ > src/log/logd/lgs_mbcsv_v3.cc \ > src/log/logd/lgs_mbcsv_v5.cc \ > src/log/logd/lgs_mbcsv_v6.cc \ > + src/log/logd/lgs_mbcsv_v9.cc \ > src/log/logd/lgs_mds.cc \ > src/log/logd/lgs_oi_admin.cc \ > src/log/logd/lgs_recov.cc \ > diff --git a/src/log/config/logsv_classes.xml > b/src/log/config/logsv_classes.xml > index 084e8915d..8aa8e69c2 100644 > --- a/src/log/config/logsv_classes.xml > +++ b/src/log/config/logsv_classes.xml > @@ -78,6 +78,12 @@ > <type>SA_UINT64_T</type> > <category>SA_RUNTIME</category> > </attr> > + <attr> > + <name>saLogStreamFacilityId</name> > + <type>SA_UINT32_T</type> > + <category>SA_RUNTIME</category> > + <flag>SA_CACHED</flag> > + </attr> > </class> > <class name="SaLogStreamConfig"> > <category>SA_CONFIG</category> > @@ -171,6 +177,14 @@ > <type>SA_UINT64_T</type> > <category>SA_RUNTIME</category> > </attr> > + <attr> > + <name>saLogStreamFacilityId</name> > + <type>SA_UINT32_T</type> > + <category>SA_CONFIG</category> > + <flag>SA_WRITABLE</flag> > + <flag>SA_STRONG_DEFAULT</flag> > + <default-value>16</default-value> > + </attr> > </class> > <class name="OpenSafLogConfig"> > <!-- Care is needed when changing to the default values for the > attributes of this class diff --git a/src/log/logd/lgs_cache.cc > b/src/log/logd/lgs_cache.cc index d94f4ea0d..81f64225d 100644 > --- a/src/log/logd/lgs_cache.cc > +++ b/src/log/logd/lgs_cache.cc > @@ -161,6 +161,7 @@ void Cache::Data::Streaming() const { > data.hostname = param_->from_node; > data.appname = param_->svc_name; > data.sev = param_->severity; > + data.facilityId = stream->facilityId; > time.tv_sec = (param_->log_stamp / (SaTimeT)SA_TIME_ONE_SECOND); > time.tv_nsec = (param_->log_stamp % (SaTimeT)SA_TIME_ONE_SECOND); > data.time = time; > diff --git a/src/log/logd/lgs_dest.cc b/src/log/logd/lgs_dest.cc index > 0e70ddd12..71aecc92d 100644 > --- a/src/log/logd/lgs_dest.cc > +++ b/src/log/logd/lgs_dest.cc > @@ -392,6 +392,7 @@ bool WriteToDestination(const RecordData& data, const > VectorString& destnames) { > info.stream_dn = data.name; > info.app_name = data.appname; > info.severity = data.sev; > + info.facilityId = data.facilityId; > info.time = data.time; > info.origin = origin.c_str(); > > diff --git a/src/log/logd/lgs_dest.h b/src/log/logd/lgs_dest.h index > 6fe7c1782..c119de356 100644 > --- a/src/log/logd/lgs_dest.h > +++ b/src/log/logd/lgs_dest.h > @@ -75,6 +75,7 @@ struct RecordData { > bool isRtStream; > uint32_t recordId; > uint16_t sev; > + uint32_t facilityId; > timespec time; > > RecordData() > @@ -86,7 +87,8 @@ struct RecordData { > msgid{nullptr}, > isRtStream{false}, > recordId{0}, > - sev{0} { > + sev{0}, > + facilityId{16} { > time = base::ReadRealtimeClock(); > } > }; > @@ -175,6 +177,7 @@ class DestinationHandler { > const char* log_record; > const char* app_name; > uint16_t severity; > + uint32_t facilityId; > uint32_t record_id; > struct timespec time; > > @@ -186,6 +189,7 @@ class DestinationHandler { > log_record{nullptr}, > app_name{nullptr}, > severity{0}, > + facilityId{16}, > record_id{0} { > time = base::ReadRealtimeClock(); > } > diff --git a/src/log/logd/lgs_imm.cc b/src/log/logd/lgs_imm.cc index > 24318bf90..40551693d 100644 > --- a/src/log/logd/lgs_imm.cc > +++ b/src/log/logd/lgs_imm.cc > @@ -56,6 +56,7 @@ > #include "log/logd/lgs_mbcsv_v3.h" > #include "log/logd/lgs_mbcsv_v5.h" > #include "log/logd/lgs_mbcsv_v6.h" > +#include "log/logd/lgs_mbcsv_v9.h" > #include "base/saf_error.h" > > /* TYPE DEFINITIONS > @@ -245,12 +246,40 @@ static uint32_t ckpt_stream_config(log_stream_t > *stream) { > lgsv_ckpt_msg_v1_t ckpt_v1; > lgsv_ckpt_msg_v2_t ckpt_v2; > lgsv_ckpt_msg_v6_t ckpt_v3; > + lgsv_ckpt_msg_v9_t ckpt_v4; > > void *ckpt_ptr; > > TRACE_ENTER(); > > - if (lgs_is_peer_v6()) { > + if (lgs_is_peer_v9()) { [THANG]: use one function fo this check via pass the version as argument. > + memset(&ckpt_v4, 0, sizeof(ckpt_v4)); > + ckpt_v4.header.ckpt_rec_type = LGS_CKPT_CFG_STREAM; > + ckpt_v4.header.num_ckpt_records = 1; > + ckpt_v4.header.data_len = 1; > + > + ckpt_v4.ckpt_rec.stream_cfg.name = const_cast<char > *>(stream->name.c_str()); > + ckpt_v4.ckpt_rec.stream_cfg.fileName = > + const_cast<char *>(stream->fileName.c_str()); > + ckpt_v4.ckpt_rec.stream_cfg.pathName = > + const_cast<char *>(stream->pathName.c_str()); > + ckpt_v4.ckpt_rec.stream_cfg.maxLogFileSize = stream->maxLogFileSize; > + ckpt_v4.ckpt_rec.stream_cfg.fixedLogRecordSize = > stream->fixedLogRecordSize; > + ckpt_v4.ckpt_rec.stream_cfg.logFullAction = stream->logFullAction; > + ckpt_v4.ckpt_rec.stream_cfg.logFullHaltThreshold = > + stream->logFullHaltThreshold; > + ckpt_v4.ckpt_rec.stream_cfg.maxFilesRotated = stream->maxFilesRotated; > + ckpt_v4.ckpt_rec.stream_cfg.logFileFormat = stream->logFileFormat; > + ckpt_v4.ckpt_rec.stream_cfg.severityFilter = stream->severityFilter; > + ckpt_v4.ckpt_rec.stream_cfg.logFileCurrent = > + const_cast<char *>(stream->logFileCurrent.c_str()); > + ckpt_v4.ckpt_rec.stream_cfg.dest_names = > + const_cast<char *>(stream->stb_dest_names.c_str()); > + ckpt_v4.ckpt_rec.stream_cfg.c_file_close_time_stamp = > + stream->act_last_close_timestamp; > + ckpt_v4.ckpt_rec.stream_cfg.facilityId = stream->facilityId; > + ckpt_ptr = &ckpt_v4; > + } else if (lgs_is_peer_v6()) { > memset(&ckpt_v3, 0, sizeof(ckpt_v3)); > ckpt_v3.header.ckpt_rec_type = LGS_CKPT_CFG_STREAM; > ckpt_v3.header.num_ckpt_records = 1; @@ -1281,6 +1310,8 @@ > static SaAisErrorT check_attr_validity( > bool i_maxFilesRotated_mod = false; > SaUint32T i_severityFilter = 0; > bool i_severityFilter_mod = false; > + SaUint32T i_facilityId = 0; > + bool i_facilityId_mod = false; > > TRACE_ENTER(); > > @@ -1338,7 +1369,8 @@ static SaAisErrorT check_attr_validity( > if (attribute->attrValuesNumber > 0) { > value = attribute->attrValues[0]; > } else if (opdata->operationType == CCBUTIL_MODIFY) { > - if (!strcmp(attribute->attrName, "saLogRecordDestination")) { > + if (!strcmp(attribute->attrName, "saLogRecordDestination") || > + !strcmp(attribute->attrName, "saLogStreamFacilityId")) { > // do nothing > } else { [THANG]: remove "do nothing" branch by if (strcmp(attribute->attrName, "saLogRecordDestination") && strcmp(attribute->attrName, "saLogStreamFacilityId")) { > /* An attribute without a value is never valid if modify */ > @@ -1403,6 +1435,11 @@ static SaAisErrorT check_attr_validity( > i_severityFilter_mod = true; > TRACE("Saved attribute \"%s\" = %d", attribute->attrName, > i_severityFilter); > + } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId") && > + attribute->attrValuesNumber > 0) { > + i_facilityId = *(reinterpret_cast<SaUint32T *>(value)); > + i_facilityId_mod = true; > + TRACE("Saved attribute \"%s\"", attribute->attrName); > } else if (!strcmp(attribute->attrName, "saLogRecordDestination")) { > std::vector<std::string> vstring{}; > for (unsigned i = 0; i < attribute->attrValuesNumber; i++) { > @@ -1641,6 +1678,20 @@ static SaAisErrorT check_attr_validity( > goto done; > } > } > + > + /* saLogStreamFacilityId > + * <= 23 > + */ [Vu] Don't wrap a comment/a code line if its length is less than 80. > + if (i_facilityId_mod) { > + TRACE("Checking saLogStreamFacilityId"); > + if (i_facilityId > 23) { > + report_oi_error(immOiHandle, opdata->ccbId, "Invalid facility ID: > %u", > + i_facilityId); > + rc = SA_AIS_ERR_BAD_OPERATION; > + TRACE("Invalid facility ID: %u", i_facilityId); > + goto done; > + } > + } > } > > done: > @@ -2268,6 +2319,10 @@ static SaAisErrorT stream_create_and_configure1( > "saLogStreamSeverityFilter")) { > (*stream)->severityFilter = *((SaUint32T *)value); > TRACE("severityFilter: %u", (*stream)->severityFilter); > + } else if (!strcmp(ccb->param.create.attrValues[i]->attrName, > + "saLogStreamFacilityId")) { > + (*stream)->facilityId = *(reinterpret_cast<SaUint32T *>(value)); > + TRACE("facilityId: %u", (*stream)->facilityId); > } else if (!strcmp(ccb->param.create.attrValues[i]->attrName, > "saLogRecordDestination")) { > std::vector<std::string> vstring{}; @@ -2403,6 +2458,12 @@ > static void stream_ccb_apply_modify(const CcbUtilOperationData_t *opdata) { > log_stream_delete_dest_name(stream, dname); > attrMod = opdata->param.modify.attrMods[i++]; > continue; > + } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId")) { > + LOG_NO("%s deleted", __func__); > + stream->facilityId = 16; [Vu] Use `base::LogMessage::Facility::kLocal0` instead of the hard-coded value. > + new_cfg_file_needed = true; [Vu] The line above is wrong. Should delete it. The flag `new_cfg_file_needed` indicates whether the config file of this `stream` should be re-created or not. The re-creation happens if there is change in one of these attribute: - saLogStreamLogFileFormat - saLogStreamMaxFileSize - saLogStreamFullAction - saLogStreamFixedLogRecordSize > + attrMod = opdata->param.modify.attrMods[i++]; > + continue; > } > } > > @@ -2464,6 +2525,11 @@ static void stream_ccb_apply_modify(const > CcbUtilOperationData_t *opdata) { > TRACE("%s: stream %s - msgid = %s", __func__, stream->name.c_str(), > stream->rfc5424MsgId.c_str()); > } > + } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId")) { > + if (value != nullptr) { > + stream->facilityId = *(reinterpret_cast<SaUint32T *>(value)); > + new_cfg_file_needed = true; [Vu] The line above is wrong. Should delete it. See the explanation above. > + } > } else { > LOG_ER("Error: Unknown attribute name"); > osafassert(0); > @@ -2795,6 +2861,9 @@ static SaAisErrorT stream_create_and_configure( > */ > stream->creationTimeStamp = *(static_cast<SaTimeT *>(value)); > } > + } else if (!strcmp(attribute->attrName, "saLogStreamFacilityId")) { > + stream->facilityId = *(reinterpret_cast<SaUint32T *>(value)); > + TRACE("facilityId: %u", stream->facilityId); > } > } > > @@ -3184,6 +3253,7 @@ int lgs_get_streamobj_attr(SaImmAttrValuesT_2 > ***attrib_out, > const_cast<char *>("saLogStreamLogFileFormat"), > const_cast<char *>("saLogStreamSeverityFilter"), > const_cast<char *>("saLogStreamCreationTimestamp"), > + const_cast<char *>("saLogStreamFacilityId"), > NULL}; > > TRACE_ENTER2("object_name_in \"%s\"", object_name_in.c_str()); > diff --git a/src/log/logd/lgs_mbcsv.cc b/src/log/logd/lgs_mbcsv.cc > index f83d9ec20..522d7fb6f 100644 > --- a/src/log/logd/lgs_mbcsv.cc > +++ b/src/log/logd/lgs_mbcsv.cc > @@ -23,6 +23,7 @@ > > #include "osaf/immutil/immutil.h" > #include "log/logd/lgs_dest.h" > +#include "log/logd/lgs_mbcsv_v9.h" > #include "log/logd/lgs_mbcsv_v6.h" > #include "log/logd/lgs_mbcsv_v5.h" > #include "log/logd/lgs_mbcsv_v3.h" > @@ -141,7 +142,96 @@ uint32_t edp_ed_open_stream_rec(EDU_HDL *edu_hdl, > EDU_TKN *edu_tkn, > uint32_t rc = NCSCC_RC_SUCCESS; > lgs_ckpt_stream_open_t *ckpt_open_stream_msg_ptr = NULL, > **ckpt_open_stream_msg_dec_ptr; > - if (lgs_is_peer_v6()) { > + if (lgs_is_peer_v9()) { > + EDU_INST_SET ckpt_open_stream_rec_ed_rules[] = { > + {EDU_START, edp_ed_open_stream_rec, 0, 0, 0, > + sizeof(lgs_ckpt_stream_open_t), 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->streamId, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->clientId, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->logFile, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->logPath, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->logFileCurrent, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->dest_names, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns64, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->maxFileSize, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_int32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->maxLogRecordSize, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_int32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->logFileFullAction, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_int32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->maxFilesRotated, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->fileFmt, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->logStreamName, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns64, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t > *>(0))->creationTimeStamp, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->numOpeners, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->streamType, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->logRecordId, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_open_t *>(0))->facilityId, > + 0, NULL}, > + {EDU_END, 0, 0, 0, 0, 0, 0, NULL}, > + }; > + > + if (op == EDP_OP_TYPE_ENC) { > + ckpt_open_stream_msg_ptr = static_cast<lgs_ckpt_stream_open_t *>(ptr); > + } else if (op == EDP_OP_TYPE_DEC) { > + ckpt_open_stream_msg_dec_ptr = > + static_cast<lgs_ckpt_stream_open_t **>(ptr); > + if (*ckpt_open_stream_msg_dec_ptr == NULL) { > + *o_err = EDU_ERR_MEM_FAIL; > + return NCSCC_RC_FAILURE; > + } > + memset(*ckpt_open_stream_msg_dec_ptr, '\0', > + sizeof(lgs_ckpt_stream_open_t)); > + ckpt_open_stream_msg_ptr = *ckpt_open_stream_msg_dec_ptr; > + } else { > + ckpt_open_stream_msg_ptr = static_cast<lgs_ckpt_stream_open_t *>(ptr); > + } > + > + rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn, ckpt_open_stream_rec_ed_rules, > + ckpt_open_stream_msg_ptr, ptr_data_len, buf_env, > + op, o_err); } else if > + (lgs_is_peer_v6()) { > EDU_INST_SET ckpt_open_stream_rec_ed_rules[] = { > {EDU_START, edp_ed_open_stream_rec, 0, 0, 0, > sizeof(lgs_ckpt_stream_open_t), 0, NULL}, @@ -491,6 +581,18 > @@ bool lgs_is_peer_v8() { > } > } > > +/** > + * Check if peer is version 9 (or later) > + * @return bool > + */ > +bool lgs_is_peer_v9() { > + if (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_9) { > + return true; > + } else { > + return false; > + } > +} [Vu] can replace these 04 lines of code with one as below: bool lgs_is_peer_v9() { return (lgs_cb->mbcsv_peer_version >= LGS_MBCSV_VERSION_9) } > + > /** > * Check if configured for split file system. > * If other node is version 1 split file system mode is not applicable. > @@ -736,6 +838,7 @@ void lgs_ckpt_stream_open_set(log_stream_t *logStream, > stream_open->maxFilesRotated = logStream->maxFilesRotated; > stream_open->creationTimeStamp = logStream->creationTimeStamp; > stream_open->numOpeners = logStream->numOpeners; > + stream_open->facilityId = logStream->facilityId; > > if (lgs_is_peer_v7() == true) { > stream_open->streamType = logStream->streamType; @@ -908,6 > +1011,7 @@ static uint32_t edu_enc_reg_list(lgs_cb_t *cb, NCS_UBAID > *uba) { > > static uint32_t ckpt_encode_async_update(lgs_cb_t *lgs_cb, EDU_HDL edu_hdl, > NCS_MBCSV_CB_ARG *cbk_arg) > { > + lgsv_ckpt_msg_v9_t *data_v9 = NULL; > lgsv_ckpt_msg_v8_t *data_v8 = NULL; > lgsv_ckpt_msg_v6_t *data_v6 = NULL; > lgsv_ckpt_msg_v5_t *data_v5 = NULL; @@ -921,7 +1025,12 @@ static > uint32_t ckpt_encode_async_update(lgs_cb_t *lgs_cb, EDU_HDL edu_hdl, > > TRACE_ENTER(); > /* Set reo_hdl from callback arg to ckpt_rec */ > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + data_v9 = reinterpret_cast<lgsv_ckpt_msg_v9_t *>( > + static_cast<int64_t>(cbk_arg->info.encode.io_reo_hdl)); > + vdata = data_v9; > + edp_function = edp_ed_ckpt_msg_v9; } else if (lgs_is_peer_v8()) > + { > data_v8 = reinterpret_cast<lgsv_ckpt_msg_v8_t *>( > static_cast<long>(cbk_arg->info.encode.io_reo_hdl)); > vdata = data_v8; > @@ -1250,7 +1359,12 @@ static uint32_t ckpt_decode_log_cfg_stream(lgs_cb_t > *cb, void *ckpt_msg, > void *stream_cfg; > EDU_PROG_HANDLER edp_function; > > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + lgsv_ckpt_msg_v9_t *ckpt_msg_v9 = > + static_cast<lgsv_ckpt_msg_v9_t *>(ckpt_msg); > + stream_cfg = &ckpt_msg_v9->ckpt_rec.stream_cfg; > + edp_function = edp_ed_cfg_stream_rec_v9; } else if > + (lgs_is_peer_v8()) { > lgsv_ckpt_msg_v8_t *ckpt_msg_v8 = > static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_msg); > stream_cfg = &ckpt_msg_v8->ckpt_rec.stream_cfg; > @@ -1341,6 +1455,8 @@ static uint32_t ckpt_decode_async_update(lgs_cb_t *cb, > lgsv_ckpt_msg_v6_t *ckpt_msg_v6 = &msg_v6; > lgsv_ckpt_msg_v8_t msg_v8; > lgsv_ckpt_msg_v8_t *ckpt_msg_v8 = &msg_v8; > + lgsv_ckpt_msg_v9_t msg_v9; > + lgsv_ckpt_msg_v9_t *ckpt_msg_v9 = &msg_v9; > void *ckpt_msg; > lgsv_ckpt_header_t hdr, *hdr_ptr = &hdr; > > @@ -1361,7 +1477,10 @@ static uint32_t > ckpt_decode_async_update(lgs_cb_t *cb, > > TRACE_2("\tckpt_rec_type: %d ", (int)hdr_ptr->ckpt_rec_type); > > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + ckpt_msg_v9->header = hdr; > + ckpt_msg = ckpt_msg_v9; > + } else if (lgs_is_peer_v8()) { > ckpt_msg_v8->header = hdr; > ckpt_msg = ckpt_msg_v8; > } else if (lgs_is_peer_v6()) { > @@ -1385,7 +1504,10 @@ static uint32_t ckpt_decode_async_update(lgs_cb_t *cb, > switch (hdr_ptr->ckpt_rec_type) { > case LGS_CKPT_CLIENT_INITIALIZE: > TRACE_2("\tINITIALIZE REC: UPDATE"); > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + reg_rec = &ckpt_msg_v9->ckpt_rec.initialize_client; > + edp_function_reg = edp_ed_reg_rec_v6; > + } else if (lgs_is_peer_v8()) { > reg_rec = &ckpt_msg_v8->ckpt_rec.initialize_client; > edp_function_reg = edp_ed_reg_rec_v6; > } else if (lgs_is_peer_v6()) { @@ -1421,7 +1543,9 @@ static > uint32_t ckpt_decode_async_update(lgs_cb_t *cb, > > case LGS_CKPT_OPEN_STREAM: /* 4 */ > TRACE_2("\tSTREAM OPEN: UPDATE"); > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + stream_open = &ckpt_msg_v9->ckpt_rec.stream_open; > + } else if (lgs_is_peer_v8()) { > stream_open = &ckpt_msg_v8->ckpt_rec.stream_open; > } else if (lgs_is_peer_v6()) { > stream_open = &ckpt_msg_v6->ckpt_rec.stream_open; > @@ -1542,6 +1666,7 @@ static uint32_t ckpt_decode_cold_sync(lgs_cb_t *cb, > NCS_MBCSV_CB_ARG *cbk_arg) { > lgsv_ckpt_msg_v2_t msg_v2; > lgsv_ckpt_msg_v6_t msg_v6; > lgsv_ckpt_msg_v8_t msg_v8; > + lgsv_ckpt_msg_v9_t msg_v9; > uint32_t num_rec = 0; > void *reg_rec = NULL; > lgs_ckpt_stream_open_t *stream_rec = NULL; @@ -1563,7 +1688,16 @@ > static uint32_t ckpt_decode_cold_sync(lgs_cb_t *cb, NCS_MBCSV_CB_ARG > *cbk_arg) { > | Header|RegRecords1..n|Header|streamRecords1..n| > ------------------------------------------------- > */ > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + lgsv_ckpt_msg_v9_t *data_v9 = &msg_v9; > + header = &data_v9->header; > + initialize_client_rec_ptr = &data_v9->ckpt_rec.initialize_client; > + stream_open_rec_ptr = &data_v9->ckpt_rec.stream_open; > + vdata = data_v9; > + vckpt_rec = &data_v9->ckpt_rec; > + ckpt_rec_size = sizeof(data_v9->ckpt_rec); > + edp_function_reg = edp_ed_reg_rec_v6; } else if > + (lgs_is_peer_v8()) { > lgsv_ckpt_msg_v8_t *data_v8 = &msg_v8; > header = &data_v8->header; > initialize_client_rec_ptr = > &data_v8->ckpt_rec.initialize_client; > @@ -1725,13 +1859,17 @@ uint32_t process_ckpt_data(lgs_cb_t *cb, void *data) { > lgsv_ckpt_msg_v5_t *data_v5; > lgsv_ckpt_msg_v6_t *data_v6; > lgsv_ckpt_msg_v8_t *data_v8; > + lgsv_ckpt_msg_v9_t *data_v9; > > if ((!cb) || (data == NULL)) { > TRACE("%s - FAILED: (!cb) || (data == NULL)", __FUNCTION__); > return (rc = NCSCC_RC_FAILURE); > } > > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + data_v9 = static_cast<lgsv_ckpt_msg_v9_t *>(data); > + lgsv_ckpt_msg_type = data_v9->header.ckpt_rec_type; } else if > + (lgs_is_peer_v8()) { > data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data); > lgsv_ckpt_msg_type = data_v8->header.ckpt_rec_type; > } else if (lgs_is_peer_v6()) { > @@ -2230,7 +2368,10 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb, > void *data) { > > TRACE_ENTER(); > > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + lgsv_ckpt_msg_v9_t *data_v9 = static_cast<lgsv_ckpt_msg_v9_t *>(data); > + param = &data_v9->ckpt_rec.stream_open; } else if > + (lgs_is_peer_v8()) { > lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data); > param = &data_v8->ckpt_rec.stream_open; > } else if (lgs_is_peer_v6()) { > @@ -2289,6 +2430,7 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t *cb, void > *data) { > stream->logFileCurrent = param->logFileCurrent; > stream->stb_prev_actlogFileCurrent = param->logFileCurrent; > stream->stb_logFileCurrent = param->logFileCurrent; > + stream->facilityId = param->facilityId; > > if (stream->streamType == STREAM_TYPE_APPLICATION) { > // Note: Previous handling for backwards compatibility @@ > -2497,10 +2639,27 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void > *data) { > SaUint32T severityFilter; > char *logFileCurrent; > bool new_cfg_file_needed = false; > + uint32_t facilityId = 16; > > TRACE_ENTER(); > > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + lgsv_ckpt_msg_v9_t *data_v9 = static_cast<lgsv_ckpt_msg_v9_t *>(data); > + name = data_v9->ckpt_rec.stream_cfg.name; > + fileName = data_v9->ckpt_rec.stream_cfg.fileName; > + pathName = data_v9->ckpt_rec.stream_cfg.pathName; > + maxLogFileSize = data_v9->ckpt_rec.stream_cfg.maxLogFileSize; > + fixedLogRecordSize = data_v9->ckpt_rec.stream_cfg.fixedLogRecordSize; > + logFullAction = data_v9->ckpt_rec.stream_cfg.logFullAction; > + logFullHaltThreshold = data_v9->ckpt_rec.stream_cfg.logFullHaltThreshold; > + maxFilesRotated = data_v9->ckpt_rec.stream_cfg.maxFilesRotated; > + logFileFormat = data_v9->ckpt_rec.stream_cfg.logFileFormat; > + severityFilter = data_v9->ckpt_rec.stream_cfg.severityFilter; > + logFileCurrent = data_v9->ckpt_rec.stream_cfg.logFileCurrent; > + dest_names = data_v9->ckpt_rec.stream_cfg.dest_names; > + closetime = data_v9->ckpt_rec.stream_cfg.c_file_close_time_stamp; > + facilityId = data_v9->ckpt_rec.stream_cfg.facilityId; > + } else if (lgs_is_peer_v8()) { > lgsv_ckpt_msg_v8_t *data_v8 = static_cast<lgsv_ckpt_msg_v8_t *>(data); > name = data_v8->ckpt_rec.stream_cfg.name; > fileName = data_v8->ckpt_rec.stream_cfg.fileName; > @@ -2571,6 +2730,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void > *data) { > (stream->logFullAction != logFullAction) || > (stream->maxFilesRotated != maxFilesRotated) || > (strcmp(stream->logFileFormat, logFileFormat) != 0) || > + (stream->facilityId != facilityId) || [Vu] This check is wrong. See the explanation above. > (stream->fileName != fileName)) > new_cfg_file_needed = true; > > @@ -2581,6 +2741,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs_cb_t *cb, void > *data) { > stream->logFullAction = logFullAction; > stream->logFullHaltThreshold = logFullHaltThreshold; > stream->maxFilesRotated = maxFilesRotated; > + stream->facilityId = facilityId; > > if (stream->logFileFormat != NULL) { > free(stream->logFileFormat); > @@ -2690,7 +2851,11 @@ uint32_t lgs_ckpt_send_async(lgs_cb_t *cb, void > *ckpt_rec, uint32_t action) { > > TRACE_ENTER(); > > - if (lgs_is_peer_v8()) { > + if (lgs_is_peer_v9()) { > + lgsv_ckpt_msg_v9_t *ckpt_rec_v9 = > + static_cast<lgsv_ckpt_msg_v9_t *>(ckpt_rec); > + ckpt_rec_type = ckpt_rec_v9->header.ckpt_rec_type; > + } else if (lgs_is_peer_v8()) { > lgsv_ckpt_msg_v8_t *ckpt_rec_v8 = > static_cast<lgsv_ckpt_msg_v8_t *>(ckpt_rec); > ckpt_rec_type = ckpt_rec_v8->header.ckpt_rec_type; > diff --git a/src/log/logd/lgs_mbcsv.h b/src/log/logd/lgs_mbcsv.h index > 998e843e4..02db433f2 100644 > --- a/src/log/logd/lgs_mbcsv.h > +++ b/src/log/logd/lgs_mbcsv.h > @@ -43,9 +43,10 @@ > #define LGS_MBCSV_VERSION_6 6 > #define LGS_MBCSV_VERSION_7 7 > #define LGS_MBCSV_VERSION_8 8 > +#define LGS_MBCSV_VERSION_9 9 > > /* Current version */ > -#define LGS_MBCSV_VERSION 8 > +#define LGS_MBCSV_VERSION 9 > #define LGS_MBCSV_VERSION_MIN 1 > > /* Checkpoint message types(Used as 'reotype' w.r.t mbcsv) */ @@ > -108,6 +109,7 @@ typedef struct { > char *dest_names; > logStreamTypeT streamType; > uint32_t logRecordId; /* log record identifier increased for each > record */ > + uint32_t facilityId; > } lgs_ckpt_stream_open_t; > > uint32_t lgs_mbcsv_init(lgs_cb_t *lgs_cb, SaAmfHAStateT ha_state); > @@ -121,6 +123,7 @@ bool lgs_is_peer_v6(); > // lgs_ckpt_stream_open_t structure > bool lgs_is_peer_v7(); > bool lgs_is_peer_v8(); > +bool lgs_is_peer_v9(); > > bool lgs_is_split_file_system(); > uint32_t lgs_mbcsv_dispatch(NCS_MBCSV_HDL mbcsv_hdl); diff --git > a/src/log/logd/lgs_mbcsv_v9.cc b/src/log/logd/lgs_mbcsv_v9.cc new file > mode 100644 index 000000000..61b5f431c > --- /dev/null > +++ b/src/log/logd/lgs_mbcsv_v9.cc > @@ -0,0 +1,243 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2020 The OpenSAF Foundation > + * Copyright Ericsson AB 2020 - All Rights Reserved. > + * > + * This program is distributed in the hope that it will be useful, > +but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > +MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are > +licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + *http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for > +full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ [Vu] Wrong copyright format. Should be same as one in `lgs_mbcsv_v9.h` > + > +#include "log/logd/lgs_mbcsv_v9.h" > +#include "base/logtrace.h" > + > +/**************************************************************************** > + * Name : edp_ed_cfg_stream_rec [Vu] edp_ed_cfg_stream_rec_v9 > + * > + * Description : This function is an EDU program for encoding/decoding > + * lgsv checkpoint cfg_update_stream log rec. > + * > + * Arguments : EDU_HDL - pointer to edu handle, > + * EDU_TKN - internal edu token to help encode/decode, > + * POINTER to the structure to encode/decode from/to, > + * data length specifying number of structures, > + * EDU_BUF_ENV - pointer to buffer for encoding/decoding. > + * op - operation type being encode/decode. > + * EDU_ERR - out param to indicate errors in processing. > + * > + * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE > + * > + * Notes : None. > + ******************************************************************** > + *********/ > + > +uint32_t edp_ed_cfg_stream_rec_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn, > + NCSCONTEXT ptr, uint32_t *ptr_data_len, > + EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, > + EDU_ERR *o_err) { > + uint32_t rc = NCSCC_RC_SUCCESS; > + lgs_ckpt_stream_cfg_v4_t *ckpt_stream_cfg_msg_ptr = NULL, > + **ckpt_stream_cfg_msg_dec_ptr; [Vu] Use nullptr in the new c++ file instead of NULL. > + TRACE_ENTER(); > + EDU_INST_SET ckpt_stream_cfg_rec_ed_rules[] = { > + {EDU_START, edp_ed_cfg_stream_rec_v9, 0, 0, 0, > + sizeof(lgs_ckpt_stream_cfg_v4_t), 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->name, > 0, > + NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t > *>(0))->fileName, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t > *>(0))->pathName, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns64, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->maxLogFileSize, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0)) > + ->fixedLogRecordSize, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->haProperty, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->logFullAction, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0)) > + ->logFullHaltThreshold, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t > *>(0))->maxFilesRotated, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->logFileFormat, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->severityFilter, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->logFileCurrent, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_string, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->dest_names, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns64, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0)) > + ->c_file_close_time_stamp, > + 0, NULL}, > + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & > + (reinterpret_cast<lgs_ckpt_stream_cfg_v4_t *>(0))->facilityId, > + 0, NULL}, > + {EDU_END, 0, 0, 0, 0, 0, 0, NULL}, }; > + > + if (op == EDP_OP_TYPE_ENC) { > + ckpt_stream_cfg_msg_ptr = static_cast<lgs_ckpt_stream_cfg_v4_t > + *>(ptr); } else if (op == EDP_OP_TYPE_DEC) { > + ckpt_stream_cfg_msg_dec_ptr = static_cast<lgs_ckpt_stream_cfg_v4_t > **>(ptr); > + if (*ckpt_stream_cfg_msg_dec_ptr == NULL) { > + *o_err = EDU_ERR_MEM_FAIL; > + return NCSCC_RC_FAILURE; > + } > + memset(*ckpt_stream_cfg_msg_dec_ptr, '\0', > + sizeof(lgs_ckpt_stream_cfg_v4_t)); > + ckpt_stream_cfg_msg_ptr = *ckpt_stream_cfg_msg_dec_ptr; } else { > + ckpt_stream_cfg_msg_ptr = static_cast<lgs_ckpt_stream_cfg_v4_t > + *>(ptr); } > + > + rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn, ckpt_stream_cfg_rec_ed_rules, > + ckpt_stream_cfg_msg_ptr, ptr_data_len, buf_env, > op, > + o_err); > + TRACE_LEAVE(); > + return rc; > +} > + > +/**************************************************************************** > + * Name : edp_ed_ckpt_msg_v9 > + * > + * Description : This function is an EDU program for encoding/decoding > + * lgsv checkpoint messages. This program runs the > + * edp_ed_hdr_rec program first to decide the > + * checkpoint message type based on which it will call the > + * appropriate EDU programs for the different checkpoint > + * messages. > + * > + * Arguments : EDU_HDL - pointer to edu handle, > + * EDU_TKN - internal edu token to help encode/decode, > + * POINTER to the structure to encode/decode from/to, > + * data length specifying number of structures, > + * EDU_BUF_ENV - pointer to buffer for encoding/decoding. > + * op - operation type being encode/decode. > + * EDU_ERR - out param to indicate errors in processing. > + * > + * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE > + * > + * Notes : None. > + > +********************************************************************* > +********/ > + > +uint32_t edp_ed_ckpt_msg_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn, NCSCONTEXT > ptr, > + uint32_t *ptr_data_len, EDU_BUF_ENV *buf_env, > + EDP_OP_TYPE op, EDU_ERR *o_err) { > + uint32_t rc = NCSCC_RC_SUCCESS; > + lgsv_ckpt_msg_v9_t *ckpt_msg_ptr = NULL, **ckpt_msg_dec_ptr; > + TRACE_ENTER(); > + EDU_INST_SET ckpt_msg_ed_rules[] = { > + {EDU_START, edp_ed_ckpt_msg_v9, 0, 0, 0, sizeof(lgsv_ckpt_msg_v9_t), 0, > + NULL}, > + {EDU_EXEC, edp_ed_header_rec, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->header, 0, > + NULL}, > + > + {EDU_TEST, ncs_edp_uns32, 0, 0, 0, > + (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->header, 0, > + (EDU_EXEC_RTINE)ckpt_msg_test_type}, > + > + /* Reg Record */ > + {EDU_EXEC, edp_ed_reg_rec_v6, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0)) > + ->ckpt_rec.initialize_client, > + 0, NULL}, > + > + /* Finalize record */ > + {EDU_EXEC, edp_ed_finalize_rec_v2, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0)) > + ->ckpt_rec.finalize_client, > + 0, NULL}, > + > + /* write log Record */ > + {EDU_EXEC, edp_ed_write_rec_v2, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & > + (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.write_log, > + 0, NULL}, > + > + /* Open stream */ > + {EDU_EXEC, edp_ed_open_stream_rec, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & > + (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.stream_open, > + 0, NULL}, > + > + /* Close stream */ > + {EDU_EXEC, edp_ed_close_stream_rec_v2, 0, 0, > static_cast<int>(EDU_EXIT), > + (int64_t) & > + (reinterpret_cast<lgsv_ckpt_msg_v9_t > *>(0))->ckpt_rec.stream_close, > + 0, NULL}, > + > + /* Agent dest */ > + {EDU_EXEC, edp_ed_agent_down_rec_v2, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & > + (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.stream_cfg, > + 0, NULL}, > + > + /* Cfg stream */ > + {EDU_EXEC, edp_ed_cfg_stream_rec_v9, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & > + (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.stream_cfg, > + 0, NULL}, > + > + /* Lgs cfg */ > + {EDU_EXEC, edp_ed_lgs_cfg_rec_v5, 0, 0, static_cast<int>(EDU_EXIT), > + (int64_t) & > + (reinterpret_cast<lgsv_ckpt_msg_v9_t *>(0))->ckpt_rec.lgs_cfg, > + 0, NULL}, > + > + {EDU_END, 0, 0, 0, 0, 0, 0, NULL}, }; > + > + if (op == EDP_OP_TYPE_ENC) { > + ckpt_msg_ptr = static_cast<lgsv_ckpt_msg_v9_t *>(ptr); } else if > + (op == EDP_OP_TYPE_DEC) { > + ckpt_msg_dec_ptr = static_cast<lgsv_ckpt_msg_v9_t **>(ptr); > + if (*ckpt_msg_dec_ptr == NULL) { > + *o_err = EDU_ERR_MEM_FAIL; > + return NCSCC_RC_FAILURE; > + } > + memset(*ckpt_msg_dec_ptr, '\0', sizeof(lgsv_ckpt_msg_v9_t)); > + ckpt_msg_ptr = *ckpt_msg_dec_ptr; } else { > + ckpt_msg_ptr = static_cast<lgsv_ckpt_msg_v9_t *>(ptr); } > + > + rc = m_NCS_EDU_RUN_RULES(edu_hdl, edu_tkn, ckpt_msg_ed_rules, ckpt_msg_ptr, > + ptr_data_len, buf_env, op, o_err); > + TRACE_LEAVE(); > + return rc; > +} > diff --git a/src/log/logd/lgs_mbcsv_v9.h b/src/log/logd/lgs_mbcsv_v9.h > new file mode 100644 index 000000000..7c3ef9722 > --- /dev/null > +++ b/src/log/logd/lgs_mbcsv_v9.h > @@ -0,0 +1,67 @@ > +/* -*- OpenSAF -*- > + * > + * Copyright Ericsson AB 2020 - All Rights Reserved. > + * > + * This program is distributed in the hope that it will be useful, > +but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > +MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are > +licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + *http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for > +full > + * licensing terms. > + * > + * Author(s): Ericsson AB > + * > + */ > + > +#ifndef LOG_LOGD_LGS_MBCSV_V9_H_ > +#define LOG_LOGD_LGS_MBCSV_V9_H_ > + > +#include "log/logd/lgs.h" > +#include "log/logd/lgs_config.h" > +#include "log/logd/lgs_mbcsv_v2.h" > +#include "log/logd/lgs_mbcsv_v5.h" > +#include "log/logd/lgs_mbcsv_v6.h" > + > +typedef struct { > + char *name; > + char *fileName; > + char *pathName; > + SaUint64T maxLogFileSize; > + SaUint32T fixedLogRecordSize; > + SaBoolT haProperty; /* app log stream only */ > + SaLogFileFullActionT logFullAction; > + SaUint32T logFullHaltThreshold; /* !app log stream */ > + SaUint32T maxFilesRotated; > + char *logFileFormat; > + SaUint32T severityFilter; > + char *logFileCurrent; > + char *dest_names; > + uint64_t c_file_close_time_stamp; /* Time in sec for file rename on > +Active */ > + uint32_t facilityId; > +} lgs_ckpt_stream_cfg_v4_t; > + > +typedef struct { > + lgsv_ckpt_header_t header; > + union { > + lgs_ckpt_initialize_msg_v6_t initialize_client; > + lgs_ckpt_finalize_msg_v2_t finalize_client; > + lgs_ckpt_write_log_v2_t write_log; > + lgs_ckpt_agent_down_v2_t agent_down; > + lgs_ckpt_stream_open_t stream_open; > + lgs_ckpt_stream_close_v2_t stream_close; > + lgs_ckpt_stream_cfg_v4_t stream_cfg; > + lgs_ckpt_lgs_cfg_v5_t lgs_cfg; > + } ckpt_rec; > +} lgsv_ckpt_msg_v9_t; > + > +uint32_t edp_ed_cfg_stream_rec_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn, > + NCSCONTEXT ptr, uint32_t *ptr_data_len, > + EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, > + EDU_ERR *o_err); uint32_t > +edp_ed_ckpt_msg_v9(EDU_HDL *edu_hdl, EDU_TKN *edu_tkn, NCSCONTEXT ptr, > + uint32_t *ptr_data_len, EDU_BUF_ENV *buf_env, > + EDP_OP_TYPE op, EDU_ERR *o_err); > + > +#endif // LOG_LOGD_LGS_MBCSV_V9_H_ > diff --git a/src/log/logd/lgs_recov.cc b/src/log/logd/lgs_recov.cc > index 7c0197b7f..c5f35885c 100644 > --- a/src/log/logd/lgs_recov.cc > +++ b/src/log/logd/lgs_recov.cc > @@ -320,6 +320,7 @@ int lgs_restore_one_app_stream(const std::string > &stream_name, > log_stream_t *log_stream = nullptr; > SaTimeT restored_creationTimeStamp = 0; > SaUint32T restored_severityFilter = 0; > + SaUint32T restored_facilityId = 16; > > std::string fileName; > std::string pathName, fullPathName; @@ -501,6 +502,14 @@ int > lgs_restore_one_app_stream(const std::string &stream_name, > } > restored_severityFilter = *(static_cast<SaUint32T *>(value)); > TRACE("\t saLogStreamSeverityFilter=%d", > restored_severityFilter); > + } else if (!strcmp(name, "saLogStreamFacilityId")) { > + if (value == nullptr) { > + TRACE("%s: Fail, has empty value", name); > + rc_out = -1; > + goto done_free_attr; > + } > + restored_facilityId = *(static_cast<SaUint32T *>(value)); > + TRACE("\t saLogStreamFacilityId=%d", restored_facilityId); > } > } > > @@ -567,6 +576,7 @@ int lgs_restore_one_app_stream(const std::string > &stream_name, > log_stream->severityFilter = restored_severityFilter; > log_stream->filtered = 0; > log_stream->isRtStream = SA_TRUE; > + log_stream->facilityId = restored_facilityId; > > TRACE("\t Stream obj attributes handled and stream is created"); > > diff --git a/src/log/logd/lgs_stream.cc b/src/log/logd/lgs_stream.cc > index f2f7df940..71782f7ea 100644 > --- a/src/log/logd/lgs_stream.cc > +++ b/src/log/logd/lgs_stream.cc > @@ -418,6 +418,7 @@ void log_stream_print(log_stream_t *stream) { > TRACE_2(" filtered: %llu", stream->filtered); > TRACE_2(" stb_dest_names: %s", stream->stb_dest_names.c_str()); > TRACE_2(" isRtStream: %d", stream->isRtStream); > + TRACE_2(" facilityId: %u", stream->facilityId); > } > > /** > @@ -665,6 +666,12 @@ SaAisErrorT lgs_create_appstream_rt_object(log_stream_t > *const stream) { > .attrValueType = SA_IMM_ATTR_SATIMET, > .attrValuesNumber = 1, > .attrValues = arr11}; > + void *arr12[] = {&stream->facilityId}; > + const SaImmAttrValuesT_2 attr_saLogStreamFacilityId = { > + .attrName = const_cast<SaImmAttrNameT>("saLogStreamFacilityId"), > + .attrValueType = SA_IMM_ATTR_SAUINT32T, > + .attrValuesNumber = 1, > + .attrValues = arr12}; > const SaImmAttrValuesT_2 *attrValues[] = { > &attr_safLgStr, > &attr_safLogStreamFileName, > @@ -677,6 +684,7 @@ SaAisErrorT lgs_create_appstream_rt_object(log_stream_t > *const stream) { > &attr_saLogStreamLogFileFormat, > &attr_saLogStreamSeverityFilter, > &attr_saLogStreamCreationTimestamp, > + &attr_saLogStreamFacilityId, > NULL}; > > SaNameT object_name; > @@ -723,6 +731,7 @@ log_stream_t *log_stream_new(const std::string &name, int > stream_id) { > stream->severityFilter = 0x7f; /* by default all levels are allowed */ > stream->isRtStream = SA_FALSE; > stream->dest_names.clear(); > + stream->facilityId = 16; [Vu] use `base::LogMessage::Facility::kLocal0` instead of a hard code value. > > /* Initiate local or shared stream file descriptor dependant on shared or > * split file system > diff --git a/src/log/logd/lgs_stream.h b/src/log/logd/lgs_stream.h > index 8fdb5693d..a9659582b 100644 > --- a/src/log/logd/lgs_stream.h > +++ b/src/log/logd/lgs_stream.h > @@ -53,6 +53,7 @@ typedef struct log_stream { > SaUint32T numOpeners; > SaUint64T filtered; /* discarded by server due to filtering */ > std::string rfc5424MsgId; > + uint32_t facilityId; > /* --- end correspond to IMM Class --- */ > > uint32_t streamId; /* The unique stream id for this stream */ diff > --git a/src/log/logd/lgs_unixsock_dest.cc > b/src/log/logd/lgs_unixsock_dest.cc > index a48250063..cee3abbf5 100644 > --- a/src/log/logd/lgs_unixsock_dest.cc > +++ b/src/log/logd/lgs_unixsock_dest.cc > @@ -70,13 +70,16 @@ void UnixSocketHandler::Open() { FlushStatus(); } > > void UnixSocketHandler::FormRfc5424(const DestinationHandler::RecordInfo& > msg, > RfcBuffer* buf) { > + base::LogMessage::Facility facilityId = > + (msg.facilityId < 24) > + ? static_cast<base::LogMessage::Facility>(msg.facilityId) > + : base::LogMessage::Facility::kLocal0; [Vu] the value of facility id is already guaranteed in range [0-23], so no need to check if facility id less than 24 or not. > base::LogMessage::Severity sev{Sev(msg.severity)}; > base::LogMessage::HostName hostname{msg.origin}; > base::LogMessage::ProcId procid{""}; > base::LogMessage::AppName appname{msg.app_name}; > > - base::LogMessage::Write(base::LogMessage::Facility::kLocal0, sev, msg.time, > - hostname, appname, procid, > + base::LogMessage::Write(facilityId, sev, msg.time, hostname, > + appname, procid, > base::LogMessage::MsgId{msg.msgid}, {}, > std::string{msg.log_record}, buf); > } _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel