From: Alexander A. Klimov Date: Wed, 17 Apr 2019 13:42:39 +0000 (+0200) Subject: ApiListener#ReplayLog(): read current log file too instead of rotating X-Git-Tag: v2.10.5~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40a19e41d035b592c7974666dff90588a68fa3a3;p=icinga2 ApiListener#ReplayLog(): read current log file too instead of rotating (cherry picked from commit 407e77883cc274fee19d44035d9812cb4258fb66) --- diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index b83be1c67..7cf465919 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -36,6 +36,12 @@ #include "base/statsfunction.hpp" #include "base/exception.hpp" #include +#include +#include +#include +#include +#include +#include using namespace icinga; @@ -1152,7 +1158,6 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) boost::mutex::scoped_lock lock(m_LogLock); CloseLogFile(); - RotateLogFile(); if (count == -1 || count > 50000) { OpenLogFile(); @@ -1167,16 +1172,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; @@ -1196,7 +1206,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; @@ -1233,8 +1243,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" },