From fec584da11725919e43300da7678b8505578699d Mon Sep 17 00:00:00 2001 From: Eric Cano <Eric.Cano@cern.ch> Date: Tue, 26 Sep 2017 08:45:27 +0200 Subject: [PATCH] Added logging for agent ownership addition/removal. --- common/log/LogContext.hpp | 2 +- objectstore/AgentReference.cpp | 43 ++++++++++++++++--- objectstore/AgentReference.hpp | 11 ++++- objectstore/BackendPopulator.cpp | 2 +- objectstore/GarbageCollectorTest.cpp | 36 ++++++++-------- objectstore/RetrieveQueueTest.cpp | 4 +- objectstore/RootEntryTest.cpp | 32 ++++++++------ ...ta-objectstore-collect-orphaned-object.cpp | 2 +- objectstore/cta-objectstore-initialize.cpp | 4 +- scheduler/OStoreDB/OStoreDBFactory.hpp | 4 +- 10 files changed, 94 insertions(+), 46 deletions(-) diff --git a/common/log/LogContext.hpp b/common/log/LogContext.hpp index 92be7db115..795fd214ec 100644 --- a/common/log/LogContext.hpp +++ b/common/log/LogContext.hpp @@ -51,7 +51,7 @@ public: * Access to the logger object. * @return reference to this context's logger */ - Logger & logger() throw() { return m_log; } + Logger & logger() const throw() { return m_log; } /** * Add a parameter to the container. Replaces any parameter going by the same diff --git a/objectstore/AgentReference.cpp b/objectstore/AgentReference.cpp index 50a52172b8..8f4de09f19 100644 --- a/objectstore/AgentReference.cpp +++ b/objectstore/AgentReference.cpp @@ -28,7 +28,8 @@ namespace cta { namespace objectstore { -AgentReference::AgentReference(const std::string & clientType) { +AgentReference::AgentReference(const std::string & clientType, log::Logger &logger): +m_logger(logger) { m_nextId=0; std::stringstream aid; // Get time @@ -75,9 +76,17 @@ void AgentReference::addToOwnership(const std::string& objectAddress, objectstor void AgentReference::addBatchToOwnership(const std::list<std::string>& objectAdresses, objectstore::Backend& backend) { objectstore::Agent ag(m_agentAddress, backend); + log::LogContext lc(m_logger); + log::ScopedParamContainer params(lc); + params.add("agentObject", m_agentAddress); objectstore::ScopedExclusiveLock agl(ag); ag.fetch(); - for (const auto & oa: objectAdresses) ag.addToOwnership(oa); + for (const auto & oa: objectAdresses) { + ag.addToOwnership(oa); + log::ScopedParamContainer params(lc); + params.add("ownedOdject", oa); + lc.log(log::DEBUG, "In AgentReference::addBatchToOwnership(): added object to ownership."); + } ag.commit(); } @@ -88,9 +97,17 @@ void AgentReference::removeFromOwnership(const std::string& objectAddress, objec void AgentReference::removeBatchFromOwnership(const std::list<std::string>& objectAdresses, objectstore::Backend& backend) { objectstore::Agent ag(m_agentAddress, backend); + log::LogContext lc(m_logger); + log::ScopedParamContainer params(lc); + params.add("agentObject", m_agentAddress); objectstore::ScopedExclusiveLock agl(ag); ag.fetch(); - for (const auto & oa: objectAdresses) ag.removeFromOwnership(oa); + for (const auto & oa: objectAdresses) { + ag.removeFromOwnership(oa); + log::ScopedParamContainer params(lc); + params.add("ownedOdject", oa); + lc.log(log::DEBUG, "In AgentReference::removeBatchFromOwnership(): removed object from ownership."); + } ag.commit(); } @@ -153,17 +170,21 @@ void AgentReference::queueAndExecuteAction(std::shared_ptr<Action> action, objec // Off we go! Add the actions to the queue try { objectstore::Agent ag(m_agentAddress, backend); + log::LogContext lc(m_logger); + log::ScopedParamContainer params(lc); + params.add("agentObject", m_agentAddress); objectstore::ScopedExclusiveLock agl(ag); ag.fetch(); // First we apply our own modification - appyAction(*action, ag); + appyAction(*action, ag, lc); // Then those of other threads for (auto a: q->queue) { threading::MutexLocker ml(a->mutex); - appyAction(*a, ag); + appyAction(*a, ag, lc); } // and commit ag.commit(); + // We avoid global log (with a count) as we would get one for each heartbeat. } catch (...) { // Something wend wrong: , we release the next batch of changes ANNOTATE_HAPPENS_BEFORE(promiseForNextQueue.get()); @@ -189,14 +210,24 @@ void AgentReference::queueAndExecuteAction(std::shared_ptr<Action> action, objec } } -void AgentReference::appyAction(Action& action, objectstore::Agent& agent) { +void AgentReference::appyAction(Action& action, objectstore::Agent& agent, log::LogContext &lc) { switch (action.op) { case AgentOperation::Add: + { agent.addToOwnership(action.objectAddress); + log::ScopedParamContainer params(lc); + params.add("ownedOdject", action.objectAddress); + lc.log(log::DEBUG, "In AgentReference::appyAction(): added object to ownership."); break; + } case AgentOperation::Remove: + { agent.removeFromOwnership(action.objectAddress); + log::ScopedParamContainer params(lc); + params.add("ownedOdject", action.objectAddress); + lc.log(log::DEBUG, "In AgentReference::appyAction(): removed object from ownership."); break; + } case AgentOperation::Heartbeat: agent.bumpHeartbeat(); break; diff --git a/objectstore/AgentReference.hpp b/objectstore/AgentReference.hpp index 87199c641c..3da1855d6c 100644 --- a/objectstore/AgentReference.hpp +++ b/objectstore/AgentReference.hpp @@ -22,6 +22,8 @@ #include "objectstore/Backend.hpp" #include "common/threading/Mutex.hpp" #include "common/threading/MutexLocker.hpp" +#include "common/log/Logger.hpp" +#include "common/log/LogContext.hpp" #include <atomic> #include <string> #include <future> @@ -44,7 +46,7 @@ public: * Constructor will implicitly generate the address of the Agent object. * @param clientType is an indicative string used to generate the agent object's name. */ - AgentReference(const std::string &clientType); + AgentReference(const std::string &clientType, log::Logger &logger); /** * Generates a unique address for a newly created child object. This function is thread @@ -142,7 +144,7 @@ private: * @param action * @param agent */ - void appyAction(Action &action, objectstore::Agent & agent); + void appyAction(Action &action, objectstore::Agent & agent, log::LogContext &lc); /** * The global function actually doing the job: creates a queue if needed, add @@ -168,6 +170,11 @@ private: * This future will be immediately extracted from the m_nextQueueExecutionPromise before any other thread touches it. */ std::future<void> m_nextQueueExecutionFuture; + + /** + * The logger allows printing debug information + */ + log::Logger &m_logger; }; }} diff --git a/objectstore/BackendPopulator.cpp b/objectstore/BackendPopulator.cpp index a23b2e4517..ab56b2c041 100644 --- a/objectstore/BackendPopulator.cpp +++ b/objectstore/BackendPopulator.cpp @@ -26,7 +26,7 @@ namespace cta { namespace objectstore { // Constructor //------------------------------------------------------------------------------ BackendPopulator::BackendPopulator(cta::objectstore::Backend & be, - const std::string &agentType, const cta::log::LogContext & lc): m_backend(be), m_agentReference(agentType), + const std::string &agentType, const cta::log::LogContext & lc): m_backend(be), m_agentReference(agentType, lc.logger()), m_lc(lc) { cta::objectstore::RootEntry re(m_backend); cta::objectstore::ScopedExclusiveLock rel(re); diff --git a/objectstore/GarbageCollectorTest.cpp b/objectstore/GarbageCollectorTest.cpp index 507955e0cf..48ebb1f25c 100644 --- a/objectstore/GarbageCollectorTest.cpp +++ b/objectstore/GarbageCollectorTest.cpp @@ -49,7 +49,7 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) { // Here we check for the ability to detect dead (but empty agents) // and clean them up. cta::objectstore::BackendVFS be; - cta::objectstore::AgentReference agentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference agentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); // Create the root entry cta::objectstore::RootEntry re(be); @@ -64,7 +64,7 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) { // Create 2 agents, A and B and register them // The agents are set with a timeout of 0, so they will be delclared // dead immediately. - cta::objectstore::AgentReference agrA("unitTestAgentA"), agrB("unitTestAgentB"); + cta::objectstore::AgentReference agrA("unitTestAgentA", dl), agrB("unitTestAgentB", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be), agB(agrB.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); @@ -73,7 +73,7 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) { agB.setTimeout_us(0); agB.insertAndRegisterSelf(); // Create the garbage colletor and run it twice. - cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); @@ -101,7 +101,7 @@ TEST(ObjectStore, GarbageCollectorRegister) { cta::catalogue::DummyCatalogue catalogue(dl); // Here we check that can successfully call agentRegister's garbage collector cta::objectstore::BackendVFS be; - cta::objectstore::AgentReference agentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference agentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); // Create the root entry cta::objectstore::RootEntry re(be); @@ -114,7 +114,7 @@ TEST(ObjectStore, GarbageCollectorRegister) { re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); rel.release(); // Create an agent and add and agent register to it as an owned object - cta::objectstore::AgentReference agrA("unitTestAgentA"); + cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); @@ -131,7 +131,7 @@ TEST(ObjectStore, GarbageCollectorRegister) { ar.insert(); } // Create the garbage colletor and run it twice. - cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); @@ -161,7 +161,7 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) { cta::catalogue::DummyCatalogue catalogue(dl); // Here we check that can successfully call agentRegister's garbage collector cta::objectstore::BackendVFS be; - cta::objectstore::AgentReference agentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference agentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); // Create the root entry cta::objectstore::RootEntry re(be); @@ -174,7 +174,7 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) { re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); rel.release(); // Create an agent and add and agent register to it as an owned object - cta::objectstore::AgentReference agrA("unitTestAgentA"); + cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); @@ -191,7 +191,7 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) { aq.insert(); } // Create the garbage colletor and run it twice. - cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); @@ -221,7 +221,7 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) { cta::catalogue::DummyCatalogue catalogue(dl); // Here we check that can successfully call agentRegister's garbage collector cta::objectstore::BackendVFS be; - cta::objectstore::AgentReference agentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference agentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); // Create the root entry cta::objectstore::RootEntry re(be); @@ -234,7 +234,7 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) { re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); rel.release(); // Create an agent and add the drive register to it as an owned object - cta::objectstore::AgentReference agrA("unitTestAgentA"); + cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); @@ -251,7 +251,7 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) { dr.insert(); } // Create the garbage colletor and run it twice. - cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); @@ -294,7 +294,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { "unittesthost", time(NULL)); cta::objectstore::ScopedExclusiveLock rel(re); // Create the agent for objects creation - cta::objectstore::AgentReference agentRef("unitTestCreateEnv"); + cta::objectstore::AgentReference agentRef("unitTestCreateEnv", dl); // Finish root creation. re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); rel.release(); @@ -304,7 +304,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { agent.setTimeout_us(0); agent.insertAndRegisterSelf(); // Create an agent to garbage collected - cta::objectstore::AgentReference agrA("unitTestAgentA"); + cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); @@ -415,7 +415,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { break; } // Create the garbage collector and run it twice. - cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); @@ -489,7 +489,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { "unittesthost", time(NULL)); cta::objectstore::ScopedExclusiveLock rel(re); // Create the agent for objects creation - cta::objectstore::AgentReference agentRef("unitTestCreateEnv"); + cta::objectstore::AgentReference agentRef("unitTestCreateEnv", dl); // Finish root creation. re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); rel.release(); @@ -499,7 +499,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { agent.setTimeout_us(0); agent.insertAndRegisterSelf(); // Create an agent to garbage be collected - cta::objectstore::AgentReference agrA("unitTestAgentA"); + cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); @@ -601,7 +601,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { // Mark the other tape as disabled catalogue.addDisabledTape("Tape1"); // Create the garbage collector and run it twice. - cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector"); + cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); diff --git a/objectstore/RetrieveQueueTest.cpp b/objectstore/RetrieveQueueTest.cpp index 964c35acdf..d0c6f165cf 100644 --- a/objectstore/RetrieveQueueTest.cpp +++ b/objectstore/RetrieveQueueTest.cpp @@ -20,12 +20,14 @@ #include "RetrieveQueue.hpp" #include "BackendVFS.hpp" #include "AgentReference.hpp" +#include "common/log/DummyLogger.hpp" namespace unitTests { TEST(ObjectStore, RetrieveQueueBasicAccess) { cta::objectstore::BackendVFS be; - cta::objectstore::AgentReference agentRef("unitTest"); + cta::log::DummyLogger dl("dummyLogger"); + cta::objectstore::AgentReference agentRef("unitTest", dl); std::string retrieveQueueAddress = agentRef.nextId("RetrieveQueue"); { // Try to create the tape entry diff --git a/objectstore/RootEntryTest.cpp b/objectstore/RootEntryTest.cpp index 55d8cd2537..ba47ab8cdf 100644 --- a/objectstore/RootEntryTest.cpp +++ b/objectstore/RootEntryTest.cpp @@ -25,6 +25,7 @@ #include "AgentReference.hpp" #include "AgentRegister.hpp" #include "ArchiveQueue.hpp" +#include "common/log/DummyLogger.hpp" namespace unitTests { @@ -50,7 +51,8 @@ TEST(ObjectStore, RootEntryBasicAccess) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock (re); // Create an agent - cta::objectstore::AgentReference agentRef("unitTest"); + cta::log::DummyLogger dl("dummyLogger"); + cta::objectstore::AgentReference agentRef("unitTest", dl); cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); re.fetch(); cta::objectstore::EntryLogSerDeser el("user0", @@ -71,9 +73,10 @@ TEST(ObjectStore, RootEntryBasicAccess) { TEST (ObjectStore, RootEntryArchiveQueues) { cta::objectstore::BackendVFS be; - cta::objectstore::EntryLogSerDeser el("user0", - "unittesthost", time(NULL)); - cta::objectstore::AgentReference agr("UnitTests"); + cta::objectstore::EntryLogSerDeser el("user0", + "unittesthost", time(NULL)); + cta::log::DummyLogger dl("dummyLogger"); + cta::objectstore::AgentReference agr("UnitTests", dl); cta::objectstore::Agent ag(agr.getAgentAddress(), be); ag.initialize(); { @@ -137,9 +140,10 @@ TEST (ObjectStore, RootEntryDriveRegister) { re.initialize(); re.insert(); } - cta::objectstore::EntryLogSerDeser el("user0", - "unittesthost", time(NULL)); - cta::objectstore::AgentReference agr("UnitTests"); + cta::objectstore::EntryLogSerDeser el("user0", + "unittesthost", time(NULL)); + cta::log::DummyLogger dl("dummyLogger"); + cta::objectstore::AgentReference agr("UnitTests", dl); cta::objectstore::Agent ag(agr.getAgentAddress(), be); ag.initialize(); { @@ -191,9 +195,10 @@ TEST(ObjectStore, RootEntryAgentRegister) { re.initialize(); re.insert(); } - cta::objectstore::EntryLogSerDeser el("user0", - "unittesthost", time(NULL)); - cta::objectstore::AgentReference agr("UnitTests"); + cta::objectstore::EntryLogSerDeser el("user0", + "unittesthost", time(NULL)); + cta::log::DummyLogger dl("dummyLogger"); + cta::objectstore::AgentReference agr("UnitTests", dl); cta::objectstore::Agent ag(agr.getAgentAddress(), be); ag.initialize(); std::string arAddr; @@ -239,9 +244,10 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) { re.initialize(); re.insert(); } - cta::objectstore::EntryLogSerDeser el("user0", - "unittesthost", time(NULL)); - cta::objectstore::AgentReference agr("UnitTests"); + cta::objectstore::EntryLogSerDeser el("user0", + "unittesthost", time(NULL)); + cta::log::DummyLogger dl("dummyLogger"); + cta::objectstore::AgentReference agr("UnitTests", dl); cta::objectstore::Agent ag(agr.getAgentAddress(), be); ag.initialize(); { diff --git a/objectstore/cta-objectstore-collect-orphaned-object.cpp b/objectstore/cta-objectstore-collect-orphaned-object.cpp index 3345302244..1108f2977e 100644 --- a/objectstore/cta-objectstore-collect-orphaned-object.cpp +++ b/objectstore/cta-objectstore-collect-orphaned-object.cpp @@ -73,7 +73,7 @@ int main(int argc, char ** argv) { std::cout << "Object address: " << go.getAddressIfSet() << std::endl; go.fetch(); // Create an AgentReference in case we need it - cta::objectstore::AgentReference agr("cta-objectstore-collect-orphaned-object"); + cta::objectstore::AgentReference agr("cta-objectstore-collect-orphaned-object", sl); cta::objectstore::Agent ag(agr.getAgentAddress(), *be); ag.initialize(); ag.insertAndRegisterSelf(); diff --git a/objectstore/cta-objectstore-initialize.cpp b/objectstore/cta-objectstore-initialize.cpp index 993e044572..53e4af31d4 100644 --- a/objectstore/cta-objectstore-initialize.cpp +++ b/objectstore/cta-objectstore-initialize.cpp @@ -27,6 +27,7 @@ #include "RootEntry.hpp" #include "Agent.hpp" #include "AgentReference.hpp" +#include "common/log/StdoutLogger.hpp" #include <iostream> #include <stdexcept> @@ -51,7 +52,8 @@ int main(int argc, char ** argv) { re.insert(); cta::objectstore::ScopedExclusiveLock rel(re); re.fetch(); - cta::objectstore::AgentReference agr("cta-objectstore-initialize"); + cta::log::StdoutLogger logger("cta-objectstore-initialize"); + cta::objectstore::AgentReference agr("cta-objectstore-initialize", logger); cta::objectstore::Agent ag(agr.getAgentAddress(), *be); ag.initialize(); cta::objectstore::EntryLogSerDeser el("user0", "systemhost", time(NULL)); diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp index 8c10b22943..2590c01657 100644 --- a/scheduler/OStoreDB/OStoreDBFactory.hpp +++ b/scheduler/OStoreDB/OStoreDBFactory.hpp @@ -176,7 +176,7 @@ OStoreDBWrapper<cta::objectstore::BackendVFS>::OStoreDBWrapper( const std::string &context, const std::string &URL) : m_backend(new cta::objectstore::BackendVFS()), m_logger(new cta::log::DummyLogger("")), m_catalogue(new cta::catalogue::DummyCatalogue(*m_logger)), -m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFactory") { +m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFactory", *m_logger) { // We need to populate the root entry before using. objectstore::RootEntry re(*m_backend); re.initialize(); @@ -202,7 +202,7 @@ OStoreDBWrapper<cta::objectstore::BackendRados>::OStoreDBWrapper( const std::string &context, const std::string &URL) : m_backend(cta::objectstore::BackendFactory::createBackend(URL).release()), m_logger(new cta::log::DummyLogger("")), m_catalogue(new cta::catalogue::DummyCatalogue(*m_logger)), -m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFactory") { +m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFactory", *m_logger) { // We need to first clean up possible left overs in the pool auto l = m_backend->list(); for (auto o=l.begin(); o!=l.end(); o++) { -- GitLab