diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp index 1925fbc383a38372d832294235c8b77cbbe3ae42..f66237dc701c0a1b094a69a9996320b8eef0b2c6 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 598b2483aecaad3a24d25c2334696d7d3a9c7c0d..727b1abf1ac161cb4ed7ba51236fbfe6737ec4ea 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");