From 9f90713f687c63e76c6f62fe8805f38428dd5fdf Mon Sep 17 00:00:00 2001 From: Eric Cano <Eric.Cano@cern.ch> Date: Wed, 2 Aug 2017 17:52:45 +0200 Subject: [PATCH] Added resetting of ArchiveQueue address in Helpers::getLockedAndFetchedQueue<ArchiveQueue>() retries. --- objectstore/Helpers.cpp | 3 +++ objectstore/ObjectOps.hpp | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp index 1925fbc383..f66237dc70 100644 --- a/objectstore/Helpers.cpp +++ b/objectstore/Helpers.cpp @@ -101,6 +101,7 @@ void Helpers::getLockedAndFetchedQueue<ArchiveQueue>(ArchiveQueue& archiveQueue, // We also need to make sure the lock on the queue is released (it is in // an object and hence not scoped). if (archiveQueueLock.isLocked()) archiveQueueLock.release(); + archiveQueue.resetAddress(); log::ScopedParamContainer params(lc); params.add("attemptNb", i+1) .add("exceptionMessage", ex.getMessageValue()) @@ -118,11 +119,13 @@ void Helpers::getLockedAndFetchedQueue<ArchiveQueue>(ArchiveQueue& archiveQueue, } catch (...) { // Also release the lock if needed here. if (archiveQueueLock.isLocked()) archiveQueueLock.release(); + archiveQueue.resetAddress(); throw; } } // Also release the lock if needed here. if (archiveQueueLock.isLocked()) archiveQueueLock.release(); + archiveQueue.resetAddress(); throw cta::exception::Exception(std::string( "In OStoreDB::getLockedAndFetchedArchiveQueue(): failed to find or create and lock archive queue after 5 retries for tapepool: ") + tapePool); diff --git a/objectstore/ObjectOps.hpp b/objectstore/ObjectOps.hpp index 598b2483ae..727b1abf1a 100644 --- a/objectstore/ObjectOps.hpp +++ b/objectstore/ObjectOps.hpp @@ -52,6 +52,7 @@ public: CTA_GENERATE_EXCEPTION_CLASS(AddressAlreadySet); CTA_GENERATE_EXCEPTION_CLASS(InvalidAddress); CTA_GENERATE_EXCEPTION_CLASS(FailedToSerialize); + CTA_GENERATE_EXCEPTION_CLASS(StillLocked); protected: void checkHeaderWritable() { if (!m_headerInterpreted) @@ -91,13 +92,24 @@ public: void setAddress(const std::string & name) { if (m_nameSet) - throw AddressAlreadySet("In ObjectOps::setName: trying to overwrite an already set name"); + throw AddressAlreadySet("In ObjectOps::setAddress(): trying to overwrite an already set name"); if (name.empty()) - throw InvalidAddress("In ObjectOps::setName: empty name"); + throw InvalidAddress("In ObjectOps::setAddress(): empty name"); m_name = name; m_nameSet = true; } + void resetAddress() { + if (m_locksCount || m_locksForWriteCount) { + throw StillLocked("In ObjectOps::resetAddress: reset the address of a locked object"); + } + m_nameSet = false; + m_name = ""; + m_headerInterpreted = false; + m_payloadInterpreted = false; + m_existingObject = false; + } + std::string & getAddressIfSet() { if (!m_nameSet) { throw AddressNotSet("In ObjectOpsBase::getNameIfSet: name not set yet"); -- GitLab