diff --git a/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.cpp b/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.cpp index 4562012ce0eba0c845b35fb7c4ba3cccbfbef84d..7e890eec2dd8e803ba15c0d0e848e3da17c40c95 100644 --- a/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.cpp +++ b/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.cpp @@ -32,7 +32,7 @@ EnterpriseRAOAlgorithm::~EnterpriseRAOAlgorithm() { std::vector<uint64_t> EnterpriseRAOAlgorithm::performRAO(const std::vector<std::unique_ptr<cta::RetrieveJob> >& jobs) { std::vector<uint64_t> raoOrder; uint64_t njobs = jobs.size(); - uint32_t block_size = 262144; + uint32_t block_size = c_blockSize; std::list<castor::tape::SCSI::Structures::RAO::blockLims> files; for (uint32_t i = 0; i < njobs; i++) { cta::RetrieveJob *job = jobs.at(i).get(); diff --git a/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.hpp b/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.hpp index 34c3a0c5bdc9c1d043f77ffa8a96841d82d0acf1..a029e5f1c371a1ef7ba49b1c97321d6cc73e4b3f 100644 --- a/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.hpp +++ b/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.hpp @@ -55,6 +55,8 @@ private: castor::tape::tapeserver::drive::DriveInterface * m_drive; //Maximum number of files supported by the drive to perform the RAO uint64_t m_maxFilesSupported; + + const uint32_t c_blockSize = 262144; }; }}}} diff --git a/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.cpp b/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.cpp index 0e5809aa386febba511730846757f2531efcc663..9276c70cb551f02ae0b879de6f050890c6e97edb 100644 --- a/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.cpp +++ b/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.cpp @@ -33,7 +33,9 @@ FilePosition InterpolationFilePositionEstimator::getFilePosition(const cta::Retr uint64_t startBlock = tapeFile.blockId; Position startPosition = getPhysicalPosition(startBlock); ret.setStartPosition(startPosition); - + uint64_t endBlock = determineEndBlock(tapeFile); + Position endPosition = getPhysicalPosition(endBlock); + ret.setEndPosition(endPosition); return ret; } @@ -86,5 +88,8 @@ uint64_t InterpolationFilePositionEstimator::determineLPos(const uint64_t blockI return fileLpos; } +uint64_t InterpolationFilePositionEstimator::determineEndBlock(const cta::common::dataStructures::TapeFile& file) const{ + return file.blockId + (file.fileSize / c_blockSize) + 1; +} }}}} \ No newline at end of file diff --git a/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.hpp b/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.hpp index 54276cfb9b8cb57f53b2b336aaffb1002af2e67f..32e086d43caa60d161bcba86017b6f1cabefefc1 100644 --- a/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.hpp +++ b/tapeserver/castor/tape/tapeserver/RAO/InterpolationFilePositionEstimator.hpp @@ -30,10 +30,13 @@ public: InterpolationFilePositionEstimator(const std::vector<drive::endOfWrapPosition> & endOfWrapPositions, const cta::catalogue::MediaType & mediaType); FilePosition getFilePosition(const cta::RetrieveJob& job) const override; virtual ~InterpolationFilePositionEstimator(); + + static const uint64_t c_blockSize = 256000; private: Position getPhysicalPosition(const uint64_t blockId) const; uint64_t determineWrapNb(const uint64_t blockId) const; uint64_t determineLPos(const uint64_t blockId, const uint64_t wrapNumber) const; + uint64_t determineEndBlock(const cta::common::dataStructures::TapeFile & file) const; std::vector<drive::endOfWrapPosition> m_endOfWrapPositions; cta::catalogue::MediaType m_mediaType; }; diff --git a/tapeserver/castor/tape/tapeserver/RAO/RAOTest.cpp b/tapeserver/castor/tape/tapeserver/RAO/RAOTest.cpp index 5307fc116369f32dff52118acf27833d4e97245a..9a2fa11fef2fa67f759091c2faed1759e9cf5782 100644 --- a/tapeserver/castor/tape/tapeserver/RAO/RAOTest.cpp +++ b/tapeserver/castor/tape/tapeserver/RAO/RAOTest.cpp @@ -56,7 +56,7 @@ namespace unitTests { tapeFile.fSeq = fseq; tapeFile.fileSize = fileSize; archiveFile.tapeFiles.push_back(tapeFile); - cta::common::dataStructures::RetrieveRequest retrieveRequest; + cta::common::dataStructures::RetrieveRequest retrieveRequest; ret.reset(new cta::RetrieveJob(nullptr,retrieveRequest,archiveFile,1,cta::PositioningMethod::ByBlock)); return ret; } @@ -92,21 +92,29 @@ namespace unitTests { rao::InterpolationFilePositionEstimator estimator(eowPositions,mediaType); { - cta::RetrieveJob & retrieveJob = *RAOTestEnvironment::createRetrieveJobForRAOTests(0,1,1,10); - rao::FilePosition positionFile = estimator.getFilePosition(retrieveJob); + std::unique_ptr<cta::RetrieveJob> retrieveJob = RAOTestEnvironment::createRetrieveJobForRAOTests(0,1,1,10); + rao::FilePosition positionFile = estimator.getFilePosition(*retrieveJob); //The LPOS start position of the file should be equal to the minLPos of the LTO7 media type rao::Position startPositionFile = positionFile.getStartPosition(); ASSERT_EQ(0,startPositionFile.getWrap()); ASSERT_EQ(mediaType.minLPos.value(), startPositionFile.getLPos()); + + rao::Position endPositionFile = positionFile.getEndPosition(); + ASSERT_EQ(0,endPositionFile.getWrap()); + + /*TODO : TO BE CONTINUED + * auto jobTapeFile = retrieveJob->selectedTapeFile(); + uint64_t endPositionBlockId = mediaType.minLPos.value() + (jobTapeFile.blockId / rao::InterpolationFilePositionEstimator::c_blockSize) + 1; + ASSERT_EQ(mediaType.minLPos.value() + endPositionBlockId,endPositionFile.getLPos());*/ } { - cta::RetrieveJob & retrieveJob = *RAOTestEnvironment::createRetrieveJobForRAOTests(11,1,2,25); - rao::FilePosition positionFile = estimator.getFilePosition(retrieveJob); + std::unique_ptr<cta::RetrieveJob> retrieveJob = RAOTestEnvironment::createRetrieveJobForRAOTests(2,1,2,25); + rao::FilePosition positionFile = estimator.getFilePosition(*retrieveJob); rao::Position startPositionFile = positionFile.getStartPosition(); ASSERT_EQ(0,startPositionFile.getWrap()); double b_max = (double) eowPositions.at(0).blockId; - uint64_t expectedLPos = mediaType.minLPos.value() + retrieveJob.selectedTapeFile().blockId * (mediaType.maxLPos.value() - mediaType.minLPos.value()) / b_max; + uint64_t expectedLPos = mediaType.minLPos.value() + retrieveJob->selectedTapeFile().blockId * (mediaType.maxLPos.value() - mediaType.minLPos.value()) / b_max; ASSERT_EQ(expectedLPos,positionFile.getStartPosition().getLPos()); } } @@ -119,10 +127,10 @@ namespace unitTests { { //Now create a retrieve job that has a blockId greater than the first wrap end of wrap position - cta::RetrieveJob & retrieveJob = *RAOTestEnvironment::createRetrieveJobForRAOTests(210000,1,1,10); - rao::FilePosition positionFile = estimator.getFilePosition(retrieveJob); + std::unique_ptr<cta::RetrieveJob> retrieveJob = RAOTestEnvironment::createRetrieveJobForRAOTests(210000,1,1,10); + rao::FilePosition positionFile = estimator.getFilePosition(*retrieveJob); double b_max = (double) eowPositions.at(1).blockId - (double) eowPositions.at(0).blockId; - uint64_t fileBlockId = retrieveJob.selectedTapeFile().blockId - eowPositions.at(0).blockId; + uint64_t fileBlockId = retrieveJob->selectedTapeFile().blockId - eowPositions.at(0).blockId; uint64_t expectedLPos = mediaType.maxLPos.value() - fileBlockId * (mediaType.maxLPos.value() - mediaType.minLPos.value()) / b_max; ASSERT_EQ(1,positionFile.getStartPosition().getWrap()); ASSERT_EQ(expectedLPos,positionFile.getStartPosition().getLPos()); @@ -136,8 +144,8 @@ namespace unitTests { rao::InterpolationFilePositionEstimator estimator(eowPositions,mediaType); { - cta::RetrieveJob & retrieveJob = *RAOTestEnvironment::createRetrieveJobForRAOTests(100000000,1,3,30); - ASSERT_THROW(estimator.getFilePosition(retrieveJob),cta::exception::Exception); + std::unique_ptr<cta::RetrieveJob> retrieveJob = RAOTestEnvironment::createRetrieveJobForRAOTests(100000000,1,3,30); + ASSERT_THROW(estimator.getFilePosition(*retrieveJob),cta::exception::Exception); } } @@ -147,7 +155,6 @@ namespace unitTests { rao::RAOHelpers::improveEndOfLastWrapPositionIfPossible(eowPositions); drive::endOfWrapPosition eowpAfterImprovement = eowPositions.at(eowPositions.size()-1); ASSERT_LT(eowpBeforeImprovement.blockId,eowpAfterImprovement.blockId); - } }