diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp index 554209133285417112b5462956a412a301384eaa..afa3f71833dbf5f9f5e686919703e396c49089f2 100644 --- a/catalogue/Catalogue.hpp +++ b/catalogue/Catalogue.hpp @@ -165,7 +165,8 @@ public: virtual std::list<cta::common::dataStructures::ArchiveFile> getArchiveFiles(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid, const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0; virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid, - const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0; + const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0; + virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id) = 0; virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force) = 0; diff --git a/catalogue/DummyCatalogue.cpp b/catalogue/DummyCatalogue.cpp index 7cc94f41683e6e474a28dde190f6fe1b99d96d05..ece8e431bb0c2b1bb2aec9cb546f48959823d58a 100644 --- a/catalogue/DummyCatalogue.cpp +++ b/catalogue/DummyCatalogue.cpp @@ -405,6 +405,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::catalogue::DummyCatalogue:: const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) { return cta::common::dataStructures::ArchiveFileSummary(); } + +//------------------------------------------------------------------------------ +// getArchiveFileById +//------------------------------------------------------------------------------ +cta::common::dataStructures::ArchiveFile cta::catalogue::DummyCatalogue::getArchiveFileById(const std::string &id){ + return cta::common::dataStructures::ArchiveFile(); +} //------------------------------------------------------------------------------ // setDriveStatus diff --git a/catalogue/DummyCatalogue.hpp b/catalogue/DummyCatalogue.hpp index 242e8f47b3492acb3d81de60a030ba7f243fac54..2522e9d7a97f0259904f7eddbd018a64bf7eb187 100644 --- a/catalogue/DummyCatalogue.hpp +++ b/catalogue/DummyCatalogue.hpp @@ -138,6 +138,7 @@ public: const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path); virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid, const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path); + virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id); virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force); /** diff --git a/catalogue/MockCatalogue.cpp b/catalogue/MockCatalogue.cpp index 4134a292cccfc9c8f08fb91f626d6b0ff6f19653..f6bb5da571e82e0c99505504e12af4476761ac69 100644 --- a/catalogue/MockCatalogue.cpp +++ b/catalogue/MockCatalogue.cpp @@ -405,6 +405,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::catalogue::MockCatalogue::g const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) { return cta::common::dataStructures::ArchiveFileSummary(); } + +//------------------------------------------------------------------------------ +// getArchiveFileById +//------------------------------------------------------------------------------ +cta::common::dataStructures::ArchiveFile cta::catalogue::MockCatalogue::getArchiveFileById(const std::string &id){ + return cta::common::dataStructures::ArchiveFile(); +} //------------------------------------------------------------------------------ // setDriveStatus diff --git a/catalogue/MockCatalogue.hpp b/catalogue/MockCatalogue.hpp index 7958136b8a04d8c15e4d676c6c22b903bb042cbc..528a7862ae8c2587178005818759941b1fb1b16b 100644 --- a/catalogue/MockCatalogue.hpp +++ b/catalogue/MockCatalogue.hpp @@ -138,6 +138,7 @@ public: const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path); virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid, const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path); + virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id); virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force); /** diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp index ea18e726e521e44ab5aa73e535e8fcbef1a58afa..8230d4ae55b96dfc383ce8b262b5ee837640b6c8 100644 --- a/scheduler/Scheduler.cpp +++ b/scheduler/Scheduler.cpp @@ -658,6 +658,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::Scheduler::getArchiveFileSu return cta::common::dataStructures::ArchiveFileSummary(); } +//------------------------------------------------------------------------------ +// getArchiveFileById +//------------------------------------------------------------------------------ +cta::common::dataStructures::ArchiveFile cta::Scheduler::getArchiveFileById(const std::string &id){ + return cta::common::dataStructures::ArchiveFile(); +} + //------------------------------------------------------------------------------ // readTest //------------------------------------------------------------------------------ diff --git a/scheduler/Scheduler.hpp b/scheduler/Scheduler.hpp index df2f6569a21965d02d465482c460ed32160cdf54..543b0f3243349a3dd85524f5b81b558f6b71beb4 100644 --- a/scheduler/Scheduler.hpp +++ b/scheduler/Scheduler.hpp @@ -210,6 +210,7 @@ public: const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path); virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid, const std::string ©nb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path); + virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id); virtual cta::common::dataStructures::ReadTestResult readTest(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const std::string &vid, const uint64_t firstFSeq, const uint64_t lastFSeq, const bool checkChecksum, const std::string &output, const std::string &tag) const; //when output=="null" discard the data read diff --git a/xroot_plugins/XrdCtaFile.cpp b/xroot_plugins/XrdCtaFile.cpp index 6f8e94a3f78d78b652392769f91f11e4aa7d9f93..7447ec8c6ef342721e587ac685d8d9af52bd545b 100644 --- a/xroot_plugins/XrdCtaFile.cpp +++ b/xroot_plugins/XrdCtaFile.cpp @@ -1810,6 +1810,63 @@ void XrdProFile::xCom_listpendingarchives(const std::vector<std::string> &tokens void XrdProFile::xCom_listpendingretrieves(const std::vector<std::string> &tokens, const cta::common::dataStructures::SecurityIdentity &requester) { std::stringstream help; help << tokens[0] << " lpr/listpendingretrieves [--vid/-v <vid>] [--extended/-x]" << std::endl; + std::string vid = getOptionValue(tokens, "-v", "--vid"); + bool extended = hasOption(tokens, "-x", "--extended"); + std::map<std::string, std::list<cta::common::dataStructures::RetrieveJob> > result; + if(vid.empty()) { + result = m_scheduler->getPendingRetrieveJobs(requester); + } + else { + std::list<cta::common::dataStructures::RetrieveJob> list = m_scheduler->getPendingRetrieveJobs(requester, vid); + if(list.size()>0) { + result[vid] = list; + } + } + if(result.size()>0) { + if(extended) { + std::vector<std::vector<std::string>> responseTable; + std::vector<std::string> header = {"vid","id","copy no.","fseq","block id","size","user","group","instance","path","diskpool","diskpool throughput"}; + responseTable.push_back(header); + for(auto it = result.cbegin(); it != result.cend(); it++) { + for(auto jt = it->second.cbegin(); jt != it->second.cend(); jt++) { + std::vector<std::string> currentRow; + currentRow.push_back(it->first); + currentRow.push_back(jt->getRequest().getArchiveFileID()); + cta::common::dataStructures::ArchiveFile file = m_scheduler->getArchiveFileById(jt->getRequest().getArchiveFileID()); + currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].first)); + currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].second.getFSeq())); + currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].second.getBlockId())); + currentRow.push_back(std::to_string((unsigned long long)file.getFileSize())); + currentRow.push_back(jt->getRequest().getRequester().getUserName()); + currentRow.push_back(jt->getRequest().getRequester().getGroupName()); + currentRow.push_back(jt->getRequest().getDrData().getDrInstance()); + currentRow.push_back(jt->getRequest().getDrData().getDrPath()); + currentRow.push_back(jt->getRequest().getDiskpoolName()); + currentRow.push_back(std::to_string((unsigned long long)jt->getRequest().getDiskpoolThroughput())); + responseTable.push_back(currentRow); + } + } + m_data = formatResponse(responseTable); + } + else { + std::vector<std::vector<std::string>> responseTable; + std::vector<std::string> header = {"vid","total files","total size"}; + responseTable.push_back(header); + for(auto it = result.cbegin(); it != result.cend(); it++) { + std::vector<std::string> currentRow; + currentRow.push_back(it->first); + currentRow.push_back(std::to_string((unsigned long long)it->second.size())); + uint64_t size=0; + for(auto jt = it->second.cbegin(); jt != it->second.cend(); jt++) { + cta::common::dataStructures::ArchiveFile file = m_scheduler->getArchiveFileById(jt->getRequest().getArchiveFileID()); + size += file.getFileSize(); + } + currentRow.push_back(std::to_string((unsigned long long)size)); + responseTable.push_back(currentRow); + } + m_data = formatResponse(responseTable); + } + } } //------------------------------------------------------------------------------