diff --git a/objectstore/RetrieveToFileRequest.cpp b/objectstore/RetrieveToFileRequest.cpp index 01a139eaeff7ce9bde5b5528f3e0cdc5084e08b5..f6a5bacef237c7a90af028b53ce51ab3459745e2 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 662ae4a5b7549e06c72d39ab2d52182f94a60b19..954091c99016e38088622437b2985afa60c03e38 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 88f22637d938c814fc560841b3aabafe154b390f..51a1c25b3c091a834412a7a8eecaab5ff30cd49c 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 bdaf4311645a161e39d89e1d698a5e7fcadfdadf..737fadbda1fbc6314fe10d4617f89f7d971511a9 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 c6703d3cf3c5fd50d476f5aece9c78e334c0ffa9..e45422d2a58869504175a78be636e1724da76259 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);