From 09488b1614e43ee585753fdce0ebd1623a2b788b Mon Sep 17 00:00:00 2001
From: Eric Cano <Eric.Cano@cern.ch>
Date: Wed, 28 Oct 2015 15:24:46 +0100
Subject: [PATCH] Added missing success() implementation for retrieve jobs.

---
 objectstore/RetrieveToFileRequest.cpp  | 18 ++++++++++++++++++
 objectstore/RetrieveToFileRequest.hpp  |  1 +
 scheduler/OStoreDB/OStoreDB.cpp        | 17 ++++++++++++++++-
 scheduler/RetrieveJob.cpp              |  1 +
 tapeserver/castor/log/SyslogLogger.hpp |  4 ++--
 5 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/objectstore/RetrieveToFileRequest.cpp b/objectstore/RetrieveToFileRequest.cpp
index 01a139eaef..f6a5bacef2 100644
--- a/objectstore/RetrieveToFileRequest.cpp
+++ b/objectstore/RetrieveToFileRequest.cpp
@@ -54,6 +54,24 @@ void cta::objectstore::RetrieveToFileRequest::addJob(const cta::TapeFileLocation
   j->set_fseq(tapeFileLocation.fSeq);
 }
 
+bool cta::objectstore::RetrieveToFileRequest::setJobSuccessful(uint16_t copyNumber) {
+  checkPayloadWritable();
+  auto * jl = m_payload.mutable_jobs();
+  for (auto j=jl->begin(); j!=jl->end(); j++) {
+    if (j->copynb() == copyNumber) {
+      j->set_status(serializers::RetrieveJobStatus::RJS_Complete);
+      for (auto j2=jl->begin(); j2!=jl->end(); j2++) {
+        if (j2->status()!= serializers::RetrieveJobStatus::RJS_Complete &&
+            j2->status()!= serializers::RetrieveJobStatus::RJS_Failed)
+          return false;
+      }
+      return true;
+    }
+  }
+  throw NoSuchJob("In RetrieveToFileRequest::setJobSuccessful(): job not found");
+}
+
+
 void cta::objectstore::RetrieveToFileRequest::setArchiveFile(
   const cta::ArchiveFile& archiveFile) {
   checkPayloadWritable();
diff --git a/objectstore/RetrieveToFileRequest.hpp b/objectstore/RetrieveToFileRequest.hpp
index 662ae4a5b7..954091c990 100644
--- a/objectstore/RetrieveToFileRequest.hpp
+++ b/objectstore/RetrieveToFileRequest.hpp
@@ -43,6 +43,7 @@ public:
     uint16_t maxRetiesWithinMount, uint16_t maxTotalRetries);
   void setJobSelected(uint16_t copyNumber, const std::string & owner);
   void setJobPending(uint16_t copyNumber);
+  bool setJobSuccessful(uint16_t copyNumber); //< returns true if this is the last job
   class JobDump {
   public:
     uint16_t copyNb;
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index 88f22637d9..51a1c25b3c 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -1750,7 +1750,22 @@ OStoreDB::RetrieveJob::~RetrieveJob() {
 }
 
 void OStoreDB::RetrieveJob::succeed() {
-  throw NotImplemented("");
+  // Lock the request and set the job as successful.
+  objectstore::ScopedExclusiveLock rtfrl(m_rtfr);
+  m_rtfr.fetch();
+  std::string rtfrAddress = m_rtfr.getAddressIfSet();
+  if (m_rtfr.setJobSuccessful(m_copyNb)) {
+    m_rtfr.remove();
+  } else {
+    m_rtfr.commit();
+  }
+  // We no more own the job (which could be gone)
+  m_jobOwned = false;
+  // Remove ownership form the agent
+  objectstore::ScopedExclusiveLock al(m_agent);
+  m_agent.fetch();
+  m_agent.removeFromOwnership(rtfrAddress);
+  m_agent.commit();
 }
 
 
diff --git a/scheduler/RetrieveJob.cpp b/scheduler/RetrieveJob.cpp
index bdaf431164..737fadbda1 100644
--- a/scheduler/RetrieveJob.cpp
+++ b/scheduler/RetrieveJob.cpp
@@ -43,6 +43,7 @@ cta::RetrieveJob::RetrieveJob(RetrieveMount &mount,
 // complete
 //------------------------------------------------------------------------------
 void cta::RetrieveJob::complete() {
+  m_dbJob->succeed();
 }
   
 //------------------------------------------------------------------------------
diff --git a/tapeserver/castor/log/SyslogLogger.hpp b/tapeserver/castor/log/SyslogLogger.hpp
index c6703d3cf3..e45422d2a5 100644
--- a/tapeserver/castor/log/SyslogLogger.hpp
+++ b/tapeserver/castor/log/SyslogLogger.hpp
@@ -409,8 +409,8 @@ protected:
 
       // Check the parameter name, if it's an empty string set the value to
       // "Undefined".
-      const std::string name = param.getName() == "" ? "Undefined" :
-        cleanString(param.getName(), true);
+      const std::string name = (param.getName() == "" ? "Undefined" :
+        cleanString(param.getName(), true));
 
       // Process the parameter value
       const std::string value = cleanString(param.getValue(), false);
-- 
GitLab