From 34f0262288aa6e9f52de8d29f93ea8d565733c40 Mon Sep 17 00:00:00 2001 From: Eric Cano <Eric.Cano@cern.ch> Date: Tue, 7 Nov 2017 16:56:10 +0100 Subject: [PATCH] Added logging of all objects removal. Some typo fixes. --- objectstore/Agent.cpp | 2 +- objectstore/Agent.hpp | 2 +- objectstore/AgentRegister.cpp | 4 +- objectstore/ArchiveQueue.cpp | 2 +- objectstore/ArchiveRequest.cpp | 2 +- objectstore/BackendPopulator.cpp | 5 +- objectstore/DriveRegister.cpp | 3 + objectstore/DriveState.cpp | 3 + objectstore/GarbageCollectorTest.cpp | 72 +++++++++---------- objectstore/Helpers.cpp | 2 +- objectstore/RetrieveQueue.cpp | 7 +- objectstore/RetrieveQueue.hpp | 2 +- objectstore/RetrieveQueueTest.cpp | 3 +- objectstore/RetrieveRequest.cpp | 9 ++- objectstore/RetrieveRequest.hpp | 4 +- objectstore/RootEntry.cpp | 48 ++++++++++--- objectstore/RootEntry.hpp | 19 +++-- objectstore/RootEntryTest.cpp | 53 +++++++------- objectstore/SchedulerGlobalLock.cpp | 3 + ...ta-objectstore-collect-orphaned-object.cpp | 2 +- objectstore/cta-objectstore-initialize.cpp | 5 +- scheduler/OStoreDB/OStoreDB.cpp | 31 +++++--- scheduler/OStoreDB/OStoreDB.hpp | 2 +- scheduler/OStoreDB/OStoreDBFactory.hpp | 10 +-- scheduler/SchedulerDatabase.hpp | 2 +- 25 files changed, 179 insertions(+), 118 deletions(-) diff --git a/objectstore/Agent.cpp b/objectstore/Agent.cpp index 679ba05743..8653aab3de 100644 --- a/objectstore/Agent.cpp +++ b/objectstore/Agent.cpp @@ -47,7 +47,7 @@ void cta::objectstore::Agent::initialize() { m_payloadInterpreted = true; } -void cta::objectstore::Agent::insertAndRegisterSelf() { +void cta::objectstore::Agent::insertAndRegisterSelf(log::LogContext & lc) { // We suppose initialize was already called, and that the agent name // is set. // We need to get hold of the agent register, which we suppose is available diff --git a/objectstore/Agent.hpp b/objectstore/Agent.hpp index 67b45820f3..61ddcd080d 100644 --- a/objectstore/Agent.hpp +++ b/objectstore/Agent.hpp @@ -50,7 +50,7 @@ public: void initialize(); - void insertAndRegisterSelf(); + void insertAndRegisterSelf(log::LogContext & lc); void removeAndUnregisterSelf(log::LogContext & lc); diff --git a/objectstore/AgentRegister.cpp b/objectstore/AgentRegister.cpp index 6febd1f85f..433006ce5e 100644 --- a/objectstore/AgentRegister.cpp +++ b/objectstore/AgentRegister.cpp @@ -47,10 +47,10 @@ void cta::objectstore::AgentRegister::garbageCollect(const std::string &presumed if (!isEmpty()) { throw (NotEmpty("Trying to garbage collect a non-empty AgentRegister: internal error")); } + remove(); log::ScopedParamContainer params(lc); params.add("agentRegisterObject", getAddressIfSet()); - lc.log(log::INFO, "In AgentRegister::garbageCollect(): Garbage collected and moved agent register object."); - remove(); + lc.log(log::INFO, "In AgentRegister::garbageCollect(): Garbage collected and removed agent register object."); } diff --git a/objectstore/ArchiveQueue.cpp b/objectstore/ArchiveQueue.cpp index 313ff38258..57fef41d6e 100644 --- a/objectstore/ArchiveQueue.cpp +++ b/objectstore/ArchiveQueue.cpp @@ -131,7 +131,7 @@ void ArchiveQueue::garbageCollect(const std::string &presumedOwner, AgentReferen remove(); log::ScopedParamContainer params(lc); params.add("archiveQueueObject", getAddressIfSet()); - lc.log(log::INFO, "In ArchiveQueue::garbageCollect(): Garbage collected and moved archive queue object."); + lc.log(log::INFO, "In ArchiveQueue::garbageCollect(): Garbage collected and removed archive queue object."); } void ArchiveQueue::setTapePool(const std::string& name) { diff --git a/objectstore/ArchiveRequest.cpp b/objectstore/ArchiveRequest.cpp index 2741808ec0..0d509cb72a 100644 --- a/objectstore/ArchiveRequest.cpp +++ b/objectstore/ArchiveRequest.cpp @@ -566,7 +566,7 @@ bool ArchiveRequest::finishIfNecessary(log::LogContext & lc) { remove(); log::ScopedParamContainer params(lc); params.add("archiveRequestObject", getAddressIfSet()); - lc.log(log::INFO, "In ArchiveRequest::finishIfNecessary(): Removing completed request."); + lc.log(log::INFO, "In ArchiveRequest::finishIfNecessary(): Removed completed request."); return true; } diff --git a/objectstore/BackendPopulator.cpp b/objectstore/BackendPopulator.cpp index 95f5067d6b..8576fcb3b8 100644 --- a/objectstore/BackendPopulator.cpp +++ b/objectstore/BackendPopulator.cpp @@ -32,17 +32,18 @@ BackendPopulator::BackendPopulator(cta::objectstore::Backend & be, re.fetchNoLock(); cta::objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL)); // We might have to create the agent register (but this is unlikely) + log::LogContext lc2(lc); try { re.getAgentRegisterAddress(); } catch (...) { RootEntry re2(m_backend); ScopedExclusiveLock rel(re2); re2.fetch(); - re2.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl); + re2.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl, lc2); } Agent agent(m_agentReference.getAgentAddress(), m_backend); agent.initialize(); - agent.insertAndRegisterSelf(); + agent.insertAndRegisterSelf(lc2); // Likewise, make sure the drive register is around. try { re.getDriveRegisterAddress(); diff --git a/objectstore/DriveRegister.cpp b/objectstore/DriveRegister.cpp index dc8ca4558b..5fb36acd46 100644 --- a/objectstore/DriveRegister.cpp +++ b/objectstore/DriveRegister.cpp @@ -98,6 +98,9 @@ void DriveRegister::garbageCollect(const std::string &presumedOwner, AgentRefere throw (NotEmpty("Trying to garbage collect a non-empty AgentRegister: internal error")); } remove(); + log::ScopedParamContainer params(lc); + params.add("driveRegisterObject", getAddressIfSet()); + lc.log(log::INFO, "In DriveRegister::garbageCollect(): Garbage collected and removed drive register object."); } //------------------------------------------------------------------------------ diff --git a/objectstore/DriveState.cpp b/objectstore/DriveState.cpp index 000ef415a9..4ee44117dc 100644 --- a/objectstore/DriveState.cpp +++ b/objectstore/DriveState.cpp @@ -35,6 +35,9 @@ void DriveState::garbageCollect(const std::string& presumedOwner, AgentReference if (presumedOwner != m_header.owner()) return; remove(); + log::ScopedParamContainer params(lc); + params.add("driveStateObject", getAddressIfSet()); + lc.log(log::INFO, "In DriveState::garbageCollect(): Garbage collected and removed drive state object."); } void DriveState::initialize(const std::string & driveName) { diff --git a/objectstore/GarbageCollectorTest.cpp b/objectstore/GarbageCollectorTest.cpp index 14ea0a465e..5b3e6edbc9 100644 --- a/objectstore/GarbageCollectorTest.cpp +++ b/objectstore/GarbageCollectorTest.cpp @@ -59,7 +59,7 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) { cta::objectstore::EntryLogSerDeser el("user0", "unittesthost", time(NULL)); cta::objectstore::ScopedExclusiveLock rel(re); - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); rel.release(); // Create 2 agents, A and B and register them // The agents are set with a timeout of 0, so they will be delclared @@ -68,16 +68,16 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) { cta::objectstore::Agent agA(agrA.getAgentAddress(), be), agB(agrB.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); - agA.insertAndRegisterSelf(); + agA.insertAndRegisterSelf(lc); agB.initialize(); agB.setTimeout_us(0); - agB.insertAndRegisterSelf(); + agB.insertAndRegisterSelf(lc); // Create the garbage colletor and run it twice. cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl); cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); - gcAgent.insertAndRegisterSelf(); + gcAgent.insertAndRegisterSelf(lc); { cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue); gc.runOnePass(lc); @@ -90,8 +90,8 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) { // We should not be able to remove the agent register (as it should be empty) rel.lock(re); re.fetch(); - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); - ASSERT_NO_THROW(re.removeIfEmpty()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); + ASSERT_NO_THROW(re.removeIfEmpty(lc)); } TEST(ObjectStore, GarbageCollectorRegister) { @@ -111,14 +111,14 @@ TEST(ObjectStore, GarbageCollectorRegister) { cta::objectstore::EntryLogSerDeser el("user0", "unittesthost", time(NULL)); cta::objectstore::ScopedExclusiveLock rel(re); - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); rel.release(); // Create an agent and add and agent register to it as an owned object cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); - agA.insertAndRegisterSelf(); + agA.insertAndRegisterSelf(lc); // Create a new agent register, owned by agA (by hand as it is not an usual // situation) std::string arName; @@ -135,7 +135,7 @@ TEST(ObjectStore, GarbageCollectorRegister) { cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); - gcAgent.insertAndRegisterSelf(); + gcAgent.insertAndRegisterSelf(lc); { cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue); gc.runOnePass(lc); @@ -149,8 +149,8 @@ TEST(ObjectStore, GarbageCollectorRegister) { // We should not be able to remove the agent register (as it should be empty) rel.lock(re); re.fetch(); - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); - ASSERT_NO_THROW(re.removeIfEmpty()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); + ASSERT_NO_THROW(re.removeIfEmpty(lc)); } TEST(ObjectStore, GarbageCollectorArchiveQueue) { @@ -171,14 +171,14 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) { cta::objectstore::EntryLogSerDeser el("user0", "unittesthost", time(NULL)); cta::objectstore::ScopedExclusiveLock rel(re); - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); rel.release(); // Create an agent and add and agent register to it as an owned object cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); - agA.insertAndRegisterSelf(); + agA.insertAndRegisterSelf(lc); // Create a new agent register, owned by agA (by hand as it is not an usual // situation) std::string tpName; @@ -195,7 +195,7 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) { cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); - gcAgent.insertAndRegisterSelf(); + gcAgent.insertAndRegisterSelf(lc); { cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue); gc.runOnePass(lc); @@ -209,8 +209,8 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) { // We should not be able to remove the agent register (as it should be empty) rel.lock(re); re.fetch(); - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); - ASSERT_NO_THROW(re.removeIfEmpty()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); + ASSERT_NO_THROW(re.removeIfEmpty(lc)); } TEST(ObjectStore, GarbageCollectorDriveRegister) { @@ -231,14 +231,14 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) { cta::objectstore::EntryLogSerDeser el("user0", "unittesthost", time(NULL)); cta::objectstore::ScopedExclusiveLock rel(re); - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); rel.release(); // Create an agent and add the drive register to it as an owned object cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); - agA.insertAndRegisterSelf(); + agA.insertAndRegisterSelf(lc); // Create a new drive register, owned by agA (by hand as it is not an usual // situation) std::string tpName; @@ -255,7 +255,7 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) { cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); - gcAgent.insertAndRegisterSelf(); + gcAgent.insertAndRegisterSelf(lc); { cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue); gc.runOnePass(lc); @@ -269,8 +269,8 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) { // We should not be able to remove the agent register (as it should be empty) rel.lock(re); re.fetch(); - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); - ASSERT_NO_THROW(re.removeIfEmpty()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); + ASSERT_NO_THROW(re.removeIfEmpty(lc)); } TEST(ObjectStore, GarbageCollectorArchiveRequest) { @@ -296,19 +296,19 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { // Create the agent for objects creation cta::objectstore::AgentReference agentRef("unitTestCreateEnv", dl); // Finish root creation. - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); rel.release(); // continue agent creation. cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); agent.initialize(); agent.setTimeout_us(0); - agent.insertAndRegisterSelf(); + agent.insertAndRegisterSelf(lc); // Create an agent to garbage collected cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); - agA.insertAndRegisterSelf(); + agA.insertAndRegisterSelf(lc); // Several use cases are present for the ArchiveRequests: // - just referenced in agent ownership list, but not yet created. // - just created but not linked to any tape pool @@ -325,7 +325,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { re.fetch(); std::stringstream tapePoolName; tapePoolName << "TapePool" << i; - tpAddr[i] = re.addOrGetArchiveQueueAndCommit(tapePoolName.str(), agentRef); + tpAddr[i] = re.addOrGetArchiveQueueAndCommit(tapePoolName.str(), agentRef, lc); cta::objectstore::ArchiveQueue aq(tpAddr[i], be); } // Create the various ATFR's, stopping one step further each time. @@ -419,7 +419,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); - gcAgent.insertAndRegisterSelf(); + gcAgent.insertAndRegisterSelf(lc); { cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue); gc.runOnePass(lc); @@ -460,11 +460,11 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) { aq.commit(); aql.release(); // Remove queues from root - re.removeArchiveQueueAndCommit(tp); + re.removeArchiveQueueAndCommit(tp, lc); } - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); - ASSERT_NO_THROW(re.removeIfEmpty()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); + ASSERT_NO_THROW(re.removeIfEmpty(lc)); // TODO: this unit test still leaks tape pools and requests } @@ -491,19 +491,19 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { // Create the agent for objects creation cta::objectstore::AgentReference agentRef("unitTestCreateEnv", dl); // Finish root creation. - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); rel.release(); // continue agent creation. cta::objectstore::Agent agent(agentRef.getAgentAddress(), be); agent.initialize(); agent.setTimeout_us(0); - agent.insertAndRegisterSelf(); + agent.insertAndRegisterSelf(lc); // Create an agent to garbage be collected cta::objectstore::AgentReference agrA("unitTestAgentA", dl); cta::objectstore::Agent agA(agrA.getAgentAddress(), be); agA.initialize(); agA.setTimeout_us(0); - agA.insertAndRegisterSelf(); + agA.insertAndRegisterSelf(lc); // Several use cases are present for the RetrieveRequests: // - just referenced in agent ownership list, but not yet created. // - just created but not linked to any tape @@ -605,7 +605,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be); gcAgent.initialize(); gcAgent.setTimeout_us(0); - gcAgent.insertAndRegisterSelf(); + gcAgent.insertAndRegisterSelf(lc); { cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue); gc.runOnePass(lc); @@ -641,11 +641,11 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { rq.commit(); rql.release(); // Remove queues from root - re.removeRetrieveQueueAndCommit(vid); + re.removeRetrieveQueueAndCommit(vid, lc); } - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); - ASSERT_NO_THROW(re.removeIfEmpty()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); + ASSERT_NO_THROW(re.removeIfEmpty(lc)); // TODO: this unit test still leaks tape pools and requests } diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp index c59e20bd61..29aa3150ef 100644 --- a/objectstore/Helpers.cpp +++ b/objectstore/Helpers.cpp @@ -62,7 +62,7 @@ void Helpers::getLockedAndFetchedQueue<ArchiveQueue>(ArchiveQueue& archiveQueue, rootRelockExclusiveTime = t.secs(utils::Timer::resetCounter); re.fetch(); rootRefetchTime = t.secs(utils::Timer::resetCounter); - archiveQueue.setAddress(re.addOrGetArchiveQueueAndCommit(tapePool, agentReference)); + archiveQueue.setAddress(re.addOrGetArchiveQueueAndCommit(tapePool, agentReference, lc)); addOrGetQueueandCommitTime = t.secs(utils::Timer::resetCounter); } } diff --git a/objectstore/RetrieveQueue.cpp b/objectstore/RetrieveQueue.cpp index 18d98f4d98..9caeb93a6d 100644 --- a/objectstore/RetrieveQueue.cpp +++ b/objectstore/RetrieveQueue.cpp @@ -73,12 +73,15 @@ bool cta::objectstore::RetrieveQueue::isEmpty() { return !m_payload.retrievejobs_size(); } -void cta::objectstore::RetrieveQueue::removeIfEmpty() { +void cta::objectstore::RetrieveQueue::removeIfEmpty(log::LogContext & lc) { checkPayloadWritable(); if (!isEmpty()) { - throw NotEmpty("In TapeQueue::removeIfEmpty: trying to remove an tape with retrieves queued"); + throw NotEmpty("In RetrieveQueue::removeIfEmpty: trying to remove an tape with retrieves queued"); } remove(); + log::ScopedParamContainer params(lc); + params.add("retrieveQueueObject", getAddressIfSet()); + lc.log(log::INFO, "In RetrieveQueue::removeIfEmpty(): removed the queue."); } std::string cta::objectstore::RetrieveQueue::getVid() { diff --git a/objectstore/RetrieveQueue.hpp b/objectstore/RetrieveQueue.hpp index 825bc7c618..e816303a72 100644 --- a/objectstore/RetrieveQueue.hpp +++ b/objectstore/RetrieveQueue.hpp @@ -41,7 +41,7 @@ public: cta::catalogue::Catalogue & catalogue) override; bool isEmpty(); CTA_GENERATE_EXCEPTION_CLASS(NotEmpty); - void removeIfEmpty(); + void removeIfEmpty(log::LogContext & lc); std::string dump(); // Retrieve jobs management ================================================== diff --git a/objectstore/RetrieveQueueTest.cpp b/objectstore/RetrieveQueueTest.cpp index d0c6f165cf..fff8a3fb84 100644 --- a/objectstore/RetrieveQueueTest.cpp +++ b/objectstore/RetrieveQueueTest.cpp @@ -27,6 +27,7 @@ namespace unitTests { TEST(ObjectStore, RetrieveQueueBasicAccess) { cta::objectstore::BackendVFS be; cta::log::DummyLogger dl("dummyLogger"); + cta::log::LogContext lc(dl); cta::objectstore::AgentReference agentRef("unitTest", dl); std::string retrieveQueueAddress = agentRef.nextId("RetrieveQueue"); { @@ -47,7 +48,7 @@ TEST(ObjectStore, RetrieveQueueBasicAccess) { cta::objectstore::RetrieveQueue rq(retrieveQueueAddress, be); cta::objectstore::ScopedExclusiveLock lock(rq); rq.fetch(); - rq.removeIfEmpty(); + rq.removeIfEmpty(lc); ASSERT_FALSE(rq.exists()); } } \ No newline at end of file diff --git a/objectstore/RetrieveRequest.cpp b/objectstore/RetrieveRequest.cpp index fcdd7f3211..2848739e28 100644 --- a/objectstore/RetrieveRequest.cpp +++ b/objectstore/RetrieveRequest.cpp @@ -314,7 +314,7 @@ auto RetrieveRequest::getJobs() -> std::list<JobDump> { return ret; } -bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId) { +bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId, log::LogContext & lc) { checkPayloadWritable(); auto * jl = m_payload.mutable_jobs(); // Find the job and update the number of failures @@ -332,7 +332,7 @@ bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId) { } if (j.totalretries() >= j.maxtotalretries()) { j.set_status(serializers::RJS_Failed); - return finishIfNecessary(); + return finishIfNecessary(lc); } else { j.set_status(serializers::RJS_Pending); return false; @@ -341,7 +341,7 @@ bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId) { throw NoSuchJob ("In RetrieveRequest::addJobFailure(): could not find job"); } -bool RetrieveRequest::finishIfNecessary() { +bool RetrieveRequest::finishIfNecessary(log::LogContext & lc) { checkPayloadWritable(); // This function is typically called after changing the status of one job // in memory. If the request is complete, we will just remove it. @@ -354,6 +354,9 @@ bool RetrieveRequest::finishIfNecessary() { if (!finishedStatuses.count(j.status())) return false; remove(); + log::ScopedParamContainer params(lc); + params.add("retrieveRequestObject", getAddressIfSet()); + lc.log(log::INFO, "In RetrieveRequest::finishIfNecessary(): removed finished retrieve request."); return true; } diff --git a/objectstore/RetrieveRequest.hpp b/objectstore/RetrieveRequest.hpp index 2e8efbed04..20211b20ff 100644 --- a/objectstore/RetrieveRequest.hpp +++ b/objectstore/RetrieveRequest.hpp @@ -68,9 +68,9 @@ public: AsyncJobDeleter * asyncDeleteJob(); JobDump getJob(uint16_t copyNb); std::list<JobDump> getJobs(); - bool addJobFailure(uint16_t copyNumber, uint64_t mountId); /**< Returns true is the request is completely failed + bool addJobFailure(uint16_t copyNumber, uint64_t mountId, log::LogContext & lc); /**< Returns true is the request is completely failed (telling wheather we should requeue or not). */ - bool finishIfNecessary(); /**< Handling of the consequences of a job status change for the entire request. + bool finishIfNecessary(log::LogContext & lc); /**< Handling of the consequences of a job status change for the entire request. * This function returns true if the request got finished. */ serializers::RetrieveJobStatus getJobStatus(uint16_t copyNumber); // Mark all jobs as pending mount (following their linking to a tape pool) diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp index bbf006e201..ac94e580c5 100644 --- a/objectstore/RootEntry.cpp +++ b/objectstore/RootEntry.cpp @@ -74,12 +74,15 @@ bool RootEntry::isEmpty() { return true; } -void RootEntry::removeIfEmpty() { +void RootEntry::removeIfEmpty(log::LogContext & lc) { checkPayloadWritable(); if (!isEmpty()) { throw NotEmpty("In RootEntry::removeIfEmpty(): root entry not empty"); } remove(); + log::ScopedParamContainer params(lc); + params.add("rootObjectName", getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeIfEmpty(): removed root entry."); } void RootEntry::garbageCollect(const std::string& presumedOwner, AgentReference & agentReference, log::LogContext & lc, @@ -102,7 +105,7 @@ namespace { } } -std::string RootEntry::addOrGetArchiveQueueAndCommit(const std::string& tapePool, AgentReference& agentRef) { +std::string RootEntry::addOrGetArchiveQueueAndCommit(const std::string& tapePool, AgentReference& agentRef, log::LogContext & lc) { checkPayloadWritable(); // Check the archive queue does not already exist try { @@ -134,7 +137,7 @@ std::string RootEntry::addOrGetArchiveQueueAndCommit(const std::string& tapePool return archiveQueueAddress; } -void RootEntry::removeArchiveQueueAndCommit(const std::string& tapePool) { +void RootEntry::removeArchiveQueueAndCommit(const std::string& tapePool, log::LogContext & lc) { checkPayloadWritable(); // find the address of the archive queue object try { @@ -171,6 +174,11 @@ void RootEntry::removeArchiveQueueAndCommit(const std::string& tapePool) { } // We can delete the queue aq.remove(); + { + log::ScopedParamContainer params(lc); + params.add("archiveQueueObject", aq.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeArchiveQueueAndCommit(): removed archive queue."); + } deleteFromRootEntry: // ... and remove it from our entry serializers::removeOccurences(m_payload.mutable_archivequeuepointers(), tapePool); @@ -258,7 +266,7 @@ void RootEntry::removeMissingRetrieveQueueReference(const std::string& vid) { serializers::removeOccurences(m_payload.mutable_retrievequeuepointers(), vid); } -void RootEntry::removeRetrieveQueueAndCommit(const std::string& vid) { +void RootEntry::removeRetrieveQueueAndCommit(const std::string& vid, log::LogContext & lc) { checkPayloadWritable(); // find the address of the retrieve queue object try { @@ -295,6 +303,11 @@ void RootEntry::removeRetrieveQueueAndCommit(const std::string& vid) { } // We can now delete the queue rq.remove(); + { + log::ScopedParamContainer params(lc); + params.add("retrieveQueueObject", rq.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeRetrieveQueueAndCommit(): removed retrieve queue."); + } deleteFromRootEntry: // ... and remove it from our entry serializers::removeOccurences(m_payload.mutable_retrievequeuepointers(), vid); @@ -370,7 +383,7 @@ std::string RootEntry::addOrGetDriveRegisterPointerAndCommit( } } -void RootEntry::removeDriveRegisterAndCommit() { +void RootEntry::removeDriveRegisterAndCommit(log::LogContext & lc) { checkPayloadWritable(); // Get the address of the drive register (nothing to do if there is none) if (!m_payload.has_driveregisterpointer() || @@ -387,6 +400,9 @@ void RootEntry::removeDriveRegisterAndCommit() { } // we can delete the drive register dr.remove(); + log::ScopedParamContainer params(lc); + params.add("driveRegisterObject", dr.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeDriveRegisterAndCommit(): removed drive register."); // And update the root entry m_payload.mutable_driveregisterpointer()->set_address(""); // We commit for safety and symmetry with the add operation @@ -418,7 +434,7 @@ std::string RootEntry::getAgentRegisterAddress() { // Get the name of a (possibly freshly created) agent register std::string RootEntry::addOrGetAgentRegisterPointerAndCommit(AgentReference& agentRef, - const EntryLogSerDeser & log) { + const EntryLogSerDeser & log, log::LogContext & lc) { // Check if the agent register exists try { return getAgentRegisterAddress(); @@ -435,7 +451,7 @@ std::string RootEntry::addOrGetAgentRegisterPointerAndCommit(AgentReference& age // decide on the object's name std::string arAddress (agentRef.nextId("AgentRegister")); // Record the agent registry in our own intent - addIntendedAgentRegistry(arAddress); + addIntendedAgentRegistry(arAddress, lc); commit(); // Create the agent registry AgentRegister ar(arAddress, m_objectStore); @@ -463,7 +479,7 @@ std::string RootEntry::addOrGetAgentRegisterPointerAndCommit(AgentReference& age } } -void RootEntry::removeAgentRegisterAndCommit() { +void RootEntry::removeAgentRegisterAndCommit(log::LogContext & lc) { checkPayloadWritable(); // Check that we do have an agent register set. Cleanup a potential intent as // well @@ -479,6 +495,9 @@ void RootEntry::removeAgentRegisterAndCommit() { "a non-empty intended agent register. Internal error."); } iar.remove(); + log::ScopedParamContainer params(lc); + params.add("agentRegisterObject", iar.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeAgentRegisterAndCommit(): removed agent register"); m_payload.set_agentregisterintent(""); commit(); } @@ -493,12 +512,15 @@ void RootEntry::removeAgentRegisterAndCommit() { "register is not empty. Cannot remove."); } ar.remove(); + log::ScopedParamContainer params(lc); + params.add("agentRegisterObject", ar.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeAgentRegisterAndCommit(): removed agent register."); m_payload.mutable_agentregisterpointer()->set_address(""); commit(); } } -void RootEntry::addIntendedAgentRegistry(const std::string& address) { +void RootEntry::addIntendedAgentRegistry(const std::string& address, log::LogContext & lc) { checkPayloadWritable(); // We are supposed to have only one intended agent registry at a time. // If we got the lock and there is one entry, this means the previous @@ -525,6 +547,9 @@ void RootEntry::addIntendedAgentRegistry(const std::string& address) { "found a non-empty intended agent register. Internal Error."); } iar.remove(); + log::ScopedParamContainer params (lc); + params.add("agentRegisterObject", iar.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::addIntendedAgentRegistry(): removed agent register."); } } m_payload.set_agentregisterintent(address); @@ -577,7 +602,7 @@ std::string RootEntry::addOrGetSchedulerGlobalLockAndCommit(AgentReference& agen } } -void RootEntry::removeSchedulerGlobalLockAndCommit() { +void RootEntry::removeSchedulerGlobalLockAndCommit(log::LogContext & lc) { checkPayloadWritable(); // Get the address of the scheduler lock (nothing to do if there is none) if (!m_payload.has_schedulerlockpointer() || @@ -594,6 +619,9 @@ void RootEntry::removeSchedulerGlobalLockAndCommit() { } // we can delete the drive register sgl.remove(); + log::ScopedParamContainer params(lc); + params.add("schedulerGlobalLockObject", sgl.getAddressIfSet()); + lc.log(log::INFO, "In RootEntry::removeSchedulerGlobalLockAndCommit(): removed scheduler global lock object."); // And update the root entry m_payload.mutable_schedulerlockpointer()->set_address(""); // We commit for safety and symmetry with the add operation diff --git a/objectstore/RootEntry.hpp b/objectstore/RootEntry.hpp index 86deabaf82..afbf302917 100644 --- a/objectstore/RootEntry.hpp +++ b/objectstore/RootEntry.hpp @@ -52,7 +52,7 @@ public: bool isEmpty(); // Safe remover - void removeIfEmpty(); + void removeIfEmpty(log::LogContext & lc); // Garbage collection (disallowed for root entry). void garbageCollect(const std::string &presumedOwner, AgentReference & agentReference, log::LogContext & lc, @@ -63,11 +63,11 @@ public: CTA_GENERATE_EXCEPTION_CLASS(WrongArchiveQueue); /** This function implicitly creates the archive queue structure and updates * the pointer to it. It will implicitly commit the object to the store. */ - std::string addOrGetArchiveQueueAndCommit(const std::string & tapePool, AgentReference & agentRef); + std::string addOrGetArchiveQueueAndCommit(const std::string & tapePool, AgentReference & agentRef, log::LogContext & lc); /** This function implicitly deletes the tape pool structure. * Fails if it not empty*/ CTA_GENERATE_EXCEPTION_CLASS(NoSuchArchiveQueue); - void removeArchiveQueueAndCommit(const std::string & tapePool); + void removeArchiveQueueAndCommit(const std::string & tapePool, log::LogContext & lc); /** This function is used in a cleanup utility. Removes unconditionally the reference to the archive queue */ void removeMissingArchiveQueueReference(const std::string & tapePool); void removeArchiveQueueIfAddressMatchesAndCommit(const std::string & tapePool, const std::string & archiveQueueAddress); @@ -86,7 +86,7 @@ public: /** This function is used in a cleanup utility. Removes unconditionally the reference to the retrieve queue */ void removeMissingRetrieveQueueReference(const std::string & address); CTA_GENERATE_EXCEPTION_CLASS(NoSuchRetrieveQueue); - void removeRetrieveQueueAndCommit(const std::string & vid); + void removeRetrieveQueueAndCommit(const std::string & vid, log::LogContext & lc); std::string getRetrieveQueueAddress(const std::string & vid); struct RetrieveQueueDump { std::string vid; @@ -98,7 +98,7 @@ public: CTA_GENERATE_EXCEPTION_CLASS(DriveRegisterNotEmpty); std::string getDriveRegisterAddress(); std::string addOrGetDriveRegisterPointerAndCommit(AgentReference & agentRef, const EntryLogSerDeser & log); - void removeDriveRegisterAndCommit(); + void removeDriveRegisterAndCommit(log::LogContext & lc); // Agent register manipulations ============================================== CTA_GENERATE_EXCEPTION_CLASS(AgentRegisterNotEmpty); @@ -108,16 +108,16 @@ public: * log for tracking objects being created. We already use an agent here for * object name generation, but not yet tracking. */ std::string addOrGetAgentRegisterPointerAndCommit(AgentReference & agentRef, - const EntryLogSerDeser & log); - void removeAgentRegisterAndCommit(); + const EntryLogSerDeser & log, log::LogContext & lc); + void removeAgentRegisterAndCommit(log::LogContext & lc); // Agent register manipulations ============================================== std::string getSchedulerGlobalLock(); std::string addOrGetSchedulerGlobalLockAndCommit(AgentReference & agentRef, const EntryLogSerDeser & log); - void removeSchedulerGlobalLockAndCommit(); + void removeSchedulerGlobalLockAndCommit(log::LogContext & lc); private: - void addIntendedAgentRegistry(const std::string & address); + void addIntendedAgentRegistry(const std::string & address, log::LogContext & lc); public: // Dump the root entry @@ -126,4 +126,3 @@ public: }} - diff --git a/objectstore/RootEntryTest.cpp b/objectstore/RootEntryTest.cpp index 289f347784..989f062c63 100644 --- a/objectstore/RootEntryTest.cpp +++ b/objectstore/RootEntryTest.cpp @@ -31,6 +31,8 @@ namespace unitTests { TEST(ObjectStore, RootEntryBasicAccess) { cta::objectstore::BackendVFS be; + cta::log::DummyLogger dl("dummyLogger"); + cta::log::LogContext lc(dl); { // Try to create the root entry cta::objectstore::RootEntry re(be); @@ -57,7 +59,7 @@ TEST(ObjectStore, RootEntryBasicAccess) { re.fetch(); cta::objectstore::EntryLogSerDeser el("user0", "unittesthost", time(NULL)); - re.addOrGetAgentRegisterPointerAndCommit(agentRef, el); + re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc); ASSERT_NO_THROW(re.getAgentRegisterAddress()); re.commit(); //agent.registerSelf(); @@ -66,8 +68,8 @@ TEST(ObjectStore, RootEntryBasicAccess) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.removeAgentRegisterAndCommit(); - re.removeIfEmpty(); + re.removeAgentRegisterAndCommit(lc); + re.removeIfEmpty(lc); ASSERT_FALSE(re.exists()); } @@ -86,9 +88,9 @@ TEST (ObjectStore, RootEntryArchiveQueues) { re.initialize(); re.insert(); cta::objectstore::ScopedExclusiveLock rel(re); - re.addOrGetAgentRegisterPointerAndCommit(agr, el); + re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc); } - ag.insertAndRegisterSelf(); + ag.insertAndRegisterSelf(lc); std::string tpAddr1, tpAddr2; { // Create the tape pools @@ -97,7 +99,7 @@ TEST (ObjectStore, RootEntryArchiveQueues) { re.fetch(); ASSERT_THROW(re.getArchiveQueueAddress("tapePool1"), cta::objectstore::RootEntry::NoSuchArchiveQueue); - tpAddr1 = re.addOrGetArchiveQueueAndCommit("tapePool1", agr); + tpAddr1 = re.addOrGetArchiveQueueAndCommit("tapePool1", agr, lc); // Check that we car read it cta::objectstore::ArchiveQueue aq(tpAddr1, be); cta::objectstore::ScopedSharedLock aql(aq); @@ -108,7 +110,7 @@ TEST (ObjectStore, RootEntryArchiveQueues) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - tpAddr2 = re.addOrGetArchiveQueueAndCommit("tapePool2", agr); + tpAddr2 = re.addOrGetArchiveQueueAndCommit("tapePool2", agr, lc); ASSERT_TRUE(be.exists(tpAddr2)); } { @@ -116,7 +118,7 @@ TEST (ObjectStore, RootEntryArchiveQueues) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.removeArchiveQueueAndCommit("tapePool2"); + re.removeArchiveQueueAndCommit("tapePool2", lc); ASSERT_FALSE(be.exists(tpAddr2)); } // Unregister the agent @@ -126,10 +128,10 @@ TEST (ObjectStore, RootEntryArchiveQueues) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.removeAgentRegisterAndCommit(); - re.removeArchiveQueueAndCommit("tapePool1"); + re.removeAgentRegisterAndCommit(lc); + re.removeArchiveQueueAndCommit("tapePool1", lc); ASSERT_FALSE(be.exists(tpAddr1)); - re.removeIfEmpty(); + re.removeIfEmpty(lc); ASSERT_FALSE(re.exists()); } @@ -153,9 +155,9 @@ TEST (ObjectStore, RootEntryDriveRegister) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock rel(re); re.fetch(); - re.addOrGetAgentRegisterPointerAndCommit(agr, el); + re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc); } - ag.insertAndRegisterSelf(); + ag.insertAndRegisterSelf(lc); std::string driveRegisterAddress; { // create the drive register @@ -174,7 +176,7 @@ TEST (ObjectStore, RootEntryDriveRegister) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock rel(re); re.fetch(); - re.removeDriveRegisterAndCommit(); + re.removeDriveRegisterAndCommit(lc); ASSERT_FALSE(be.exists(driveRegisterAddress)); } // Unregister the agent @@ -184,8 +186,8 @@ TEST (ObjectStore, RootEntryDriveRegister) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.removeAgentRegisterAndCommit(); - re.removeIfEmpty(); + re.removeAgentRegisterAndCommit(lc); + re.removeIfEmpty(lc); ASSERT_FALSE(re.exists()); } @@ -200,6 +202,7 @@ TEST(ObjectStore, RootEntryAgentRegister) { cta::objectstore::EntryLogSerDeser el("user0", "unittesthost", time(NULL)); cta::log::DummyLogger dl("dummyLogger"); + cta::log::LogContext lc(dl); cta::objectstore::AgentReference agr("UnitTests", dl); cta::objectstore::Agent ag(agr.getAgentAddress(), be); ag.initialize(); @@ -211,7 +214,7 @@ TEST(ObjectStore, RootEntryAgentRegister) { re.fetch(); ASSERT_THROW(re.getAgentRegisterAddress(), cta::objectstore::RootEntry::NotAllocated); - arAddr = re.addOrGetAgentRegisterPointerAndCommit(agr, el); + arAddr = re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc); // Check that we car read it cta::objectstore::AgentRegister ar(arAddr, be); cta::objectstore::ScopedSharedLock arl(ar); @@ -224,9 +227,9 @@ TEST(ObjectStore, RootEntryAgentRegister) { re.fetch(); // Check that we still get the same agent register ASSERT_EQ(arAddr, re.getAgentRegisterAddress()); - ASSERT_EQ(arAddr, re.addOrGetAgentRegisterPointerAndCommit(agr, el)); + ASSERT_EQ(arAddr, re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc)); // Remove it - ASSERT_NO_THROW(re.removeAgentRegisterAndCommit()); + ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc)); // Check that the object is gone ASSERT_FALSE(be.exists(arAddr)); } @@ -234,7 +237,7 @@ TEST(ObjectStore, RootEntryAgentRegister) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.removeIfEmpty(); + re.removeIfEmpty(lc); ASSERT_FALSE(re.exists()); } @@ -258,9 +261,9 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock rel(re); re.fetch(); - re.addOrGetAgentRegisterPointerAndCommit(agr, el); + re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc); } - ag.insertAndRegisterSelf(); + ag.insertAndRegisterSelf(lc); std::string schedulerGlobalLockAddress; { // create the drive register @@ -279,7 +282,7 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock rel(re); re.fetch(); - re.removeSchedulerGlobalLockAndCommit(); + re.removeSchedulerGlobalLockAndCommit(lc); ASSERT_FALSE(be.exists(schedulerGlobalLockAddress)); } // Unregister the agent @@ -289,8 +292,8 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) { cta::objectstore::RootEntry re(be); cta::objectstore::ScopedExclusiveLock lock(re); re.fetch(); - re.removeAgentRegisterAndCommit(); - re.removeIfEmpty(); + re.removeAgentRegisterAndCommit(lc); + re.removeIfEmpty(lc); ASSERT_FALSE(re.exists()); } diff --git a/objectstore/SchedulerGlobalLock.cpp b/objectstore/SchedulerGlobalLock.cpp index 5300cdcb22..e364a4c351 100644 --- a/objectstore/SchedulerGlobalLock.cpp +++ b/objectstore/SchedulerGlobalLock.cpp @@ -71,6 +71,9 @@ void SchedulerGlobalLock::garbageCollect(const std::string &presumedOwner, Agent throw (NotEmpty("Trying to garbage collect a non-empty AgentRegister: internal error")); } remove(); + log::ScopedParamContainer params(lc); + params.add("schedulerGlobalLock", getAddressIfSet()); + lc.log(log::INFO, "In SchedulerGlobalLock::garbageCollect(): Garbage collected and removed scheduler global lock."); } uint64_t SchedulerGlobalLock::getIncreaseCommitMountId() { diff --git a/objectstore/cta-objectstore-collect-orphaned-object.cpp b/objectstore/cta-objectstore-collect-orphaned-object.cpp index 1509ccc740..e3e2c85bd0 100644 --- a/objectstore/cta-objectstore-collect-orphaned-object.cpp +++ b/objectstore/cta-objectstore-collect-orphaned-object.cpp @@ -76,7 +76,7 @@ int main(int argc, char ** argv) { cta::objectstore::AgentReference agr("cta-objectstore-collect-orphaned-object", sl); cta::objectstore::Agent ag(agr.getAgentAddress(), *be); ag.initialize(); - ag.insertAndRegisterSelf(); + ag.insertAndRegisterSelf(lc); switch (go.type()) { case cta::objectstore::serializers::ObjectType::ArchiveRequest_t: { diff --git a/objectstore/cta-objectstore-initialize.cpp b/objectstore/cta-objectstore-initialize.cpp index 53e4af31d4..9d0d2a2061 100644 --- a/objectstore/cta-objectstore-initialize.cpp +++ b/objectstore/cta-objectstore-initialize.cpp @@ -57,9 +57,10 @@ int main(int argc, char ** argv) { cta::objectstore::Agent ag(agr.getAgentAddress(), *be); ag.initialize(); cta::objectstore::EntryLogSerDeser el("user0", "systemhost", time(NULL)); - re.addOrGetAgentRegisterPointerAndCommit(agr,el); + cta::log::LogContext lc(logger); + re.addOrGetAgentRegisterPointerAndCommit(agr,el, lc); rel.release(); - ag.insertAndRegisterSelf(); + ag.insertAndRegisterSelf(lc); rel.lock(re); re.fetch(); re.addOrGetDriveRegisterPointerAndCommit(agr, el); diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index e1412448c2..9146f6e8e6 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -306,7 +306,7 @@ void OStoreDB::trimEmptyQueues(log::LogContext& lc) { aq.fetch(); if (!aq.dumpJobs().size()) { aql.release(); - re.removeArchiveQueueAndCommit(a.tapePool); + re.removeArchiveQueueAndCommit(a.tapePool, lc); log::ScopedParamContainer params(lc); params.add("tapePool", a.tapePool) .add("queueObject", a.address); @@ -320,7 +320,7 @@ void OStoreDB::trimEmptyQueues(log::LogContext& lc) { rq.fetch(); if (!rq.dumpJobs().size()) { rql.release(); - re.removeRetrieveQueueAndCommit(r.vid); + re.removeRetrieveQueueAndCommit(r.vid, lc); log::ScopedParamContainer params(lc); params.add("vid", r.vid) .add("queueObject", r.address); @@ -544,7 +544,7 @@ void OStoreDB::queueArchive(const std::string &instanceName, const cta::common:: .add("queueUnlockTime", qUnlockTime); logContext.log(log::INFO, "In OStoreDB::queueArchive(): added job to queue"); } - } catch (NoSuchArchiveQueue &) { + } catch (NoSuchArchiveQueue &ex) { // Unlink the request from already connected tape pools for (auto tpa=linkedTapePools.begin(); tpa!=linkedTapePools.end(); tpa++) { objectstore::ArchiveQueue aq(*tpa, m_objectStore); @@ -552,10 +552,12 @@ void OStoreDB::queueArchive(const std::string &instanceName, const cta::common:: aq.fetch(); aq.removeJob(aReq.getAddressIfSet()); aq.commit(); - aReq.remove(); } + aReq.remove(); log::ScopedParamContainer params(logContext); params.add("tapepool", currentTapepool) + .add("archiveRequestObject", aReq.getAddressIfSet()) + .add("exceptionMessage", ex.getMessageValue()) .add("jobObject", aReq.getAddressIfSet()); logContext.log(log::INFO, "In OStoreDB::queueArchive(): failed to enqueue job"); throw; @@ -625,6 +627,10 @@ void OStoreDB::deleteArchiveRequest(const std::string &diskInstanceName, ar.setJobOwner(j.copyNb, m_agentReference->getAgentAddress()); } ar.remove(); + log::LogContext lc(m_logger); + log::ScopedParamContainer params(lc); + params.add("archiveRequestObject", ar.getAddressIfSet()); + lc.log(log::INFO, "In OStoreDB::deleteArchiveRequest(): delete archive request."); m_agentReference->removeFromOwnership(ar.getAddressIfSet(), m_objectStore); // We found and deleted the job: return. return; @@ -637,11 +643,14 @@ void OStoreDB::deleteArchiveRequest(const std::string &diskInstanceName, //------------------------------------------------------------------------------ // OStoreDB::ArchiveToFileRequestCancelation::complete() //------------------------------------------------------------------------------ -void OStoreDB::ArchiveToFileRequestCancelation::complete() { +void OStoreDB::ArchiveToFileRequestCancelation::complete(log::LogContext & lc) { if (m_closed) throw ArchiveRequestAlreadyDeleted("OStoreDB::ArchiveToFileRequestCancelation::complete(): called twice"); // We just need to delete the object and forget it m_request.remove(); + log::ScopedParamContainer params(lc); + params.add("archiveRequestObject", m_request.getAddressIfSet()); + lc.log(log::INFO, "In ArchiveToFileRequestCancelation::complete(): removed archive request."); m_agentReference.removeFromOwnership(m_request.getAddressIfSet(), m_objectStore); m_closed = true; } @@ -1053,6 +1062,8 @@ void OStoreDB::removeDrive(const std::string& drive, log::LogContext &lc) { ds.remove(); dr.removeDrive(drive); dr.commit(); + log::ScopedParamContainer params(lc); + params.add("driveStateObject", ds.getAddressIfSet()); lc.log(log::INFO, "In OStoreDB::removeDrive(): removed and dereferenced drive state object."); } else { dr.removeDrive(drive); @@ -1792,7 +1803,7 @@ std::list<std::unique_ptr<SchedulerDatabase::ArchiveJob> > OStoreDB::ArchiveMoun ScopedExclusiveLock rexl(re); re.fetch(); try { - re.removeArchiveQueueAndCommit(mountInfo.tapePool); + re.removeArchiveQueueAndCommit(mountInfo.tapePool, logContext); log::ScopedParamContainer params(logContext); params.add("tapepool", mountInfo.tapePool) .add("queueObject", aq.getAddressIfSet()); @@ -1991,7 +2002,7 @@ std::list<std::unique_ptr<SchedulerDatabase::ArchiveJob> > OStoreDB::ArchiveMoun // The queue should be removed as it is empty. ScopedExclusiveLock rexl(re); re.fetch(); - re.removeArchiveQueueAndCommit(mountInfo.tapePool); + re.removeArchiveQueueAndCommit(mountInfo.tapePool, logContext); log::ScopedParamContainer params(logContext); params.add("tapepool", mountInfo.tapePool) .add("queueObject", aq.getAddressIfSet()); @@ -2180,7 +2191,7 @@ std::list<std::unique_ptr<SchedulerDatabase::RetrieveJob> > OStoreDB::RetrieveMo ScopedExclusiveLock rexl(re); re.fetch(); try { - re.removeRetrieveQueueAndCommit(mountInfo.vid); + re.removeRetrieveQueueAndCommit(mountInfo.vid, logContext); log::ScopedParamContainer params(logContext); params.add("vid", mountInfo.vid) .add("queueObject", rq.getAddressIfSet()); @@ -2353,7 +2364,7 @@ std::list<std::unique_ptr<SchedulerDatabase::RetrieveJob> > OStoreDB::RetrieveMo // The queue should be removed as it is empty. ScopedExclusiveLock rexl(re); re.fetch(); - re.removeArchiveQueueAndCommit(mountInfo.tapePool); + re.removeArchiveQueueAndCommit(mountInfo.tapePool, logContext); log::ScopedParamContainer params(logContext); params.add("tapepool", mountInfo.tapePool) .add("queueObject", rq.getAddressIfSet()); @@ -2666,7 +2677,7 @@ void OStoreDB::RetrieveJob::fail(log::LogContext &logContext) { objectstore::ScopedExclusiveLock rrl(m_retrieveRequest); m_retrieveRequest.fetch(); // Add a job failure. If the job is failed, we will delete it. - if (m_retrieveRequest.addJobFailure(selectedCopyNb, m_mountId)) { + if (m_retrieveRequest.addJobFailure(selectedCopyNb, m_mountId, logContext)) { // The job will not be retried. Either another jobs for the same request is // queued and keeps the request referenced or the request has been deleted. // In any case, we can forget it. diff --git a/scheduler/OStoreDB/OStoreDB.hpp b/scheduler/OStoreDB/OStoreDB.hpp index d1094f9b25..925f798e09 100644 --- a/scheduler/OStoreDB/OStoreDB.hpp +++ b/scheduler/OStoreDB/OStoreDB.hpp @@ -207,7 +207,7 @@ public: objectstore::Backend & be, catalogue::Catalogue & catalogue, log::Logger &logger): m_request(be), m_lock(), m_objectStore(be), m_catalogue(catalogue), m_logger(logger), m_agentReference(agentReference), m_closed(false) {} virtual ~ArchiveToFileRequestCancelation(); - void complete() override; + void complete(log::LogContext & lc) override; private: objectstore::ArchiveRequest m_request; objectstore::ScopedExclusiveLock m_lock; diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp index 877f4b7327..d7fd49501e 100644 --- a/scheduler/OStoreDB/OStoreDBFactory.hpp +++ b/scheduler/OStoreDB/OStoreDBFactory.hpp @@ -187,9 +187,10 @@ m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFacto objectstore::Agent agent(m_agentReference.getAgentAddress(), *m_backend); agent.initialize(); objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL)); - re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl); + log::LogContext lc(*m_logger); + re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl, lc); rel.release(); - agent.insertAndRegisterSelf(); + agent.insertAndRegisterSelf(lc); rel.lock(re); re.fetch(); re.addOrGetDriveRegisterPointerAndCommit(m_agentReference, cl); @@ -220,9 +221,10 @@ m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFact objectstore::Agent agent(m_agentReference.getAgentAddress(), *m_backend); agent.initialize(); objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL)); - re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl); + log::LogContext lc(*m_logger); + re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl, lc); rel.release(); - agent.insertAndRegisterSelf(); + agent.insertAndRegisterSelf(lc); rel.lock(re); re.fetch(); re.addOrGetDriveRegisterPointerAndCommit(m_agentReference, cl); diff --git a/scheduler/SchedulerDatabase.hpp b/scheduler/SchedulerDatabase.hpp index 5449658354..bac987e632 100644 --- a/scheduler/SchedulerDatabase.hpp +++ b/scheduler/SchedulerDatabase.hpp @@ -147,7 +147,7 @@ public: */ class ArchiveToFileRequestCancelation { public: - virtual void complete() = 0; + virtual void complete(log::LogContext & lc) = 0; virtual ~ArchiveToFileRequestCancelation() {}; }; -- GitLab