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