diff --git a/common/log/LogContext.hpp b/common/log/LogContext.hpp index 92be7db1151b9f02a52c96bf42f829d626ebd1e2..795fd214ec37a0ffaacfcff7df45f1d516d13146 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 50a52172b89db0cd99342ed203d437d1470d5a56..8f4de09f19f8f3df9a7b8ba93817e45b1b0927c6 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 87199c641cfe449698b54c53ea5f0b7eeb7dcd08..3da1855d6c44b16eb13ac479f532a0a14e2cef4a 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 a23b2e4517a4a75323e1690bffa5733b079f36b8..ab56b2c0411c97410e1d0359482786d2a4cafbb6 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 507955e0cff565e1193566316b7123a1a03404f4..48ebb1f25c825d4e0ca14d3ea485026b1d545ee8 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 964c35acdff4d25bc66290a44384bef0f66825ba..d0c6f165cf8f7fc5fba10d0ff3b4b917a0a767b2 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 55d8cd253712922cb438b5626f66f4aba6abd74d..ba47ab8cdfdba6c851a0fd046dc9030822dcb074 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 334530224454541d1f004c93ad0240a225079c84..1108f2977ef6a76748e2af91426a3d354bf9fa34 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 993e044572db392854a4b0735947218558aeb071..53e4af31d4c0b5eec217b74c15f731a5cac40996 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 8c10b2294340059ef24ca345363b9dd74595adb7..2590c016577f0d1460ff2f75042d54a6f88d1d98 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++) {