---
opensaf.spec.in | 2 +
src/dtm/Makefile.am | 3 +
src/dtm/transport/log_server.cc | 95 ++++++++++++++++++++++++++++--
src/dtm/transport/log_server.h | 10 +++-
src/dtm/transport/log_writer.cc | 6 +-
src/dtm/transport/log_writer.h | 4 +-
src/dtm/transport/main.cc | 4 ++
src/dtm/transport/osaf-transport.in | 1 +
src/dtm/transport/tests/log_writer_test.cc | 2 +-
src/dtm/transport/transportd.conf | 13 ++++
10 files changed, 129 insertions(+), 11 deletions(-)
create mode 100644 src/dtm/transport/transportd.conf
diff --git a/opensaf.spec.in b/opensaf.spec.in
index db4b5be..452d1c8 100644
--- a/opensaf.spec.in
+++ b/opensaf.spec.in
@@ -1397,6 +1397,7 @@ fi
%config(noreplace) %{_pkgsysconfdir}/nodeinit.conf.controller
%config(noreplace) %{_pkgsysconfdir}/nodeinit.conf.payload
%config(noreplace) %{_pkgsysconfdir}/dtmd.conf
+%config(noreplace) %{_pkgsysconfdir}/transportd.conf
%{_pkglibdir}/osafrded
%{_pkgclcclidir}/osaf-rded
%{_pkglibdir}/osaffmd
@@ -1423,6 +1424,7 @@ fi
%dir %{_pkgsysconfdir}
%config(noreplace) %{_pkgsysconfdir}/nodeinit.conf.payload
%config(noreplace) %{_pkgsysconfdir}/dtmd.conf
+%config(noreplace) %{_pkgsysconfdir}/transportd.conf
%{_pkglibdir}/osafdtmd
%{_pkglibdir}/osaftransportd
%{_pkgclcclidir}/osaf-dtm
diff --git a/src/dtm/Makefile.am b/src/dtm/Makefile.am
index f3ba720..822249c 100644
--- a/src/dtm/Makefile.am
+++ b/src/dtm/Makefile.am
@@ -57,6 +57,9 @@ nodist_pkgclccli_SCRIPTS += \
dist_pkgsysconf_DATA += \
src/dtm/dtmnd/dtmd.conf
+dist_pkgsysconf_DATA += \
+ src/dtm/transport/transportd.conf
+
bin_osaftransportd_CXXFLAGS = $(AM_CXXFLAGS)
bin_osaftransportd_CPPFLAGS = \
diff --git a/src/dtm/transport/log_server.cc b/src/dtm/transport/log_server.cc
index 2d6c961..780feb1 100644
--- a/src/dtm/transport/log_server.cc
+++ b/src/dtm/transport/log_server.cc
@@ -18,21 +18,28 @@
#include "dtm/transport/log_server.h"
#include <cstring>
+#include <signal.h>
+#include <syslog.h>
#include "base/osaf_poll.h"
#include "base/time.h"
#include "dtm/common/osaflog_protocol.h"
#include "osaf/configmake.h"
+#define TRANSPORTD_CONFIG_FILE PKGSYSCONFDIR "/transportd.conf"
+
+size_t LogServer::no_of_backups = 9;
+size_t LogServer::kmax_file_size = 5000 * 1024;
+
const Osaflog::ClientAddressConstantPrefix LogServer::address_header_{};
LogServer::LogServer(int term_fd)
: term_fd_{term_fd},
log_socket_{Osaflog::kServerSocketPath, base::UnixSocket::kNonblocking},
log_streams_{},
- current_stream_{new LogStream{"mds.log", 1}},
+ current_stream_{new LogStream{"mds.log", 1, LogServer::kmax_file_size}},
no_of_log_streams_{1} {
log_streams_["mds.log"] = current_stream_;
-}
+ }
LogServer::~LogServer() {
for (const auto& s : log_streams_) delete s.second;
@@ -40,6 +47,12 @@ LogServer::~LogServer() {
void LogServer::Run() {
struct pollfd pfd[2] = {{term_fd_, POLLIN, 0}, {log_socket_.fd(), POLLIN,
0}};
+
+ /* Initialize a signal handler for loading new configuration from
transportd.conf */
+ if ((signal(SIGUSR2, usr2_sig_handler)) == SIG_ERR) {
+ syslog(LOG_ERR,"signal USR2 registration failed: %s", strerror(errno));
+ }
+
do {
for (int i = 0; i < 256; ++i) {
char* buffer = current_stream_->current_buffer_position();
@@ -88,6 +101,12 @@ void LogServer::Run() {
} while ((pfd[0].revents & POLLIN) == 0);
}
+void LogServer::usr2_sig_handler(int sig) {
+ syslog(LOG_ERR, "Recived the SIGUSR2 Signal");
+ ReadConfig(TRANSPORTD_CONFIG_FILE);
+ signal(SIGUSR2, usr2_sig_handler);
+}
+
LogServer::LogStream* LogServer::GetStream(const char* msg_id,
size_t msg_id_size) {
if (msg_id_size == current_stream_->log_name_size() &&
@@ -99,7 +118,8 @@ LogServer::LogStream* LogServer::GetStream(const char*
msg_id,
if (iter != log_streams_.end()) return iter->second;
if (no_of_log_streams_ >= kMaxNoOfStreams) return nullptr;
if (!ValidateLogName(msg_id, msg_id_size)) return nullptr;
- LogStream* stream = new LogStream{log_name, 9};
+
+ LogStream* stream = new LogStream{log_name, LogServer::no_of_backups,
LogServer::kmax_file_size};
auto result = log_streams_.insert(
std::map<std::string, LogStream*>::value_type{log_name, stream});
if (!result.second) osaf_abort(msg_id_size);
@@ -107,6 +127,71 @@ LogServer::LogStream* LogServer::GetStream(const char*
msg_id,
return stream;
}
+bool LogServer::ReadConfig(const char *transport_config_file) {
+ FILE *transport_conf_file;
+ char line[256];
+ size_t maxFileSize=0;
+ size_t noOfBackupFiles=0;
+ int i, n, comment_line, tag_len = 0;
+
+ /* Open transportd.conf config file. */
+ transport_conf_file = fopen(transport_config_file, "r");
+ if (transport_conf_file == nullptr) {
+
+ syslog(LOG_ERR,"Not able to read transportd.conf: %s", strerror(errno));
+ return false;
+ }
+
+
+ /* Read file. */
+ while (fgets(line, 256, transport_conf_file)) {
+ /* If blank line, skip it - and set tag back to 0. */
+ if (strcmp(line, "\n") == 0) {
+ continue;
+ }
+
+ /* If a comment line, skip it. */
+ n = strlen(line);
+ comment_line = 0;
+ for (i = 0; i < n; i++) {
+ if ((line[i] == ' ') || (line[i] == '\t'))
+ continue;
+ else if (line[i] == '#') {
+ comment_line = 1;
+ break;
+ } else
+ break;
+ }
+ if (comment_line) continue;
+ line[n - 1] = 0;
+
+ if (strncmp(line, "TRANSPORT_MAX_LOG_FILESIZE=",
+ strlen("TRANSPORT_MAX_LOG_FILESIZE=")) == 0) {
+ tag_len = strlen("TRANSPORT_MAX_LOG_FILESIZE=");
+ maxFileSize = atoi(&line[tag_len]);
+
+ if (maxFileSize > 1) {
+ LogServer::kmax_file_size = maxFileSize * 1024 * 1024;
+ }
+ }
+
+ if (strncmp(line, "TRANSPORT_NO_OF_BACKUP_LOG_FILES=",
+ strlen("TRANSPORT_NO_OF_BACKUP_LOG_FILES=")) == 0) {
+ tag_len = strlen("TRANSPORT_NO_OF_BACKUP_LOG_FILES=");
+ noOfBackupFiles = atoi(&line[tag_len]);
+
+ if (noOfBackupFiles > 1) {
+ LogServer::no_of_backups = noOfBackupFiles;
+ }
+ }
+ }
+
+ /* Close file. */
+ fclose(transport_conf_file);
+
+ return true;
+}
+
bool LogServer::ValidateLogName(const char* msg_id, size_t msg_id_size) {
if (msg_id_size < 1 || msg_id_size > LogStream::kMaxLogNameSize) return
false;
if (msg_id[0] == '.') return false;
@@ -152,8 +237,8 @@ std::string LogServer::ExecuteCommand(const std::string&
command) {
}
LogServer::LogStream::LogStream(const std::string& log_name,
- size_t no_of_backups)
- : log_name_{log_name}, last_flush_{}, log_writer_{log_name, no_of_backups}
{
+ size_t no_of_backups, size_t kmax_file_size)
+ : log_name_{log_name}, last_flush_{}, log_writer_{log_name, no_of_backups,
kmax_file_size} {
if (log_name.size() > kMaxLogNameSize) osaf_abort(log_name.size());
}
diff --git a/src/dtm/transport/log_server.h b/src/dtm/transport/log_server.h
index c988b61..95ea980 100644
--- a/src/dtm/transport/log_server.h
+++ b/src/dtm/transport/log_server.h
@@ -42,12 +42,14 @@ class LogServer {
// process has received the SIGTERM signal, which is indicated by the caller
// by making the term_fd (provided in the constructor) readable.
void Run();
+ // To read Transportd.conf
+ static bool ReadConfig(const char *transport_config_file);
private:
class LogStream {
public:
static constexpr size_t kMaxLogNameSize = 32;
- LogStream(const std::string& log_name, size_t no_of_backups);
+ LogStream(const std::string& log_name, size_t no_of_backups, size_t
kMaxFileSize);
size_t log_name_size() const { return log_name_.size(); }
const char* log_name_data() const { return log_name_.data(); }
@@ -79,10 +81,16 @@ class LogServer {
static bool ValidateLogName(const char* msg_id, size_t msg_id_size);
void ExecuteCommand(const char* command, size_t size,
const struct sockaddr_un& addr, socklen_t addrlen);
+ // Signal handler for reading config file transportd.conf
+ static void usr2_sig_handler(int sig);
static bool ValidateAddress(const struct sockaddr_un& addr,
socklen_t addrlen);
std::string ExecuteCommand(const std::string& command);
int term_fd_;
+ // Configuration for LogServer
+ static size_t no_of_backups;
+ static size_t kmax_file_size;
+
base::UnixServerSocket log_socket_;
std::map<std::string, LogStream*> log_streams_;
LogStream* current_stream_;
diff --git a/src/dtm/transport/log_writer.cc b/src/dtm/transport/log_writer.cc
index 8f1d6a7..329ad77 100644
--- a/src/dtm/transport/log_writer.cc
+++ b/src/dtm/transport/log_writer.cc
@@ -17,6 +17,7 @@
*/
#include "dtm/transport/log_writer.h"
+#include "dtm/transport/log_server.h"
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -25,13 +26,14 @@
#include "base/getenv.h"
#include "osaf/configmake.h"
-LogWriter::LogWriter(const std::string& log_name, size_t no_of_backups)
+LogWriter::LogWriter(const std::string& log_name, size_t no_of_backups, size_t
kmax_file_size)
: log_file_{base::GetEnv<std::string>("pkglogdir", PKGLOGDIR) + "/" +
log_name},
fd_{-1},
current_file_size_{0},
current_buffer_size_{0},
no_of_backups_{no_of_backups},
+ kmax_file_size_{kmax_file_size},
buffer_{new char[kBufferSize]} {}
LogWriter::~LogWriter() {
@@ -95,7 +97,7 @@ void LogWriter::Flush() {
if (size == 0) return;
if (fd_ < 0) Open();
if (fd_ < 0) return;
- if (current_file_size_ >= kMaxFileSize) {
+ if (current_file_size_ >= kmax_file_size_) {
RotateLog();
if (fd_ < 0) Open();
if (fd_ < 0) return;
diff --git a/src/dtm/transport/log_writer.h b/src/dtm/transport/log_writer.h
index 89d7b37..eb38cfa 100644
--- a/src/dtm/transport/log_writer.h
+++ b/src/dtm/transport/log_writer.h
@@ -29,7 +29,7 @@ class LogWriter {
public:
constexpr static const size_t kMaxMessageSize = 2 * size_t{1024};
- LogWriter(const std::string& log_name, size_t no_of_backups);
+ LogWriter(const std::string& log_name, size_t no_of_backups, size_t
kmax_file_size);
virtual ~LogWriter();
char* current_buffer_position() { return buffer_ + current_buffer_size_; }
@@ -43,7 +43,6 @@ class LogWriter {
private:
constexpr static const size_t kBufferSize = 128 * size_t{1024};
- constexpr static const size_t kMaxFileSize = 5000 * size_t{1024};
void Open();
void Close();
void RotateLog();
@@ -55,6 +54,7 @@ class LogWriter {
size_t current_file_size_;
size_t current_buffer_size_;
size_t no_of_backups_;
+ size_t kmax_file_size_;
char* buffer_;
DELETE_COPY_AND_MOVE_OPERATORS(LogWriter);
diff --git a/src/dtm/transport/main.cc b/src/dtm/transport/main.cc
index cf091c8..0d1fedf 100644
--- a/src/dtm/transport/main.cc
+++ b/src/dtm/transport/main.cc
@@ -26,6 +26,9 @@
#include "dtm/transport/log_server.h"
#include "dtm/transport/transport_monitor.h"
+
+#define TRANSPORTD_CONFIG_FILE PKGSYSCONFDIR "/transportd.conf"
+
constexpr static const int kDaemonStartWaitTimeInSeconds = 15;
enum Termination { kExit, kDaemonExit, kReboot };
@@ -82,6 +85,7 @@ Result MainFunction(int term_fd) {
pthread_attr_destroy(&attr);
return Result{kExit, "pthread_attr_setinheritsched() failed", result};
}
+ LogServer::ReadConfig(TRANSPORTD_CONFIG_FILE);
LogServer log_server{term_fd};
pthread_t thread_id;
result =
diff --git a/src/dtm/transport/osaf-transport.in
b/src/dtm/transport/osaf-transport.in
index 99a2563..a30ac63 100644
--- a/src/dtm/transport/osaf-transport.in
+++ b/src/dtm/transport/osaf-transport.in
@@ -24,6 +24,7 @@ if [ ! -r $osafdirfile ]; then
exit 6
else
. $osafdirfile
+ . $pkgsysconfdir/transportd.conf
. $pkgsysconfdir/nid.conf
fi
diff --git a/src/dtm/transport/tests/log_writer_test.cc b/src/dtm/transport/tests/log_writer_test.cc
index f57681c..e96831e 100644
--- a/src/dtm/transport/tests/log_writer_test.cc
+++ b/src/dtm/transport/tests/log_writer_test.cc
@@ -54,7 +54,7 @@ TEST_F(LogWriterTest, ExistingFileShouldBeAppended) {
std::ofstream ostr(tmpdir_ + std::string("/mds.log"));
ostr << first_line << std::endl;
ostr.close();
- LogWriter* log_writer = new LogWriter{"mds.log", 1};
+ LogWriter* log_writer = new LogWriter{"mds.log", 1, 5000 * 1024};
memcpy(log_writer->current_buffer_position(), second_line,
sizeof(second_line) - 1);
log_writer->current_buffer_position()[sizeof(second_line) - 1] = '\n';
diff --git a/src/dtm/transport/transportd.conf
b/src/dtm/transport/transportd.conf
new file mode 100644
index 0000000..48b334f
--- /dev/null
+++ b/src/dtm/transport/transportd.conf
@@ -0,0 +1,13 @@
+# This file contains configuration for the Transportd service
+
+#
+# TRANSPORT_MAX_LOG_FILESIZE: The maximum size of the log file. The size
value should
+# be in MB's i.e if you give 6 then it is treated as 6 MB. By default value
will be
+# 5 MB
+TRANSPORT_MAX_LOG_FILESIZE=5
+
+#
+# TRANSPORT_NO_OF_BACKUP_LOG_FILES: Number of backup files to maintain. Log
rotation will
+# be done based on this value. Default value will be 9
+# i.e totally 10 log files will be maintain.
+TRANSPORT_NO_OF_BACKUP_LOG_FILES=9