diff --git a/lib/inc/Recorder.h b/lib/inc/Recorder.h index b747589ce..d11a0e65e 100644 --- a/lib/inc/Recorder.h +++ b/lib/inc/Recorder.h @@ -366,6 +366,9 @@ namespace sairedis bool setRecordingOutputDirectory( _In_ const sai_attribute_t &attr); + bool setRecordingFilename( + _In_ const sai_attribute_t &attr); + void requestLogRotate(); public: // static helper functions diff --git a/lib/inc/sairedis.h b/lib/inc/sairedis.h index 40f24b504..fb24e4f14 100644 --- a/lib/inc/sairedis.h +++ b/lib/inc/sairedis.h @@ -194,4 +194,15 @@ typedef enum _sai_redis_switch_attr_t */ SAI_REDIS_SWITCH_ATTR_CONTEXT, + /** + * @brief Recording log filename. + * + * Default valus is sairedis.rec + * + * @type sai_s8_list_t + * @flags CREATE_AND_SET + * @default sairedis.rec + */ + SAI_REDIS_SWITCH_ATTR_RECORDING_FILENAME, + } sai_redis_switch_attr_t; diff --git a/lib/src/Recorder.cpp b/lib/src/Recorder.cpp index 5461cbaf9..24f7b4ca4 100644 --- a/lib/src/Recorder.cpp +++ b/lib/src/Recorder.cpp @@ -22,12 +22,12 @@ std::vector serialize_counter_id_list( _In_ const sai_stat_id_t *counter_id_list); #define MUTEX() std::lock_guard _lock(m_mutex) - +#define DEFAULT_RECORDING_FILE_NAME "sairedis.rec" Recorder::Recorder() { SWSS_LOG_ENTER(); - m_recordingFileName = "sairedis.rec"; + m_recordingFileName = DEFAULT_RECORDING_FILE_NAME; m_recordingOutputDirectory = "."; @@ -97,6 +97,58 @@ bool Recorder::setRecordingOutputDirectory( return true; } +bool Recorder::setRecordingFilename( + _In_ const sai_attribute_t &attr) +{ + SWSS_LOG_ENTER(); + + if (attr.value.s8list.count == 0) + { + m_recordingFileName = DEFAULT_RECORDING_FILE_NAME; + + SWSS_LOG_NOTICE("setting recording filename to default filename: %s", m_recordingFileName.c_str()); + + requestLogRotate(); + + return true; + } + + if (attr.value.s8list.list == NULL) + { + SWSS_LOG_ERROR("list pointer is NULL"); + + return false; + } + + size_t len = strnlen((const char *)attr.value.s8list.list, attr.value.s8list.count); + + if (len != (size_t)attr.value.s8list.count) + { + SWSS_LOG_ERROR("count (%u) is different than strnlen (%zu)", attr.value.s8list.count, len); + + return false; + } + + std::string filename((const char*)attr.value.s8list.list, len); + + /// Stop the recording with old file before updating the filename + if (m_enabled) + { + stopRecording(); + } + + m_recordingFileName = filename; + + SWSS_LOG_NOTICE("setting recording filename : %s", m_recordingFileName.c_str()); + + /// Start recording with new file + if (m_enabled) + { + startRecording(); + } + return true; +} + void Recorder::enableRecording( _In_ bool enabled) { diff --git a/lib/src/RedisRemoteSaiInterface.cpp b/lib/src/RedisRemoteSaiInterface.cpp index 7f84ef683..574d357fe 100644 --- a/lib/src/RedisRemoteSaiInterface.cpp +++ b/lib/src/RedisRemoteSaiInterface.cpp @@ -477,6 +477,15 @@ sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute( return SAI_STATUS_SUCCESS; + case SAI_REDIS_SWITCH_ATTR_RECORDING_FILENAME: + + if (m_recorder) + { + m_recorder->setRecordingFilename(*attr); + } + + return SAI_STATUS_SUCCESS; + default: break; }