Merge pull request #7721 from Icinga/bugfix/icingadb-pending

IcingaDB: suppress state sync until config sync finished
This commit is contained in:
Noah Hilverling 2020-01-08 17:30:22 +01:00 committed by GitHub
commit 6575ce920e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 1 deletions

View File

@ -4,6 +4,7 @@
#include "icingadb/redisconnection.hpp" #include "icingadb/redisconnection.hpp"
#include "base/configtype.hpp" #include "base/configtype.hpp"
#include "base/configobject.hpp" #include "base/configobject.hpp"
#include "base/defer.hpp"
#include "base/json.hpp" #include "base/json.hpp"
#include "base/logger.hpp" #include "base/logger.hpp"
#include "base/serializer.hpp" #include "base/serializer.hpp"
@ -130,6 +131,14 @@ void IcingaDB::UpdateAllConfigObjects()
types.emplace_back(ctype, lcType); types.emplace_back(ctype, lcType);
} }
m_Rcon->SuppressQueryKind(Prio::CheckResult);
m_Rcon->SuppressQueryKind(Prio::State);
Defer unSuppress ([this]() {
m_Rcon->UnsuppressQueryKind(Prio::State);
m_Rcon->UnsuppressQueryKind(Prio::CheckResult);
});
m_Rcon->FireAndForgetQuery({"EVAL", l_LuaResetDump, "1", "icinga:dump"}, Prio::Config); m_Rcon->FireAndForgetQuery({"EVAL", l_LuaResetDump, "1", "icinga:dump"}, Prio::Config);
const std::vector<String> globalKeys = { const std::vector<String> globalKeys = {

View File

@ -84,6 +84,8 @@ void IcingaDB::Start(bool runtimeCreated)
boost::thread thread(&IcingaDB::HandleEvents, this); boost::thread thread(&IcingaDB::HandleEvents, this);
thread.detach(); thread.detach();
m_Rcon->SuppressQueryKind(Prio::CheckResult);
m_Rcon->SuppressQueryKind(Prio::State);
} }
void IcingaDB::ExceptionHandler(boost::exception_ptr exp) void IcingaDB::ExceptionHandler(boost::exception_ptr exp)

View File

@ -179,6 +179,29 @@ RedisConnection::Replies RedisConnection::GetResultsOfQueries(RedisConnection::Q
return future.get(); return future.get();
} }
/**
* Mark kind as kind of queries not to actually send yet
*
* @param kind Query kind
*/
void RedisConnection::SuppressQueryKind(RedisConnection::QueryPriority kind)
{
asio::post(m_Strand, [this, kind]() { m_SuppressedQueryKinds.emplace(kind); });
}
/**
* Unmark kind as kind of queries not to actually send yet
*
* @param kind Query kind
*/
void RedisConnection::UnsuppressQueryKind(RedisConnection::QueryPriority kind)
{
asio::post(m_Strand, [this, kind]() {
m_SuppressedQueryKinds.erase(kind);
m_QueuedWrites.Set();
});
}
/** /**
* Try to connect to Redis * Try to connect to Redis
*/ */
@ -317,7 +340,7 @@ void RedisConnection::WriteLoop(asio::yield_context& yc)
WriteFirstOfHighestPrio: WriteFirstOfHighestPrio:
for (auto& queue : m_Queues.Writes) { for (auto& queue : m_Queues.Writes) {
if (queue.second.empty()) { if (m_SuppressedQueryKinds.find(queue.first) != m_SuppressedQueryKinds.end() || queue.second.empty()) {
continue; continue;
} }

View File

@ -31,6 +31,7 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include <queue> #include <queue>
#include <set>
#include <stdexcept> #include <stdexcept>
#include <utility> #include <utility>
#include <vector> #include <vector>
@ -79,6 +80,9 @@ namespace icinga
Reply GetResultOfQuery(Query query, QueryPriority priority); Reply GetResultOfQuery(Query query, QueryPriority priority);
Replies GetResultsOfQueries(Queries queries, QueryPriority priority); Replies GetResultsOfQueries(Queries queries, QueryPriority priority);
void SuppressQueryKind(QueryPriority kind);
void UnsuppressQueryKind(QueryPriority kind);
private: private:
/** /**
* What to do with the responses to Redis queries. * What to do with the responses to Redis queries.
@ -171,6 +175,9 @@ namespace icinga
std::queue<FutureResponseAction> FutureResponseActions; std::queue<FutureResponseAction> FutureResponseActions;
} m_Queues; } m_Queues;
// Kinds of queries not to actually send yet
std::set<QueryPriority> m_SuppressedQueryKinds;
// Indicate that there's something to send/receive // Indicate that there's something to send/receive
AsioConditionVariable m_QueuedWrites, m_QueuedReads; AsioConditionVariable m_QueuedWrites, m_QueuedReads;
}; };