From e3d7e42b76c895f342a9a46ba5e7641ff76c5f8e Mon Sep 17 00:00:00 2001 From: Cedric Caffy <cedric.caffy@cern.ch> Date: Tue, 1 Sep 2020 17:49:36 +0200 Subject: [PATCH] [lto_rao] Fixed unittests valgrind error --- .../tapeserver/RAO/EnterpriseRAOAlgorithm.cpp | 2 +- .../tapeserver/RAO/EnterpriseRAOAlgorithm.hpp | 2 ++ .../InterpolationFilePositionEstimator.cpp | 7 ++++- .../InterpolationFilePositionEstimator.hpp | 3 ++ .../castor/tape/tapeserver/RAO/RAOTest.cpp | 31 ++++++++++++------- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.cpp b/tapeserver/castor/tape/tapeserver/RAO/EnterpriseRAOAlgorithm.cpp index 4562012ce0..7e890eec2d 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 34c3a0c5bd..a029e5f1c3 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 0e5809aa38..9276c70cb5 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 54276cfb9b..32e086d43c 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 5307fc1163..9a2fa11fef 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); - } } -- GitLab