ApiListener#ReplayLog(): read current log file too instead of rotating

This commit is contained in:
Alexander A. Klimov 2019-04-17 15:42:39 +02:00
parent 997d84bfa0
commit 407e77883c
1 changed files with 14 additions and 9 deletions

View File

@ -33,6 +33,7 @@
#include <openssl/tls1.h> #include <openssl/tls1.h>
#include <openssl/x509.h> #include <openssl/x509.h>
#include <sstream> #include <sstream>
#include <utility>
using namespace icinga; using namespace icinga;
@ -1205,7 +1206,6 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client)
boost::mutex::scoped_lock lock(m_LogLock); boost::mutex::scoped_lock lock(m_LogLock);
CloseLogFile(); CloseLogFile();
RotateLogFile();
if (count == -1 || count > 50000) { if (count == -1 || count > 50000) {
OpenLogFile(); 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); Utility::Glob(GetApiDir() + "log/*", std::bind(&ApiListener::LogGlobHandler, std::ref(files), _1), GlobFile);
std::sort(files.begin(), files.end()); std::sort(files.begin(), files.end());
std::vector<std::pair<int, String>> allFiles;
for (int ts : files) { 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) allFiles.emplace_back(Utility::GetTime() + 1, GetApiDir() + "log/current");
continue;
for (auto& file : allFiles) {
Log(LogNotice, "ApiListener") 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); StdioStream::Ptr logStream = new StdioStream(fp, true);
String message; String message;
@ -1249,7 +1254,7 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client)
pmessage = JsonDecode(message); pmessage = JsonDecode(message);
} catch (const std::exception&) { } catch (const std::exception&) {
Log(LogWarning, "ApiListener") 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. */ /* Log files may be incomplete or corrupted. This is perfectly OK. */
break; break;
@ -1285,8 +1290,8 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client)
peer_ts = pmessage->Get("timestamp"); peer_ts = pmessage->Get("timestamp");
if (ts > logpos_ts + 10) { if (file.first > logpos_ts + 10) {
logpos_ts = ts; logpos_ts = file.first;
Dictionary::Ptr lmessage = new Dictionary({ Dictionary::Ptr lmessage = new Dictionary({
{ "jsonrpc", "2.0" }, { "jsonrpc", "2.0" },