From 407e77883cc274fee19d44035d9812cb4258fb66 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 17 Apr 2019 15:42:39 +0200 Subject: [PATCH] ApiListener#ReplayLog(): read current log file too instead of rotating --- lib/remote/apilistener.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index a5bbb8079..9b217266c 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -33,6 +33,7 @@ #include #include #include +#include using namespace icinga; @@ -1205,7 +1206,6 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) boost::mutex::scoped_lock lock(m_LogLock); CloseLogFile(); - RotateLogFile(); if (count == -1 || count > 50000) { OpenLogFile(); @@ -1220,16 +1220,21 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) Utility::Glob(GetApiDir() + "log/*", std::bind(&ApiListener::LogGlobHandler, std::ref(files), _1), GlobFile); std::sort(files.begin(), files.end()); + std::vector> allFiles; + for (int ts : files) { - String path = GetApiDir() + "log/" + Convert::ToString(ts); + if (ts >= peer_ts) { + allFiles.emplace_back(ts, GetApiDir() + "log/" + Convert::ToString(ts)); + } + } - if (ts < peer_ts) - continue; + allFiles.emplace_back(Utility::GetTime() + 1, GetApiDir() + "log/current"); + for (auto& file : allFiles) { Log(LogNotice, "ApiListener") - << "Replaying log: " << path; + << "Replaying log: " << file.second; - auto *fp = new std::fstream(path.CStr(), std::fstream::in | std::fstream::binary); + auto *fp = new std::fstream(file.second.CStr(), std::fstream::in | std::fstream::binary); StdioStream::Ptr logStream = new StdioStream(fp, true); String message; @@ -1249,7 +1254,7 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) pmessage = JsonDecode(message); } catch (const std::exception&) { Log(LogWarning, "ApiListener") - << "Unexpected end-of-file for cluster log: " << path; + << "Unexpected end-of-file for cluster log: " << file.second; /* Log files may be incomplete or corrupted. This is perfectly OK. */ break; @@ -1285,8 +1290,8 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) peer_ts = pmessage->Get("timestamp"); - if (ts > logpos_ts + 10) { - logpos_ts = ts; + if (file.first > logpos_ts + 10) { + logpos_ts = file.first; Dictionary::Ptr lmessage = new Dictionary({ { "jsonrpc", "2.0" },