To increase the amount of trace data that is kept on disk, OpenSAF trace files
now have nine backup files, named .1 to .9, instead of just one single backup
file. The MDS log still has one single backup file, as before.
---
src/dtm/transport/log_server.cc | 9 +++++----
src/dtm/transport/log_server.h | 2 +-
src/dtm/transport/log_writer.cc | 24 ++++++++++++++++++------
src/dtm/transport/log_writer.h | 8 +++-----
src/dtm/transport/tests/log_writer_test.cc | 2 +-
5 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/src/dtm/transport/log_server.cc b/src/dtm/transport/log_server.cc
index 03bee2353..09343fdd8 100644
--- a/src/dtm/transport/log_server.cc
+++ b/src/dtm/transport/log_server.cc
@@ -29,7 +29,7 @@ LogServer::LogServer(int term_fd)
base::GetEnv<std::string>("pkglocalstatedir", PKGLOCALSTATEDIR) +
"/osaf_log.sock"},
log_streams_{},
- current_stream_{new LogStream{"mds.log"}},
+ current_stream_{new LogStream{"mds.log", 1}},
no_of_log_streams_{1} {
log_streams_["mds.log"] = current_stream_;
}
@@ -107,7 +107,7 @@ 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};
+ LogStream* stream = new LogStream{log_name, 9};
auto result = log_streams_.insert(
std::map<std::string, LogStream*>::value_type{log_name, stream});
if (!result.second) osaf_abort(msg_id_size);
@@ -129,8 +129,9 @@ bool LogServer::ValidateLogName(const char* msg_id, size_t
msg_id_size) {
return no_of_dots < 2;
}
-LogServer::LogStream::LogStream(const std::string& log_name)
- : log_name_{log_name}, last_flush_{}, log_writer_{log_name} {
+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}
{
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 d503e254b..0ad3e261f 100644
--- a/src/dtm/transport/log_server.h
+++ b/src/dtm/transport/log_server.h
@@ -44,7 +44,7 @@ class LogServer {
class LogStream {
public:
static constexpr size_t kMaxLogNameSize = 32;
- LogStream(const std::string& log_name);
+ LogStream(const std::string& log_name, size_t no_of_backups);
size_t log_name_size() const { return log_name_.size(); }
const char* log_name_data() const { return log_name_.data(); }
diff --git a/src/dtm/transport/log_writer.cc b/src/dtm/transport/log_writer.cc
index 0025c7601..8f1d6a77f 100644
--- a/src/dtm/transport/log_writer.cc
+++ b/src/dtm/transport/log_writer.cc
@@ -25,13 +25,13 @@
#include "base/getenv.h"
#include "osaf/configmake.h"
-LogWriter::LogWriter(const std::string& log_name)
+LogWriter::LogWriter(const std::string& log_name, size_t no_of_backups)
: log_file_{base::GetEnv<std::string>("pkglogdir", PKGLOGDIR) + "/" +
log_name},
- old_log_file_{log_file_ + ".1"},
fd_{-1},
current_file_size_{0},
current_buffer_size_{0},
+ no_of_backups_{no_of_backups},
buffer_{new char[kBufferSize]} {}
LogWriter::~LogWriter() {
@@ -40,11 +40,19 @@ LogWriter::~LogWriter() {
delete[] buffer_;
}
+std::string LogWriter::log_file(size_t backup) const {
+ std::string file_name = log_file_;
+ if (backup != 0) {
+ file_name += std::string{"."} + std::to_string(backup);
+ }
+ return file_name;
+}
+
void LogWriter::Open() {
if (fd_ < 0) {
int fd;
do {
- fd = open(log_file(), O_WRONLY | O_CLOEXEC | O_CREAT,
+ fd = open(log_file(0).c_str(), O_WRONLY | O_CLOEXEC | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
} while (fd == -1 && errno == EINTR);
if (fd >= 0) {
@@ -66,9 +74,13 @@ void LogWriter::Close() {
void LogWriter::RotateLog() {
Close();
- unlink(old_log_file());
- if (rename(log_file(), old_log_file()) != 0) {
- unlink(log_file());
+ unlink(log_file(no_of_backups_).c_str());
+ for (size_t i = no_of_backups_; i != 0; --i) {
+ std::string backup_name = log_file(i);
+ std::string previous_backup = log_file(i - 1);
+ if (rename(previous_backup.c_str(), backup_name.c_str()) != 0) {
+ unlink(previous_backup.c_str());
+ }
}
}
diff --git a/src/dtm/transport/log_writer.h b/src/dtm/transport/log_writer.h
index 927e2b650..89d7b37a2 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);
+ LogWriter(const std::string& log_name, size_t no_of_backups);
virtual ~LogWriter();
char* current_buffer_position() { return buffer_ + current_buffer_size_; }
@@ -48,15 +48,13 @@ class LogWriter {
void Close();
void RotateLog();
- const char* log_file() const { return log_file_.c_str(); }
-
- const char* old_log_file() const { return old_log_file_.c_str(); }
+ std::string log_file(size_t backup) const;
const std::string log_file_;
- const std::string old_log_file_;
int fd_;
size_t current_file_size_;
size_t current_buffer_size_;
+ size_t no_of_backups_;
char* buffer_;
DELETE_COPY_AND_MOVE_OPERATORS(LogWriter);
diff --git a/src/dtm/transport/tests/log_writer_test.cc
b/src/dtm/transport/tests/log_writer_test.cc
index 649eeac78..f57681cb1 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");
+ LogWriter* log_writer = new LogWriter{"mds.log", 1};
memcpy(log_writer->current_buffer_position(), second_line,
sizeof(second_line) - 1);
log_writer->current_buffer_position()[sizeof(second_line) - 1] = '\n';
--
2.13.3
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel