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