diff --git a/common/dataStructures/QueueAndMountSummary.hpp b/common/dataStructures/QueueAndMountSummary.hpp index 39729bf7bd117a8032eae890b7b5d16def67b5fa..c35449adca1366f075ef9b4e1bee275985aad913 100644 --- a/common/dataStructures/QueueAndMountSummary.hpp +++ b/common/dataStructures/QueueAndMountSummary.hpp @@ -35,6 +35,7 @@ struct QueueAndMountSummary { std::string vid; uint64_t filesQueued=0; uint64_t bytesQueued=0; + time_t oldestJobAge=0; MountPolicy mountPolicy; uint64_t currentMounts=0; uint64_t currentFiles=0; diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp index fd9bccccc815fa659a8ae8c3325ba1d44b006685..c7aa563cc4f7f24c6b5907b18e3d0595ec720c4f 100644 --- a/scheduler/Scheduler.cpp +++ b/scheduler/Scheduler.cpp @@ -672,6 +672,7 @@ std::list<common::dataStructures::QueueAndMountSummary> Scheduler::getQueuesAndM summary.mountPolicy.maxDrivesAllowed = pm.maxDrivesAllowed; summary.bytesQueued = pm.bytesQueued; summary.filesQueued = pm.filesQueued; + summary.oldestJobAge = pm.oldestJobStartTime - time(nullptr); break; case common::dataStructures::MountType::Retrieve: // TODO: we should remove the retrieveMinRequestAge if it's redundant, or rename pm.minArchiveRequestAge. @@ -680,6 +681,7 @@ std::list<common::dataStructures::QueueAndMountSummary> Scheduler::getQueuesAndM summary.mountPolicy.maxDrivesAllowed = pm.maxDrivesAllowed; summary.bytesQueued = pm.bytesQueued; summary.filesQueued = pm.filesQueued; + summary.oldestJobAge = pm.oldestJobStartTime - time(nullptr); break; default: break; @@ -704,19 +706,37 @@ std::list<common::dataStructures::QueueAndMountSummary> Scheduler::getQueuesAndM } mountDecisionInfo.reset(); // Add the tape information where useful (archive queues). - for (auto & tp: ret) { - if (common::dataStructures::MountType::Archive==tp.mountType) { + for (auto & mountOrQueue: ret) { + if (common::dataStructures::MountType::Archive==mountOrQueue.mountType) { // Get all the tape for this pool cta::catalogue::TapeSearchCriteria tsc; - tsc.tapePool = tp.tapePool; + tsc.tapePool = mountOrQueue.tapePool; auto tapes=m_catalogue.getTapes(tsc); for (auto & t:tapes) { - tp.tapesCapacity += t.capacityInBytes; - tp.dataOnTapes += t.dataOnTapeInBytes; - if (t.disabled) tp.disabledTapes++; - if (t.full) tp.fullTapes++; - if (!t.full && t.disabled) tp.writableTapes++; + mountOrQueue.tapesCapacity += t.capacityInBytes; + mountOrQueue.dataOnTapes += t.dataOnTapeInBytes; + if (!t.dataOnTapeInBytes) + mountOrQueue.emptyTapes++; + if (t.disabled) mountOrQueue.disabledTapes++; + if (t.full) mountOrQueue.fullTapes++; + if (!t.full && t.disabled) mountOrQueue.writableTapes++; } + } else if (common::dataStructures::MountType::Retrieve==mountOrQueue.mountType) { + // Get info for this tape. + cta::catalogue::TapeSearchCriteria tsc; + tsc.vid = mountOrQueue.vid; + auto tapes=m_catalogue.getTapes(tsc); + if (tapes.size() != 1) { + throw cta::exception::Exception("In Scheduler::getQueuesAndMountSummaries(): got unexpected number of tapes from catalogue for a retrieve."); + } + auto &t=tapes.front(); + mountOrQueue.tapesCapacity += t.capacityInBytes; + mountOrQueue.dataOnTapes += t.dataOnTapeInBytes; + if (!t.dataOnTapeInBytes) + mountOrQueue.emptyTapes++; + if (t.disabled) mountOrQueue.disabledTapes++; + if (t.full) mountOrQueue.fullTapes++; + if (!t.full && t.disabled) mountOrQueue.writableTapes++; } } return ret;