From 9dd210df8495eb32c53e9cc97cb76644c9b0f739 Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Wed, 21 Apr 2021 15:03:11 +0200 Subject: [PATCH 1/2] IcingaDB: use XADD MAXLEN instead of custom Lua script for dump signals The existing Lua script adds a new entry to a stream and then deletes all older entries. The same can be achieved by using `XADD ... MAXLEN 1`. --- lib/icingadb/icingadb-objects.cpp | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 5793f9762..121e21736 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -40,19 +40,6 @@ using namespace icinga; using Prio = RedisConnection::QueryPriority; -static const char * const l_LuaResetDump = R"EOF( - -local id = redis.call('XADD', KEYS[1], '*', 'key', '*', 'state', 'wip') - -local xr = redis.call('XRANGE', KEYS[1], '-', '+') -for i = 1, #xr - 1 do - redis.call('XDEL', KEYS[1], xr[i][1]) -end - -return id - -)EOF"; - INITIALIZE_ONCE(&IcingaDB::ConfigStaticInitialize); void IcingaDB::ConfigStaticInitialize() @@ -151,7 +138,8 @@ void IcingaDB::UpdateAllConfigObjects() m_Rcon->UnsuppressQueryKind(Prio::CheckResult); }); - m_Rcon->FireAndForgetQuery({"EVAL", l_LuaResetDump, "1", "icinga:dump"}, Prio::Config); + // Add a new type=* state=wip entry to the stream and remove all previous entries (MAXLEN 1). + m_Rcon->FireAndForgetQuery({"XADD", "icinga:dump", "MAXLEN", "1", "*", "key", "*", "state", "wip"}, Prio::Config); const std::vector globalKeys = { m_PrefixConfigObject + "customvar", From a5dc52dea5d6214e0a2ef82d483ca695d05661f3 Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Mon, 3 May 2021 17:13:06 +0200 Subject: [PATCH 2/2] IcingaDB: use XADD MAXLEN instead of custom Lua script for heartbeats The existing Lua script adds a new entry to a stream and then deletes all older entries. The same can be achieved by using `XADD ... MAXLEN 1`. --- lib/icingadb/icingadb.cpp | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/lib/icingadb/icingadb.cpp b/lib/icingadb/icingadb.cpp index e751ae264..694cb0979 100644 --- a/lib/icingadb/icingadb.cpp +++ b/lib/icingadb/icingadb.cpp @@ -17,25 +17,6 @@ using namespace icinga; using Prio = RedisConnection::QueryPriority; -static const char * const l_LuaPublishStats = R"EOF( - -local xa = {'XADD', KEYS[1], '*'} - -for i = 1, #ARGV do - table.insert(xa, ARGV[i]) -end - -local id = redis.call(unpack(xa)) - -local xr = redis.call('XRANGE', KEYS[1], '-', '+') -for i = 1, #xr - 1 do - redis.call('XDEL', KEYS[1], xr[i][1]) -end - -return id - -)EOF"; - String IcingaDB::m_EnvironmentId; boost::once_flag IcingaDB::m_EnvironmentIdOnce = BOOST_ONCE_INIT; @@ -129,17 +110,17 @@ void IcingaDB::PublishStats() status->Set("config_dump_in_progress", m_ConfigDumpInProgress); status->Set("timestamp", TimestampToMilliseconds(Utility::GetTime())); - std::vector eval ({"EVAL", l_LuaPublishStats, "1", "icinga:stats"}); + std::vector query {"XADD", "icinga:stats", "MAXLEN", "1", "*"}; { ObjectLock statusLock (status); for (auto& kv : status) { - eval.emplace_back(kv.first); - eval.emplace_back(JsonEncode(kv.second)); + query.emplace_back(kv.first); + query.emplace_back(JsonEncode(kv.second)); } } - m_Rcon->FireAndForgetQuery(std::move(eval), Prio::Heartbeat); + m_Rcon->FireAndForgetQuery(std::move(query), Prio::Heartbeat); } void IcingaDB::Stop(bool runtimeRemoved)