diff --git a/catalogue/ArchiveFileBuilder.cpp b/catalogue/ArchiveFileBuilder.cpp index cf7cea261b0dd87d3db48712f17ae192933901f9..f82727e3402f2e246c33e5849da7ecb3e1d099ae 100644 --- a/catalogue/ArchiveFileBuilder.cpp +++ b/catalogue/ArchiveFileBuilder.cpp @@ -83,43 +83,7 @@ std::unique_ptr<common::dataStructures::ArchiveFile> ArchiveFileBuilder::append( } // Append the tape file - const auto tapeFileMapItor = tapeFile.tapeFiles.begin(); - const auto vid = tapeFileMapItor->second.vid; - const auto fSeq = tapeFileMapItor->second.fSeq; - const auto blockId = tapeFileMapItor->second.blockId; - const auto copyNbOfTapeFileToAppend = tapeFileMapItor->first; - if(m_archiveFile->tapeFiles.find(copyNbOfTapeFileToAppend) != m_archiveFile->tapeFiles.end()) { - // Found two tape files for the same archive file with the same copy - // number - - // Ignore for now any inconsistencies in the copy number of the tape file - // exception::Exception ex; - // ex.getMessage() << __FUNCTION__ << " failed: Found two tape files for the same archive file with the same copy" - // " numbers: archiveFileID=" << tapeFile.archiveFileID << " copyNb=" << copyNbOfTapeFileToAppend; - // throw ex; - - // Create a unique copy number to replace the original duplicate - uint64_t maxCopyNb = 0; - for(const auto maplet: m_archiveFile->tapeFiles) { - if(maplet.first > maxCopyNb) { - maxCopyNb = maplet.first; - } - } - const uint64_t workaroundCopyNb = maxCopyNb + 1; - { - std::list<cta::log::Param> params; - params.push_back(cta::log::Param("archiveFileID", tapeFile.archiveFileID)); - params.push_back(cta::log::Param("duplicateCopyNb", copyNbOfTapeFileToAppend)); - params.push_back(cta::log::Param("workaroundCopyNb", workaroundCopyNb)); - params.push_back(cta::log::Param("tapeVid", vid)); - params.push_back(cta::log::Param("fSeq", fSeq)); - params.push_back(cta::log::Param("blockId", blockId)); - m_log(cta::log::WARNING, "Found a duplicate tape copy number when listing archive files", params); - } - m_archiveFile->tapeFiles[workaroundCopyNb] = tapeFileMapItor->second; - } else { - m_archiveFile->tapeFiles[copyNbOfTapeFileToAppend] = tapeFileMapItor->second; - } + m_archiveFile->tapeFiles.push_back(tapeFile.tapeFiles.front()); // There could be more tape files so return incomplete return std::unique_ptr<common::dataStructures::ArchiveFile>(); diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index b090af865f14e82b714c8224e0f228a06932a599..bd9947300150631130c6caeb13550b0ccc2f61fd 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -6451,7 +6451,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId) { ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -6502,7 +6502,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId) { auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -6512,7 +6512,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId) { auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -6708,7 +6708,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -6759,7 +6759,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa const auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -6769,7 +6769,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa const auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -6830,7 +6830,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa const auto copyNbToTapeFile1Itor = queueCriteria.archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == queueCriteria.archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -6841,7 +6841,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa const auto copyNbToTapeFile2Itor = queueCriteria.archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == queueCriteria.archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -6864,7 +6864,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa const auto copyNbToTapeFile2Itor = queueCriteria.archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == queueCriteria.archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -7369,7 +7369,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) { ASSERT_EQ(searchCriteria.diskFileGroup, archiveFile.diskFileInfo.group); ASSERT_EQ(searchCriteria.storageClass, archiveFile.storageClass); ASSERT_EQ(1, archiveFile.tapeFiles.size()); - ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->second.vid); + ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->vid); } { @@ -7423,28 +7423,26 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) { { const auto it = archiveFile.tapeFiles.find(1); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten1.vid, it->second.vid); - ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten1.blockId, it->second.blockId); - ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten1.copyNb, it->first); + ASSERT_EQ(fileWritten1.vid, it->vid); + ASSERT_EQ(fileWritten1.fSeq, it->fSeq); + ASSERT_EQ(fileWritten1.blockId, it->blockId); + ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten1.checksumType, it->checksumType); + ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten1.copyNb, it->copyNb); } // Tape copy 2 { const auto it = archiveFile.tapeFiles.find(2); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten2.vid, it->second.vid); - ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten2.blockId, it->second.blockId); - ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten2.copyNb, it->first); + ASSERT_EQ(fileWritten2.vid, it->vid); + ASSERT_EQ(fileWritten2.fSeq, it->fSeq); + ASSERT_EQ(fileWritten2.blockId, it->blockId); + ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten2.checksumType, it->checksumType); + ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten2.copyNb, it->copyNb); } } } @@ -7501,28 +7499,26 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) { { const auto it = archiveFile.tapeFiles.find(1); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten1.vid, it->second.vid); - ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten1.blockId, it->second.blockId); - ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten1.copyNb, it->first); + ASSERT_EQ(fileWritten1.vid, it->vid); + ASSERT_EQ(fileWritten1.fSeq, it->fSeq); + ASSERT_EQ(fileWritten1.blockId, it->blockId); + ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten1.checksumType, it->checksumType); + ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten1.copyNb, it->copyNb); } // Tape copy 2 { const auto it = archiveFile.tapeFiles.find(2); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten2.vid, it->second.vid); - ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten2.blockId, it->second.blockId); - ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten2.copyNb, it->first); + ASSERT_EQ(fileWritten2.vid, it->vid); + ASSERT_EQ(fileWritten2.fSeq, it->fSeq); + ASSERT_EQ(fileWritten2.blockId, it->blockId); + ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten2.checksumType, it->checksumType); + ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten2.copyNb, it->copyNb); } } } @@ -7579,14 +7575,13 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) { { const auto it = archiveFile.tapeFiles.find(copyNb); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten.vid, it->second.vid); - ASSERT_EQ(fileWritten.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten.blockId, it->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten.copyNb, it->first); + ASSERT_EQ(fileWritten.vid, it->vid); + ASSERT_EQ(fileWritten.fSeq, it->fSeq); + ASSERT_EQ(fileWritten.blockId, it->blockId); + ASSERT_EQ(fileWritten.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten.checksumType, it->checksumType); + ASSERT_EQ(fileWritten.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten.copyNb, it->copyNb); } } } @@ -7643,14 +7638,13 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) { { const auto it = archiveFile.tapeFiles.find(copyNb); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten.vid, it->second.vid); - ASSERT_EQ(fileWritten.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten.blockId, it->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten.copyNb, it->first); + ASSERT_EQ(fileWritten.vid, it->vid); + ASSERT_EQ(fileWritten.fSeq, it->fSeq); + ASSERT_EQ(fileWritten.blockId, it->blockId); + ASSERT_EQ(fileWritten.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten.checksumType, it->checksumType); + ASSERT_EQ(fileWritten.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten.copyNb, it->copyNb); } } } @@ -7707,14 +7701,13 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) { { const auto it = archiveFile.tapeFiles.find(copyNb); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten.vid, it->second.vid); - ASSERT_EQ(fileWritten.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten.blockId, it->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten.copyNb, it->first); + ASSERT_EQ(fileWritten.vid, it->vid); + ASSERT_EQ(fileWritten.fSeq, it->fSeq); + ASSERT_EQ(fileWritten.blockId, it->blockId); + ASSERT_EQ(fileWritten.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten.checksumType, it->checksumType); + ASSERT_EQ(fileWritten.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten.copyNb, it->copyNb); } } } @@ -8317,7 +8310,7 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_ ASSERT_EQ(searchCriteria.diskFileGroup, archiveFile.diskFileInfo.group); ASSERT_EQ(searchCriteria.storageClass, archiveFile.storageClass); ASSERT_EQ(1, archiveFile.tapeFiles.size()); - ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->second.vid); + ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->vid); } auto afidToSeq = [](const uint64_t l_nbTot, const uint64_t l_batchsize, const uint64_t l_afid, uint64_t &l_seq1, uint64_t &l_seq2) { @@ -8387,28 +8380,26 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_ { const auto it = archiveFile.tapeFiles.find(1); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten1.vid, it->second.vid); - ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten1.blockId, it->second.blockId); - ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten1.copyNb, it->first); + ASSERT_EQ(fileWritten1.vid, it->vid); + ASSERT_EQ(fileWritten1.fSeq, it->fSeq); + ASSERT_EQ(fileWritten1.blockId, it->blockId); + ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten1.checksumType, it->checksumType); + ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten1.copyNb, it->copyNb); } // Tape copy 2 { const auto it = archiveFile.tapeFiles.find(2); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten2.vid, it->second.vid); - ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten2.blockId, it->second.blockId); - ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten2.copyNb, it->first); + ASSERT_EQ(fileWritten2.vid, it->vid); + ASSERT_EQ(fileWritten2.fSeq, it->fSeq); + ASSERT_EQ(fileWritten2.blockId, it->blockId); + ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten2.checksumType, it->checksumType); + ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten2.copyNb, it->copyNb); } } } @@ -8469,28 +8460,26 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_ { const auto it = archiveFile.tapeFiles.find(1); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten1.vid, it->second.vid); - ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten1.blockId, it->second.blockId); - ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten1.copyNb, it->first); + ASSERT_EQ(fileWritten1.vid, it->vid); + ASSERT_EQ(fileWritten1.fSeq, it->fSeq); + ASSERT_EQ(fileWritten1.blockId, it->blockId); + ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten1.checksumType, it->checksumType); + ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten1.copyNb, it->copyNb); } // Tape copy 2 { const auto it = archiveFile.tapeFiles.find(2); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten2.vid, it->second.vid); - ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten2.blockId, it->second.blockId); - ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten2.copyNb, it->first); + ASSERT_EQ(fileWritten2.vid, it->vid); + ASSERT_EQ(fileWritten2.fSeq, it->fSeq); + ASSERT_EQ(fileWritten2.blockId, it->blockId); + ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten2.checksumType, it->checksumType); + ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten2.copyNb, it->copyNb); } } } @@ -8550,14 +8539,13 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_ { const auto it = archiveFile.tapeFiles.find(copyNb); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten.vid, it->second.vid); - ASSERT_EQ(fileWritten.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten.blockId, it->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten.copyNb, it->first); + ASSERT_EQ(fileWritten.vid, it->vid); + ASSERT_EQ(fileWritten.fSeq, it->fSeq); + ASSERT_EQ(fileWritten.blockId, it->blockId); + ASSERT_EQ(fileWritten.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten.checksumType, it->checksumType); + ASSERT_EQ(fileWritten.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten.copyNb, it->copyNb); } } } @@ -8617,14 +8605,13 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_ { const auto it = archiveFile.tapeFiles.find(copyNb); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten.vid, it->second.vid); - ASSERT_EQ(fileWritten.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten.blockId, it->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten.copyNb, it->first); + ASSERT_EQ(fileWritten.vid, it->vid); + ASSERT_EQ(fileWritten.fSeq, it->fSeq); + ASSERT_EQ(fileWritten.blockId, it->blockId); + ASSERT_EQ(fileWritten.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten.checksumType, it->checksumType); + ASSERT_EQ(fileWritten.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten.copyNb, it->copyNb); } } } @@ -8684,14 +8671,13 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_ { const auto it = archiveFile.tapeFiles.find(copyNb); ASSERT_NE(archiveFile.tapeFiles.end(), it); - ASSERT_EQ(fileWritten.vid, it->second.vid); - ASSERT_EQ(fileWritten.fSeq, it->second.fSeq); - ASSERT_EQ(fileWritten.blockId, it->second.blockId); - ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize); - ASSERT_EQ(fileWritten.checksumType, it->second.checksumType); - ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue); - ASSERT_EQ(fileWritten.copyNb, it->second.copyNb); - ASSERT_EQ(fileWritten.copyNb, it->first); + ASSERT_EQ(fileWritten.vid, it->vid); + ASSERT_EQ(fileWritten.fSeq, it->fSeq); + ASSERT_EQ(fileWritten.blockId, it->blockId); + ASSERT_EQ(fileWritten.compressedSize, it->compressedSize); + ASSERT_EQ(fileWritten.checksumType, it->checksumType); + ASSERT_EQ(fileWritten.checksumValue, it->checksumValue); + ASSERT_EQ(fileWritten.copyNb, it->copyNb); } } } @@ -9018,7 +9004,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -9079,7 +9065,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -9090,7 +9076,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -9247,7 +9233,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -9305,11 +9291,11 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); // If there are two or more tape copies with the same copy number then - // only the last one read out by the database is returned by - // m_catalogue->getArchiveFileById() - ASSERT_EQ(1, archiveFile.tapeFiles.size()); + // only one of them will be active (<=> supersededByVid.empty()). + ASSERT_EQ(1, std::count_if(archiveFile.tapeFiles.begin(), archiveFile.tapeFiles.end(), + [](const cta::common::dataStructures::TapeFile &tf){ return tf.supersededByVid.empty();})); - const auto &tapeFile = archiveFile.tapeFiles.begin()->second; + const auto &tapeFile = *archiveFile.tapeFiles.begin(); ASSERT_TRUE(file1Written.vid == tapeFile.vid || file2Written.vid == tapeFile.vid); @@ -9445,7 +9431,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -9503,11 +9489,11 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group); // If there are two or more tape copies with the same copy number then - // only the last one read out by the database is returned by - // m_catalogue->getArchiveFileById() - ASSERT_EQ(1, archiveFile.tapeFiles.size()); + // only one of them will be active (<=> supersededByVid.empty()). + ASSERT_EQ(1, std::count_if(archiveFile.tapeFiles.begin(), archiveFile.tapeFiles.end(), + [](const cta::common::dataStructures::TapeFile &tf){ return tf.supersededByVid.empty();})); - const auto &tapeFile = archiveFile.tapeFiles.begin()->second; + const auto &tapeFile = *archiveFile.tapeFiles.begin(); ASSERT_TRUE(file1Written.fSeq == tapeFile.fSeq || file2Written.fSeq == tapeFile.fSeq); @@ -9671,7 +9657,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -9853,7 +9839,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10035,7 +10021,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10223,7 +10209,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10251,7 +10237,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10320,7 +10306,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10331,7 +10317,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -10361,7 +10347,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10372,7 +10358,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) { auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -10540,7 +10526,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10568,7 +10554,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10637,7 +10623,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10648,7 +10634,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -10678,7 +10664,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -10689,7 +10675,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2); ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second; + const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor; ASSERT_EQ(file2Written.vid, tapeFile2.vid); ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq); ASSERT_EQ(file2Written.blockId, tapeFile2.blockId); @@ -11032,7 +11018,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) { ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -11255,7 +11241,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file) { ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -11419,7 +11405,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_su ASSERT_EQ(1, archiveFile.tapeFiles.size()); auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1); ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end()); - const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second; + const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor; ASSERT_EQ(file1Written.vid, tapeFile1.vid); ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq); ASSERT_EQ(file1Written.blockId, tapeFile1.blockId); @@ -11488,6 +11474,15 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_su file1WrittenAgain.tapeDrive = tapeDrive; m_catalogue->filesWrittenToTape(file1WrittenAgainSet); + common::dataStructures::ArchiveFile repackedFile = m_catalogue->getArchiveFileById(archiveFileId); + ASSERT_EQ(2, repackedFile.tapeFiles.size()); + for (auto &tf: repackedFile.tapeFiles) { + if (tf.vid == vid1) + ASSERT_EQ(vid2, tf.supersededByVid); + else + ASSERT_EQ("", tf.supersededByVid); + } + ASSERT_NO_THROW(m_catalogue->reclaimTape(m_admin, vid1)); { diff --git a/catalogue/MysqlCatalogue.cpp b/catalogue/MysqlCatalogue.cpp index e947f024afdf02bcc6de7d50b79effef7743586f..b27d7095290dcb78e7e0c7ac23d9d7d2096dd417 100644 --- a/catalogue/MysqlCatalogue.cpp +++ b/catalogue/MysqlCatalogue.cpp @@ -406,7 +406,9 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -455,10 +457,14 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons tapeFile.compressedSize = selectRset.columnUint64("COMPRESSED_SIZE_IN_BYTES"); tapeFile.copyNb = selectRset.columnUint64("COPY_NB"); tapeFile.creationTime = selectRset.columnUint64("TAPE_FILE_CREATION_TIME"); + if (!selectRset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = selectRset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = selectRset.columnUint64("SSBY_FSEQ"); + } tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience - archiveFile->tapeFiles[selectRset.columnUint64("COPY_NB")] = tapeFile; + archiveFile->tapeFiles.push_back(tapeFile); } } @@ -489,15 +495,17 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons .add("selectFromArchiveFileTime", selectFromArchiveFileTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that " @@ -555,15 +563,17 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::INFO, "Archive file deleted from CTA catalogue"); diff --git a/catalogue/OracleCatalogue.cpp b/catalogue/OracleCatalogue.cpp index 687d8f53eef26872cc5bd2762663c93768577c5c..7346a53daced7569fdd56354f96d1e7a1ba033b2 100644 --- a/catalogue/OracleCatalogue.cpp +++ b/catalogue/OracleCatalogue.cpp @@ -772,7 +772,9 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -827,8 +829,12 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con tapeFile.creationTime = selectRset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience - - archiveFile->tapeFiles[selectRset.columnUint64("COPY_NB")] = tapeFile; + if (!selectRset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = selectRset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = selectRset.columnUint64("SSBY_FSEQ"); + } + + archiveFile->tapeFiles.push_back(tapeFile); } } @@ -859,15 +865,17 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con .add("selectFromArchiveFileTime", selectFromArchiveFileTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that " @@ -922,15 +930,17 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::INFO, "Archive file deleted from CTA catalogue"); diff --git a/catalogue/PostgresCatalogue.cpp b/catalogue/PostgresCatalogue.cpp index 56f078add90c36dc471b582c7238e683f467a082..374fcecf05f9a725af08dc2f4e677febede4adbd 100644 --- a/catalogue/PostgresCatalogue.cpp +++ b/catalogue/PostgresCatalogue.cpp @@ -699,7 +699,9 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -752,8 +754,12 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c tapeFile.creationTime = selectRset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience + if (!selectRset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = selectRset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = selectRset.columnUint64("SSBY_FSEQ"); + } - archiveFile->tapeFiles[selectRset.columnUint64("COPY_NB")] = tapeFile; + archiveFile->tapeFiles.push_back(tapeFile); } } @@ -784,15 +790,18 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c .add("selectFromArchiveFileTime", selectFromArchiveFileTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that " @@ -848,15 +857,17 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::INFO, "Archive file deleted from CTA catalogue"); diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index ccd3b89e92b84453d574c53b1e8daa9363aa135c..86f09cfe9651eb9ebfdcc97d88eda2d05850f820 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -4116,7 +4116,9 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getFilesForRepack "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME, " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ," "TAPE.TAPE_POOL_NAME AS TAPE_POOL_NAME " "FROM " "ARCHIVE_FILE " @@ -4163,8 +4165,12 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getFilesForRepack tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile.checksumValue; // Duplicated for convenience + if (!rset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = rset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = rset.columnUint64("SSBY_VID"); + } - archiveFile.tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + archiveFile.tapeFiles.push_back(tapeFile); archiveFiles.push_back(archiveFile); @@ -4911,22 +4917,7 @@ void RdbmsCatalogue::insertTapeFile( const common::dataStructures::TapeFile &tapeFile, const uint64_t archiveFileId) { rdbms::AutoRollback autoRollback(conn); - bool updateSupersededNeeded = false; try{ - { - const char *const sql = - "SELECT VID FROM TAPE_FILE " - "WHERE " - " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND" - " TAPE_FILE.COPY_NB=:COPY_NB"; - auto stmt = conn.createStmt(sql); - stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); - stmt.bindUint64(":COPY_NB",tapeFile.copyNb); - auto result = stmt.executeQuery(); - if(result.next()){ - updateSupersededNeeded = true; - } - } { const time_t now = time(nullptr); const char *const sql = @@ -4955,31 +4946,28 @@ void RdbmsCatalogue::insertTapeFile( stmt.bindUint64(":COPY_NB", tapeFile.copyNb); stmt.bindUint64(":CREATION_TIME", now); stmt.bindUint64(":ARCHIVE_FILE_ID", archiveFileId); - stmt.executeNonQuery(); - if(!updateSupersededNeeded){ - conn.commit(); - } - } + } { - if(updateSupersededNeeded){ - const char *const sql = - "UPDATE TAPE_FILE SET " - "SUPERSEDED_BY_VID=:NEW_VID, " //VID of the new file - "SUPERSEDED_BY_FSEQ=:NEW_FSEQ " //FSEQ of the new file - "WHERE" - " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND" - " TAPE_FILE.COPY_NB=:COPY_NB"; - - auto stmt = conn.createStmt(sql); - stmt.bindString(":NEW_VID",tapeFile.vid); - stmt.bindUint64(":NEW_FSEQ",tapeFile.fSeq); - stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); - stmt.bindUint64(":COPY_NB",tapeFile.copyNb); - stmt.executeNonQuery(); - conn.commit(); - } + const char *const sql = + "UPDATE TAPE_FILE SET " + "SUPERSEDED_BY_VID=:NEW_VID, " //VID of the new file + "SUPERSEDED_BY_FSEQ=:NEW_FSEQ " //FSEQ of the new file + "WHERE" + " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND" + " TAPE_FILE.COPY_NB=:COPY_NB AND" + " ( TAPE_FILE.VID <> :NEW_VID2 OR TAPE_FILE.FSEQ <> :NEW_FSEQ2 )"; + + auto stmt = conn.createStmt(sql); + stmt.bindString(":NEW_VID",tapeFile.vid); + stmt.bindUint64(":NEW_FSEQ",tapeFile.fSeq); + stmt.bindString(":NEW_VID2",tapeFile.vid); + stmt.bindUint64(":NEW_FSEQ2",tapeFile.fSeq); + stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); + stmt.bindUint64(":COPY_NB",tapeFile.copyNb); + stmt.executeNonQuery(); } + conn.commit(); } catch(exception::UserError &) { throw; } catch(exception::Exception &ex) { @@ -5073,7 +5061,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -5118,8 +5108,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience + if (!rset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = rset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ"); + } - archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + archiveFile->tapeFiles.push_back(tapeFile); } } @@ -5157,7 +5151,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -5205,8 +5201,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience - - archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + if (!rset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = rset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ"); + } + + archiveFile->tapeFiles.push_back(tapeFile); } } @@ -5246,7 +5246,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -5293,8 +5295,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience - - archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + if (!rset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = rset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ"); + } + + archiveFile->tapeFiles.push_back(tapeFile); } } @@ -5334,7 +5340,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF "TAPE_FILE.BLOCK_ID AS BLOCK_ID," "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," - "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " + "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME," + "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ " "FROM " "ARCHIVE_FILE " "INNER JOIN STORAGE_CLASS ON " @@ -5384,8 +5392,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience - - archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + if (!rset.columnIsNull("SSBY_VID")) { + tapeFile.supersededByVid = rset.columnString("SSBY_VID"); + tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ"); + } + + archiveFile->tapeFiles.push_back(tapeFile); } } diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp index c3895566e4b60acff18889aa11f01b86156d3b77..c7c0e920a5a0a33f54f4bdc0aa58515356f5f7d1 100644 --- a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp +++ b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp @@ -65,7 +65,7 @@ namespace { tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile.checksumValue; // Duplicated for convenience - archiveFile.tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + archiveFile.tapeFiles.push_back(tapeFile); } return archiveFile; diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp index 7d3ad9a7cff3d541b536cc47164c934f39b1ae99..89cd63aa75cd8783eca9ea7f0fb3f3cbba219032 100644 --- a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp +++ b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp @@ -65,7 +65,7 @@ namespace { tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience tapeFile.checksumValue = archiveFile.checksumValue; // Duplicated for convenience - archiveFile.tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile; + archiveFile.tapeFiles.push_back(tapeFile); } return archiveFile; diff --git a/catalogue/SqliteCatalogue.cpp b/catalogue/SqliteCatalogue.cpp index 47a8e48aa3dff02cdb027f01e0ff2c17f40a8d9d..022143ee3ba2e4a66b74b495c3e352c659ddf55e 100644 --- a/catalogue/SqliteCatalogue.cpp +++ b/catalogue/SqliteCatalogue.cpp @@ -96,15 +96,17 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con .add("getArchiveFileTime", getArchiveFileTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that " @@ -163,15 +165,17 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; - tapeCopyLogStream << "copy number: " << it->first - << " vid: " << it->second.vid - << " fSeq: " << it->second.fSeq - << " blockId: " << it->second.blockId - << " creationTime: " << it->second.creationTime - << " compressedSize: " << it->second.compressedSize - << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field - << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field - << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field + tapeCopyLogStream << "copy number: " << it->copyNb + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " compressedSize: " << it->compressedSize + << " checksumType: " << it->checksumType //this shouldn't be here: repeated field + << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field + << " copyNb: " << it->copyNb //this shouldn't be here: repeated field + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; spc.add("TAPE FILE", tapeCopyLogStream.str()); } lc.log(log::INFO, "Archive file deleted from CTA catalogue"); diff --git a/cmdline/CtaAdminCmd.cpp b/cmdline/CtaAdminCmd.cpp index 29b59b0224914833305288a2278a19806df254a4..4a6be3ab794c8f932b90a823e38a79bc4dcb6b28 100644 --- a/cmdline/CtaAdminCmd.cpp +++ b/cmdline/CtaAdminCmd.cpp @@ -405,10 +405,12 @@ void CtaAdminCmd::printAfLsHeader() << std::setfill(' ') << std::setw(12) << std::right << "size" << ' ' << std::setfill(' ') << std::setw(13) << std::right << "checksum type" << ' ' << std::setfill(' ') << std::setw(14) << std::right << "checksum value" << ' ' - << std::setfill(' ') << std::setw(13) << std::right << "storage class" << ' ' + << std::setfill(' ') << std::setw(16) << std::right << "storage class" << ' ' << std::setfill(' ') << std::setw(8) << std::right << "owner" << ' ' << std::setfill(' ') << std::setw(8) << std::right << "group" << ' ' << std::setfill(' ') << std::setw(13) << std::right << "creation time" << ' ' + << std::setfill(' ') << std::setw(7) << std::right << "ss vid" << ' ' + << std::setfill(' ') << std::setw(7) << std::right << "ss fseq" << ' ' << "path" << TEXT_NORMAL << std::endl; } @@ -425,11 +427,19 @@ void CtaAdminCmd::print(const cta::admin::ArchiveFileLsItem &afls_item) << std::setfill(' ') << std::setw(12) << std::right << afls_item.af().size() << ' ' << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().cs().type() << ' ' << std::setfill(' ') << std::setw(14) << std::right << afls_item.af().cs().value() << ' ' - << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().storage_class() << ' ' + << std::setfill(' ') << std::setw(16) << std::right << afls_item.af().storage_class() << ' ' << std::setfill(' ') << std::setw(8) << std::right << afls_item.af().df().owner() << ' ' << std::setfill(' ') << std::setw(8) << std::right << afls_item.af().df().group() << ' ' - << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().creation_time() << ' ' - << afls_item.af().df().path() + << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().creation_time() << ' '; + + if (afls_item.tf().superseded_by_vid().size()) { + std::cout << std::setfill(' ') << std::setw(7) << std::right << afls_item.tf().superseded_by_vid() << ' ' + << std::setfill(' ') << std::setw(7) << std::right << afls_item.tf().superseded_by_f_seq() << ' '; + } else { + std::cout << std::setfill(' ') << std::setw(7) << std::right << "-" << ' ' + << std::setfill(' ') << std::setw(7) << std::right << "-" << ' '; + } + std::cout << afls_item.af().df().path() << std::endl; } diff --git a/common/dataStructures/ArchiveFile.cpp b/common/dataStructures/ArchiveFile.cpp index c8ee856db28d35af4805bcfe72b2c004bfff4fdb..a822c8d9a9a4920ef1152cd6e099178bf729f1aa 100644 --- a/common/dataStructures/ArchiveFile.cpp +++ b/common/dataStructures/ArchiveFile.cpp @@ -20,6 +20,8 @@ #include "common/dataStructures/utils.hpp" #include "common/exception/Exception.hpp" +#include <algorithm> + namespace cta { namespace common { namespace dataStructures { @@ -56,6 +58,42 @@ bool ArchiveFile::operator!=(const ArchiveFile &rhs) const { return !operator==(rhs); } +//------------------------------------------------------------------------------ +// ArchiveFile::TapeFilesList::at() +//------------------------------------------------------------------------------ +TapeFile& ArchiveFile::TapeFilesList::at(uint32_t copyNb) { + auto ret = std::find_if(begin(), end(), [=](TapeFile& tf){ return tf.isActiveCopyNb(copyNb);}); + if (ret == end()) throw cta::exception::Exception("In ArchiveFile::TapeFilesList::at(): not found."); + return *ret; +} + +//------------------------------------------------------------------------------ +// ArchiveFile::TapeFilesList::at() const +//------------------------------------------------------------------------------ +const TapeFile& ArchiveFile::TapeFilesList::at(uint32_t copyNb) const { + auto ret = std::find_if(cbegin(), cend(), [=](const TapeFile& tf){ return tf.isActiveCopyNb(copyNb);}); + if (ret == end()) throw cta::exception::Exception("In ArchiveFile::TapeFilesList::at(): not found."); + return *ret; +} + +//------------------------------------------------------------------------------ +// ArchiveFile::TapeFilesList::find() +//------------------------------------------------------------------------------ +ArchiveFile::TapeFilesList::iterator ArchiveFile::TapeFilesList::find(uint32_t copyNb) { + return std::find_if(begin(), end(), [=](TapeFile& tf){ return tf.isActiveCopyNb(copyNb);}); +} + +//------------------------------------------------------------------------------ +// ArchiveFile::TapeFilesList::find() const +//------------------------------------------------------------------------------ +ArchiveFile::TapeFilesList::const_iterator ArchiveFile::TapeFilesList::find(uint32_t copyNb) const { + return std::find_if(cbegin(), cend(), [=](const TapeFile& tf){ return tf.isActiveCopyNb(copyNb);}); +} + + + + + //------------------------------------------------------------------------------ // operator<< //------------------------------------------------------------------------------ diff --git a/common/dataStructures/ArchiveFile.hpp b/common/dataStructures/ArchiveFile.hpp index f2875077e5eb02a5ee0e6d3ac82eaf026af19ca5..4f20ea68910091d0a26d2ebe646b0381b32beb40 100644 --- a/common/dataStructures/ArchiveFile.hpp +++ b/common/dataStructures/ArchiveFile.hpp @@ -68,7 +68,15 @@ struct ArchiveFile { * to be listed by the operator. For example, if the listing requested is * for a single tape, the map will contain only one element. */ - std::map<uint32_t,TapeFile> tapeFiles; + class TapeFilesList: public std::list<TapeFile> { + public: + using std::list<TapeFile>::list; + TapeFile & at(uint32_t copyNb); + const TapeFile & at(uint32_t copyNb) const; + TapeFilesList::iterator find(uint32_t copyNb); + TapeFilesList::const_iterator find(uint32_t copyNb) const; + }; + TapeFilesList tapeFiles; time_t creationTime; time_t reconciliationTime; diff --git a/common/dataStructures/ArchiveFileTest.cpp b/common/dataStructures/ArchiveFileTest.cpp index 2ba848c0035793a5e5da5ac791998e9abe0a5257..8522d1f345a08a27b17129283fc2bb5de11cacc4 100644 --- a/common/dataStructures/ArchiveFileTest.cpp +++ b/common/dataStructures/ArchiveFileTest.cpp @@ -19,6 +19,7 @@ #include "common/dataStructures/ArchiveFile.hpp" #include <gtest/gtest.h> +#include <algorithm> namespace unitTests { @@ -56,7 +57,7 @@ TEST_F(cta_common_dataStructures_ArchiveFileTest, copy_constructor) { tapeFile1.compressedSize = 5; tapeFile1.copyNb = 1; - archiveFile1.tapeFiles[1] = tapeFile1; + archiveFile1.tapeFiles.push_back(tapeFile1); ASSERT_EQ(1, archiveFile1.tapeFiles.size()); TapeFile tapeFile2; @@ -66,7 +67,7 @@ TEST_F(cta_common_dataStructures_ArchiveFileTest, copy_constructor) { tapeFile2.compressedSize = 6; tapeFile2.copyNb = 2; - archiveFile1.tapeFiles[2] = tapeFile1; + archiveFile1.tapeFiles.push_back(tapeFile2); ASSERT_EQ(2, archiveFile1.tapeFiles.size()); ArchiveFile archiveFile2; @@ -88,25 +89,25 @@ TEST_F(cta_common_dataStructures_ArchiveFileTest, copy_constructor) { ASSERT_EQ(2, archiveFile2.tapeFiles.size()); { - auto copyNbToTapeFileItor = archiveFile2.tapeFiles.find(1); + auto copyNbToTapeFileItor = std::find_if(archiveFile2.tapeFiles.begin(), archiveFile2.tapeFiles.end(), + [](TapeFile &tf){ return tf.copyNb == 1; }); ASSERT_TRUE(copyNbToTapeFileItor != archiveFile2.tapeFiles.end()); - ASSERT_EQ(1, copyNbToTapeFileItor->first); - ASSERT_EQ(tapeFile1.vid, copyNbToTapeFileItor->second.vid); - ASSERT_EQ(tapeFile1.fSeq, copyNbToTapeFileItor->second.fSeq); - ASSERT_EQ(tapeFile1.blockId, copyNbToTapeFileItor->second.blockId); - ASSERT_EQ(tapeFile1.compressedSize, copyNbToTapeFileItor->second.compressedSize); - ASSERT_EQ(tapeFile1.copyNb, copyNbToTapeFileItor->second.copyNb); + ASSERT_EQ(tapeFile1.vid, copyNbToTapeFileItor->vid); + ASSERT_EQ(tapeFile1.fSeq, copyNbToTapeFileItor->fSeq); + ASSERT_EQ(tapeFile1.blockId, copyNbToTapeFileItor->blockId); + ASSERT_EQ(tapeFile1.compressedSize, copyNbToTapeFileItor->compressedSize); + ASSERT_EQ(tapeFile1.copyNb, copyNbToTapeFileItor->copyNb); } { - auto copyNbToTapeFileItor = archiveFile2.tapeFiles.find(2); + auto copyNbToTapeFileItor = std::find_if(archiveFile2.tapeFiles.begin(), archiveFile2.tapeFiles.end(), + [](TapeFile &tf){ return tf.copyNb == 2; }); ASSERT_TRUE(copyNbToTapeFileItor != archiveFile2.tapeFiles.end()); - ASSERT_EQ(2, copyNbToTapeFileItor->first); - ASSERT_EQ(tapeFile1.vid, copyNbToTapeFileItor->second.vid); - ASSERT_EQ(tapeFile1.fSeq, copyNbToTapeFileItor->second.fSeq); - ASSERT_EQ(tapeFile1.blockId, copyNbToTapeFileItor->second.blockId); - ASSERT_EQ(tapeFile1.compressedSize, copyNbToTapeFileItor->second.compressedSize); - ASSERT_EQ(tapeFile1.copyNb, copyNbToTapeFileItor->second.copyNb); + ASSERT_EQ(tapeFile2.vid, copyNbToTapeFileItor->vid); + ASSERT_EQ(tapeFile2.fSeq, copyNbToTapeFileItor->fSeq); + ASSERT_EQ(tapeFile2.blockId, copyNbToTapeFileItor->blockId); + ASSERT_EQ(tapeFile2.compressedSize, copyNbToTapeFileItor->compressedSize); + ASSERT_EQ(tapeFile2.copyNb, copyNbToTapeFileItor->copyNb); } } diff --git a/common/dataStructures/TapeFile.cpp b/common/dataStructures/TapeFile.cpp index 31ea7b56ae6e2c88bd4dc76a1beca03ad2f6320f..91dc2601aa7886893f65e0f36ee6183088235632 100644 --- a/common/dataStructures/TapeFile.cpp +++ b/common/dataStructures/TapeFile.cpp @@ -53,6 +53,13 @@ bool TapeFile::operator!=(const TapeFile &rhs) const { return !operator==(rhs); } +//------------------------------------------------------------------------------ +// TapeFile::isActiveCopyNb +//------------------------------------------------------------------------------ +bool TapeFile::isActiveCopyNb(uint32_t cnb) const { + return (cnb == copyNb) && supersededByVid.empty(); +} + //------------------------------------------------------------------------------ // operator<< //------------------------------------------------------------------------------ diff --git a/common/dataStructures/TapeFile.hpp b/common/dataStructures/TapeFile.hpp index 7121343503a86866cde31faab55a5cc62b075e06..64f4d350ecba41de67fc322acdc5cece62bafa54 100644 --- a/common/dataStructures/TapeFile.hpp +++ b/common/dataStructures/TapeFile.hpp @@ -79,6 +79,21 @@ struct TapeFile { * The checksum value */ std::string checksumValue; + + /** + * The vid of the tape file superseding this one (or empty string if not) + */ + std::string supersededByVid; + + /** + * The FSeq of the tape file superseding this one (or empty string if not) + */ + uint64_t supersededByFSeq = 0; + + /** + * Returns true if this tape file is both an active (not superseded) tape file and matches the copy number. + */ + bool isActiveCopyNb(uint32_t copyNb) const; }; // struct TapeFile diff --git a/common/dataStructures/utils.cpp b/common/dataStructures/utils.cpp index 689026cd7ca999cfe201dd942b2086c9486618b2..9a1ffde04798eb6665a71c1ba5adea510d488a1e 100644 --- a/common/dataStructures/utils.cpp +++ b/common/dataStructures/utils.cpp @@ -22,10 +22,10 @@ namespace cta { namespace common { namespace dataStructures { -std::ostream &operator<<(std::ostream &os, const std::map<uint32_t,TapeFile> &map) { +std::ostream &operator<<(std::ostream &os, const std::list<TapeFile> &list) { os << "("; - for(auto it = map.begin(); it != map.end(); it++) { - os << " key=" << it->first << " value=" << it->second << " "; + for(auto & af: list) { + os << af << " "; } os << ")"; return os; diff --git a/common/dataStructures/utils.hpp b/common/dataStructures/utils.hpp index c3e989a42d4c198ae7ecd8595823986fc42a08e9..cdc92790094274857f8de59bdab6811115c307cd 100644 --- a/common/dataStructures/utils.hpp +++ b/common/dataStructures/utils.hpp @@ -27,7 +27,7 @@ namespace cta { namespace common { namespace dataStructures { -std::ostream &operator<<(std::ostream &os, const std::map<uint32_t,TapeFile> &map); +std::ostream &operator<<(std::ostream &os, const std::list<TapeFile> &map); std::ostream &operator<<(std::ostream &os, const std::map<uint64_t,std::string> &map); std::ostream &operator<<(std::ostream &os, const std::pair<std::string,std::string> &pair); std::ostream &operator<<(std::ostream &os, const std::map<uint64_t,std::pair<std::string,std::string>> &map); diff --git a/objectstore/AlgorithmsTest.cpp b/objectstore/AlgorithmsTest.cpp index e14cb4c4b325bba59cd7e9257ea26943644a4abb..94999d4ed2645e11a3c76dcadaccd6439a10d3c0 100644 --- a/objectstore/AlgorithmsTest.cpp +++ b/objectstore/AlgorithmsTest.cpp @@ -58,13 +58,17 @@ void fillRetrieveRequests( rqc.archiveFile.diskInstance = "eoseos"; rqc.archiveFile.fileSize = 1000 + i; rqc.archiveFile.storageClass = "sc"; - rqc.archiveFile.tapeFiles[1].blockId = 0; - rqc.archiveFile.tapeFiles[1].compressedSize = 1; - rqc.archiveFile.tapeFiles[1].compressedSize = 1; - rqc.archiveFile.tapeFiles[1].copyNb = 1; - rqc.archiveFile.tapeFiles[1].creationTime = time(nullptr); - rqc.archiveFile.tapeFiles[1].fSeq = i; - rqc.archiveFile.tapeFiles[1].vid = "Tape0"; + { + cta::common::dataStructures::TapeFile tf; + tf.blockId = 0; + tf.compressedSize = 1; + tf.compressedSize = 1; + tf.copyNb = 1; + tf.creationTime = time(nullptr); + tf.fSeq = i; + tf.vid = "Tape0"; + rqc.archiveFile.tapeFiles.push_back(tf); + } rqc.mountPolicy.archiveMinRequestAge = 1; rqc.mountPolicy.archivePriority = 1; rqc.mountPolicy.creationLog.time = time(nullptr); diff --git a/objectstore/ArchiveFileSerDeser.hpp b/objectstore/ArchiveFileSerDeser.hpp index 2d30c6cfa3f3d0311b635047427d8ac7efedd543..3e3d205df2afb50e0bbf0dd20983ae8f7ed7f867 100644 --- a/objectstore/ArchiveFileSerDeser.hpp +++ b/objectstore/ArchiveFileSerDeser.hpp @@ -54,7 +54,7 @@ public: osaf.set_reconciliationtime(reconciliationTime); osaf.set_storageclass(storageClass); for (auto & tf: tapeFiles) - TapeFileSerDeser(tf.second).serialize(*osaf.add_tapefiles()); + TapeFileSerDeser(tf).serialize(*osaf.add_tapefiles()); } void deserialize (const cta::objectstore::serializers::ArchiveFile & osaf) { @@ -75,7 +75,7 @@ public: for (auto tf: osaf.tapefiles()) { TapeFileSerDeser tfsd; tfsd.deserialize(tf); - tapeFiles[tfsd.copyNb]=tfsd; + tapeFiles.push_back(tfsd); } } }; diff --git a/objectstore/GarbageCollector.cpp b/objectstore/GarbageCollector.cpp index cc7148e699724d05083adec9559bb0d46bc76b42..1d49ac4a9ed66b170a2a764691c563e3c5153edf 100644 --- a/objectstore/GarbageCollector.cpp +++ b/objectstore/GarbageCollector.cpp @@ -330,14 +330,17 @@ void GarbageCollector::OwnedObjectSorter::sortFetchedObjects(Agent& agent, std:: std::set<std::string> candidateVids; for (auto & j: rr->dumpJobs()) { if(j.status==RetrieveJobStatus::RJS_ToTransferForUser) { - candidateVids.insert(rr->getArchiveFile().tapeFiles.at(j.copyNb).vid); + for (auto &tf: rr->getArchiveFile().tapeFiles) { + if ((tf.copyNb == j.copyNb) && (tf.supersededByVid.empty())) + candidateVids.insert(tf.vid); + } } } // Small parenthesis for non transfer cases. if (candidateVids.empty()) { // The request might need to be added to the failed to report of failed queue/container. try { - retrieveQueuesAndRequests[std::make_tuple(rr->getArchiveFile().tapeFiles.begin()->second.vid, rr->getQueueType())].emplace_back(rr); + retrieveQueuesAndRequests[std::make_tuple(rr->getArchiveFile().tapeFiles.begin()->vid, rr->getQueueType())].emplace_back(rr); } catch (cta::exception::Exception & ex) { log::ScopedParamContainer params3(lc); params3.add("fileId", rr->getArchiveFile().archiveFileID) @@ -363,7 +366,7 @@ void GarbageCollector::OwnedObjectSorter::sortFetchedObjects(Agent& agent, std:: // Find copyNb for logging size_t copyNb = std::numeric_limits<size_t>::max(); uint64_t fSeq = std::numeric_limits<uint64_t>::max(); - for (auto & tc: rr->getArchiveFile().tapeFiles) { if (tc.second.vid==vid) { copyNb=tc.first; fSeq=tc.second.fSeq; } } + for (auto & tc: rr->getArchiveFile().tapeFiles) { if (tc.vid==vid) { copyNb=tc.copyNb; fSeq=tc.fSeq; } } params3.add("fileId", rr->getArchiveFile().archiveFileID) .add("copyNb", copyNb) .add("tapeVid", vid) @@ -553,8 +556,8 @@ void GarbageCollector::OwnedObjectSorter::lockFetchAndUpdateRetrieveJobs(Agent& for (auto & rr: currentJobBatch) { // Determine the copy number and feed the queue with it. for (auto &tf: rr->getArchiveFile().tapeFiles) { - if (tf.second.vid == vid) { - jta.push_back({tf.second.copyNb, tf.second.fSeq, rr->getAddressIfSet(), rr->getArchiveFile().fileSize, + if (tf.vid == vid) { + jta.push_back({tf.copyNb, tf.fSeq, rr->getAddressIfSet(), rr->getArchiveFile().fileSize, rr->getRetrieveFileQueueCriteria().mountPolicy, rr->getEntryLog().time}); } } @@ -579,11 +582,11 @@ void GarbageCollector::OwnedObjectSorter::lockFetchAndUpdateRetrieveJobs(Agent& std::list<RRUpdatedParams> rrUpdatersParams; for (auto & rr: currentJobBatch) { for (auto & tf: rr->getArchiveFile().tapeFiles) { - if (tf.second.vid == vid) { + if (tf.vid == vid) { rrUpdatersParams.emplace_back(); rrUpdatersParams.back().retrieveRequest = rr; - rrUpdatersParams.back().copyNb = tf.second.copyNb; - rrUpdatersParams.back().updater.reset(rr->asyncUpdateJobOwner(tf.second.copyNb, + rrUpdatersParams.back().copyNb = tf.copyNb; + rrUpdatersParams.back().updater.reset(rr->asyncUpdateJobOwner(tf.copyNb, rq.getAddressIfSet(), agent.getAddressIfSet())); } } diff --git a/objectstore/GarbageCollectorTest.cpp b/objectstore/GarbageCollectorTest.cpp index 3696db6ca5c8a3048c3e5588e700b391ced4a906..82b2348ac59ca17bacaeae22aaa5531189d20d48 100644 --- a/objectstore/GarbageCollectorTest.cpp +++ b/objectstore/GarbageCollectorTest.cpp @@ -559,20 +559,28 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { rqc.archiveFile.diskInstance = "eoseos"; rqc.archiveFile.fileSize = 1000 + pass; rqc.archiveFile.storageClass = "sc"; - rqc.archiveFile.tapeFiles[1].blockId=0; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].copyNb=1; - rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr); - rqc.archiveFile.tapeFiles[1].fSeq=pass; - rqc.archiveFile.tapeFiles[1].vid="Tape0"; - rqc.archiveFile.tapeFiles[2].blockId=0; - rqc.archiveFile.tapeFiles[2].compressedSize=1; - rqc.archiveFile.tapeFiles[2].compressedSize=1; - rqc.archiveFile.tapeFiles[2].copyNb=2; - rqc.archiveFile.tapeFiles[2].creationTime=time(nullptr); - rqc.archiveFile.tapeFiles[2].fSeq=pass; - rqc.archiveFile.tapeFiles[2].vid="Tape1"; + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=1; + tf.compressedSize=1; + tf.copyNb=1; + tf.creationTime=time(nullptr); + tf.fSeq=pass; + tf.vid="Tape0"; + rqc.archiveFile.tapeFiles.push_back(tf); + } + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=1; + tf.compressedSize=1; + tf.copyNb=2; + tf.creationTime=time(nullptr); + tf.fSeq=pass; + tf.vid="Tape1"; + rqc.archiveFile.tapeFiles.push_back(tf); + } rqc.mountPolicy.archiveMinRequestAge = 1; rqc.mountPolicy.archivePriority = 1; rqc.mountPolicy.creationLog.time = time(nullptr); @@ -598,7 +606,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) { cta::objectstore::ScopedExclusiveLock rql(rq); rq.fetch(); std::list <cta::objectstore::RetrieveQueue::JobToAdd> jta; - jta.push_back({1,rqc.archiveFile.tapeFiles[1].fSeq, rr.getAddressIfSet(), rqc.archiveFile.fileSize, rqc.mountPolicy, sReq.creationLog.time}); + jta.push_back({1,rqc.archiveFile.tapeFiles.front().fSeq, rr.getAddressIfSet(), rqc.archiveFile.fileSize, rqc.mountPolicy, sReq.creationLog.time}); rq.addJobsAndCommit(jta, agentRef, lc); } if (pass < 5) { pass++; continue; } diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp index cef85a9fb649b077840ea9949080dee964c50c4f..f0b770566cc81be48bc279c586133a3455d558f6 100644 --- a/objectstore/Helpers.cpp +++ b/objectstore/Helpers.cpp @@ -407,7 +407,10 @@ std::string Helpers::selectBestRetrieveQueue(const std::set<std::string>& candid auto tapeStatus=catalogue.getTapesByVid({v}); // Build a minimal service retrieve file queue criteria to query queues. common::dataStructures::RetrieveFileQueueCriteria rfqc; - rfqc.archiveFile.tapeFiles[1].vid=v; + common::dataStructures::TapeFile tf; + tf.copyNb = 1; + tf.vid = v; + rfqc.archiveFile.tapeFiles.push_back(tf); auto queuesStats=Helpers::getRetrieveQueueStatistics(rfqc, {v}, objectstore); // We now have the data we need. Update the cache. grqsmLock.lock(); @@ -504,14 +507,14 @@ std::list<SchedulerDatabase::RetrieveQueueStatistics> Helpers::getRetrieveQueueS re.fetch(); rel.release(); for (auto &tf:criteria.archiveFile.tapeFiles) { - if (!vidsToConsider.count(tf.second.vid)) + if (!vidsToConsider.count(tf.vid)) continue; std::string rqAddr; try { - std::string rqAddr = re.getRetrieveQueueAddress(tf.second.vid, JobQueueType::JobsToTransferForUser); + std::string rqAddr = re.getRetrieveQueueAddress(tf.vid, JobQueueType::JobsToTransferForUser); } catch (cta::exception::Exception &) { ret.push_back(SchedulerDatabase::RetrieveQueueStatistics()); - ret.back().vid=tf.second.vid; + ret.back().vid=tf.vid; ret.back().bytesQueued=0; ret.back().currentPriority=0; ret.back().filesQueued=0; @@ -521,7 +524,7 @@ std::list<SchedulerDatabase::RetrieveQueueStatistics> Helpers::getRetrieveQueueS ScopedSharedLock rql(rq); rq.fetch(); rql.release(); - if (rq.getVid() != tf.second.vid) + if (rq.getVid() != tf.vid) throw cta::exception::Exception("In OStoreDB::getRetrieveQueueStatistics(): unexpected vid for retrieve queue"); ret.push_back(SchedulerDatabase::RetrieveQueueStatistics()); ret.back().vid=rq.getVid(); diff --git a/objectstore/RetrieveRequest.cpp b/objectstore/RetrieveRequest.cpp index 035a4e09f68879f2bff0d3a375e15a34e09aa5d1..3dc1365dedb7a7dfdee5787090d7b9ccf5b9750c 100644 --- a/objectstore/RetrieveRequest.cpp +++ b/objectstore/RetrieveRequest.cpp @@ -427,7 +427,7 @@ void RetrieveRequest::setRetrieveFileQueueCriteria(const cta::common::dataStruct const uint32_t hardcodedRetriesWithinMount = 3; const uint32_t hardcodedTotalRetries = 6; const uint32_t hardcodedReportRetries = 2; - addJob(tf.second.copyNb, hardcodedRetriesWithinMount, hardcodedTotalRetries, hardcodedReportRetries); + addJob(tf.copyNb, hardcodedRetriesWithinMount, hardcodedTotalRetries, hardcodedReportRetries); } } diff --git a/objectstore/Sorter.cpp b/objectstore/Sorter.cpp index e668121da69e52b69d5dc1cc39d982a2f490a2e4..606e3fa04164191107b65a2f351dba22c2317a7d 100644 --- a/objectstore/Sorter.cpp +++ b/objectstore/Sorter.cpp @@ -238,7 +238,7 @@ void Sorter::insertRetrieveRequest(RetrieveRequestInfosAccessorInterface& access std::string bestVid = getBestVidForQueueingRetrieveRequest(accessor, candidateVidsToTransfer ,lc); for (auto & tf: accessor.getArchiveFile().tapeFiles) { - if (tf.second.vid == bestVid) { + if (tf.vid == bestVid) { goto vidFound; } } @@ -253,7 +253,7 @@ void Sorter::insertRetrieveRequest(RetrieveRequestInfosAccessorInterface& access log::ScopedParamContainer params(lc); size_t copyNb = std::numeric_limits<size_t>::max(); uint64_t fSeq = std::numeric_limits<uint64_t>::max(); - for (auto & tc: accessor.getArchiveFile().tapeFiles) { if (tc.second.vid==bestVid) { copyNb=tc.first; fSeq=tc.second.fSeq; } } + for (auto & tc: accessor.getArchiveFile().tapeFiles) { if (tc.vid==bestVid) { copyNb=tc.copyNb; fSeq=tc.fSeq; } } cta::common::dataStructures::ArchiveFile archiveFile = accessor.getArchiveFile(); try{ Sorter::RetrieveJob jobToAdd = accessor.createRetrieveJob(archiveFile,copyNb,fSeq,&previousOwner); @@ -282,7 +282,7 @@ void Sorter::insertRetrieveRequest(RetrieveRequestInfosAccessorInterface& access log::ScopedParamContainer params(lc); auto rjqi = std::make_shared<RetrieveJobQueueInfo>(); cta::common::dataStructures::ArchiveFile archiveFile = accessor.getArchiveFile(); - cta::common::dataStructures::TapeFile jobTapeFile = archiveFile.tapeFiles[copyNb.value()]; + cta::common::dataStructures::TapeFile jobTapeFile = archiveFile.tapeFiles.at(copyNb.value()); try{ Sorter::RetrieveJob jobToAdd = accessor.createRetrieveJob(archiveFile,jobTapeFile.copyNb,jobTapeFile.fSeq,&previousOwner); rjqi->jobToQueue = std::make_tuple(jobToAdd,std::promise<void>()); diff --git a/objectstore/SorterTest.cpp b/objectstore/SorterTest.cpp index f4c39139ffc4c4b283b052c7bc696fe1d12c55fe..f1914d9030f237058ad5a9a4be154046ad2f7a49 100644 --- a/objectstore/SorterTest.cpp +++ b/objectstore/SorterTest.cpp @@ -239,20 +239,28 @@ TEST(ObjectStore,SorterInsertRetrieveRequest){ rqc.archiveFile.diskInstance = "eoseos"; rqc.archiveFile.fileSize = 1000; rqc.archiveFile.storageClass = "sc"; - rqc.archiveFile.tapeFiles[1].blockId=0; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].copyNb=1; - rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr); - rqc.archiveFile.tapeFiles[1].fSeq=2; - rqc.archiveFile.tapeFiles[1].vid="Tape0"; - rqc.archiveFile.tapeFiles[2].blockId=0; - rqc.archiveFile.tapeFiles[2].compressedSize=2; - rqc.archiveFile.tapeFiles[2].compressedSize=2; - rqc.archiveFile.tapeFiles[2].copyNb=2; - rqc.archiveFile.tapeFiles[2].creationTime=time(nullptr); - rqc.archiveFile.tapeFiles[2].fSeq=2; - rqc.archiveFile.tapeFiles[2].vid="Tape1"; + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=1; + tf.compressedSize=1; + tf.copyNb=1; + tf.creationTime=time(nullptr); + tf.fSeq=2; + tf.vid="Tape0"; + rqc.archiveFile.tapeFiles.push_back(tf); + } + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=2; + tf.compressedSize=2; + tf.copyNb=2; + tf.creationTime=time(nullptr); + tf.fSeq=2; + tf.vid="Tape1"; + rqc.archiveFile.tapeFiles.push_back(tf); + } rqc.mountPolicy.archiveMinRequestAge = 1; rqc.mountPolicy.archivePriority = 1; rqc.mountPolicy.creationLog.time = time(nullptr); @@ -363,7 +371,7 @@ TEST(ObjectStore,SorterInsertRetrieveRequest){ ASSERT_EQ(aFile.fileSize,rqc.archiveFile.fileSize); ASSERT_EQ(aFile.storageClass,rqc.archiveFile.storageClass); ASSERT_EQ(elt.copyNb,2); - ASSERT_EQ(elt.archiveFile.tapeFiles[2].compressedSize,2); + ASSERT_EQ(elt.archiveFile.tapeFiles.at(2).compressedSize,2); ASSERT_EQ(elt.bytes,1000); ASSERT_EQ(elt.reportType,cta::SchedulerDatabase::RetrieveJob::ReportType::NoReportRequired); ASSERT_EQ(elt.rr.archiveFileID,aFile.archiveFileID); @@ -427,7 +435,7 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){ rr.initialize(); cta::common::dataStructures::RetrieveFileQueueCriteria rqc; rqc.archiveFile.archiveFileID = 1L; - rqc.archiveFile.diskFileId = "eos://diskFile"; + rqc.archiveFile.diskFileId = "eos://diskFile1"; rqc.archiveFile.checksumType = ""; rqc.archiveFile.checksumValue = ""; rqc.archiveFile.creationTime = 0; @@ -436,13 +444,17 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){ rqc.archiveFile.diskInstance = "eoseos"; rqc.archiveFile.fileSize = 1000; rqc.archiveFile.storageClass = "sc"; - rqc.archiveFile.tapeFiles[1].blockId=0; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].copyNb=1; - rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr); - rqc.archiveFile.tapeFiles[1].fSeq=1; - rqc.archiveFile.tapeFiles[1].vid="Tape0"; + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=1; + tf.compressedSize=1; + tf.copyNb=1; + tf.creationTime=time(nullptr); + tf.fSeq=1; + tf.vid="Tape0"; + rqc.archiveFile.tapeFiles.push_back(tf); + } rqc.mountPolicy.archiveMinRequestAge = 1; rqc.mountPolicy.archivePriority = 1; rqc.mountPolicy.creationLog.time = time(nullptr); @@ -467,7 +479,7 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){ rr2.initialize(); cta::common::dataStructures::RetrieveFileQueueCriteria rqc2; rqc2.archiveFile.archiveFileID = 2L; - rqc2.archiveFile.diskFileId = "eos://diskFile"; + rqc2.archiveFile.diskFileId = "eos://diskFile2"; rqc2.archiveFile.checksumType = ""; rqc2.archiveFile.checksumValue = ""; rqc2.archiveFile.creationTime = 0; @@ -476,13 +488,17 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){ rqc2.archiveFile.diskInstance = "eoseos"; rqc2.archiveFile.fileSize = 1000; rqc2.archiveFile.storageClass = "sc"; - rqc2.archiveFile.tapeFiles[1].blockId=0; - rqc2.archiveFile.tapeFiles[1].compressedSize=1; - rqc2.archiveFile.tapeFiles[1].compressedSize=1; - rqc2.archiveFile.tapeFiles[1].copyNb=2; - rqc2.archiveFile.tapeFiles[1].creationTime=time(nullptr); - rqc2.archiveFile.tapeFiles[1].fSeq=2; - rqc2.archiveFile.tapeFiles[1].vid="Tape0"; + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=1; + tf.compressedSize=1; + tf.copyNb=2; + tf.creationTime=time(nullptr); + tf.fSeq=2; + tf.vid="Tape0"; + rqc2.archiveFile.tapeFiles.push_back(tf); + } rqc2.mountPolicy.archiveMinRequestAge = 1; rqc2.mountPolicy.archivePriority = 1; rqc2.mountPolicy.creationLog.time = time(nullptr); @@ -639,13 +655,13 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){ auto& elt = elements.elements.front(); ASSERT_EQ(elt.copyNb,1); - ASSERT_EQ(elt.archiveFile.tapeFiles[1].vid,"Tape0"); - ASSERT_EQ(elt.archiveFile.tapeFiles[1].fSeq,1); + ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).vid,"Tape0"); + ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).fSeq,1); auto& elt2 = elements.elements.back(); ASSERT_EQ(elt2.copyNb,2); - ASSERT_EQ(elt2.archiveFile.tapeFiles[2].vid,"Tape0"); - ASSERT_EQ(elt2.archiveFile.tapeFiles[2].fSeq,2); + ASSERT_EQ(elt2.archiveFile.tapeFiles.at(2).vid,"Tape0"); + ASSERT_EQ(elt2.archiveFile.tapeFiles.at(2).fSeq,2); } { @@ -885,13 +901,17 @@ TEST(ObjectStore,SorterInsertRetrieveRequestNotFetched){ rqc.archiveFile.diskInstance = "eoseos"; rqc.archiveFile.fileSize = 1000; rqc.archiveFile.storageClass = "sc"; - rqc.archiveFile.tapeFiles[1].blockId=0; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].compressedSize=1; - rqc.archiveFile.tapeFiles[1].copyNb=1; - rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr); - rqc.archiveFile.tapeFiles[1].fSeq=1; - rqc.archiveFile.tapeFiles[1].vid="Tape0"; + { + cta::common::dataStructures::TapeFile tf; + tf.blockId=0; + tf.compressedSize=1; + tf.compressedSize=1; + tf.copyNb=1; + tf.creationTime=time(nullptr); + tf.fSeq=1; + tf.vid="Tape0"; + rqc.archiveFile.tapeFiles.push_back(tf); + } rqc.mountPolicy.archiveMinRequestAge = 1; rqc.mountPolicy.archivePriority = 1; rqc.mountPolicy.creationLog.time = time(nullptr); @@ -914,10 +934,10 @@ TEST(ObjectStore,SorterInsertRetrieveRequestNotFetched){ request.archiveFile = rqc.archiveFile; for(auto& tf: request.archiveFile.tapeFiles){ - Sorter::RetrieveJob& job = request.retrieveJobs[tf.first]; - job.fSeq = tf.second.fSeq; + Sorter::RetrieveJob& job = request.retrieveJobs[tf.copyNb]; + job.fSeq = tf.fSeq; job.fileSize = rqc.archiveFile.fileSize; - job.jobDump.copyNb = tf.first; + job.jobDump.copyNb = tf.copyNb; job.jobDump.status = serializers::RetrieveJobStatus::RJS_ToTransferForUser; job.jobQueueType = JobQueueType::JobsToTransferForUser; job.mountPolicy = rqc.mountPolicy; @@ -956,8 +976,8 @@ TEST(ObjectStore,SorterInsertRetrieveRequestNotFetched){ auto& elt = elements.elements.front(); ASSERT_EQ(elt.copyNb,1); - ASSERT_EQ(elt.archiveFile.tapeFiles[1].vid,"Tape0"); - ASSERT_EQ(elt.archiveFile.tapeFiles[1].fSeq,1); + ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).vid,"Tape0"); + ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).fSeq,1); ASSERT_EQ(elt.archiveFile.checksumValue,"checksumValue"); ASSERT_EQ(elt.archiveFile.checksumType,"checksumType"); ASSERT_EQ(elt.archiveFile.diskInstance,"eoseos"); diff --git a/scheduler/OStoreDB/MemQueues.cpp b/scheduler/OStoreDB/MemQueues.cpp index d48ada3f661d78ff3d221e2515c5d589a3ad7f8d..8bef86b8a4aa9cea635a88e2a29d3836a12e1096 100644 --- a/scheduler/OStoreDB/MemQueues.cpp +++ b/scheduler/OStoreDB/MemQueues.cpp @@ -52,11 +52,11 @@ void MemQueue<objectstore::RetrieveRequest, objectstore::RetrieveQueue>::special auto & job = jta.job; auto & request = jta.request; for (auto & j: request.getArchiveFile().tapeFiles) { - if (j.second.copyNb == job.copyNb) { + if (j.copyNb == job.copyNb) { auto criteria = request.getRetrieveFileQueueCriteria(); - jtal.push_back({j.second.copyNb, j.second.fSeq, request.getAddressIfSet(), criteria.archiveFile.fileSize, + jtal.push_back({j.copyNb, j.fSeq, request.getAddressIfSet(), criteria.archiveFile.fileSize, criteria.mountPolicy, request.getEntryLog().time}); - request.setActiveCopyNumber(j.second.copyNb); + request.setActiveCopyNumber(j.copyNb); request.setOwner(queueAddress); goto jobAdded; } diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index 2191f217b0103a40b3f6abdf8e4ccec59d14523e..6f1d126e15838c980ff3e0944b85311fa95680c5 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -1047,13 +1047,13 @@ void OStoreDB::setRetrieveJobBatchReportedToUser(std::list<cta::SchedulerDatabas for(auto &j : queue.second) { auto tf_it = j.job->archiveFile.tapeFiles.begin(); while(tf_it != j.job->archiveFile.tapeFiles.end()) { - if(queue.first == tf_it->second.vid) break; + if(queue.first == tf_it->vid) break; } if(tf_it == j.job->archiveFile.tapeFiles.end()) throw cta::exception::Exception( "In OStoreDB::setRetrieveJobBatchReported(): tape copy not found" ); insertedElements.emplace_back(CaRQF::InsertedElement{ - &j.job->m_retrieveRequest, tf_it->second.copyNb, tf_it->second.fSeq, tf_it->second.compressedSize, + &j.job->m_retrieveRequest, tf_it->copyNb, tf_it->fSeq, tf_it->compressedSize, common::dataStructures::MountPolicy(), serializers::RetrieveJobStatus::RJS_Failed }); } @@ -1089,13 +1089,13 @@ std::string OStoreDB::queueRetrieve(const cta::common::dataStructures::RetrieveR cta::utils::Timer timer; // Get the best vid from the cache std::set<std::string> candidateVids; - for (auto & tf:criteria.archiveFile.tapeFiles) candidateVids.insert(tf.second.vid); + for (auto & tf:criteria.archiveFile.tapeFiles) candidateVids.insert(tf.vid); std::string bestVid=Helpers::selectBestRetrieveQueue(candidateVids, m_catalogue, m_objectStore); // Check that the requested retrieve job (for the provided vid) exists, and record the copynb. uint64_t bestCopyNb; for (auto & tf: criteria.archiveFile.tapeFiles) { - if (tf.second.vid == bestVid) { - bestCopyNb = tf.second.copyNb; + if (tf.vid == bestVid) { + bestCopyNb = tf.copyNb; goto vidFound; } } @@ -1135,7 +1135,7 @@ std::string OStoreDB::queueRetrieve(const cta::common::dataStructures::RetrieveR double agentReferencingTime = timer.secs(cta::utils::Timer::reset_t::resetCounter); rReq->setOwner(m_agentReference->getAgentAddress()); // "Select" an arbitrary copy number. This is needed to serialize the object. - rReq->setActiveCopyNumber(criteria.archiveFile.tapeFiles.begin()->second.copyNb); + rReq->setActiveCopyNumber(criteria.archiveFile.tapeFiles.begin()->copyNb); rReq->insert(); double insertionTime = timer.secs(cta::utils::Timer::reset_t::resetCounter); m_taskQueueSize++; @@ -2149,12 +2149,12 @@ void OStoreDB::RepackRequest::addSubrequests(std::list<Subrequest>& repackSubreq uint32_t activeCopyNumber = 0; // Make sure we have a copy on the vid we intend to repack. for (auto & tc: rsr.archiveFile.tapeFiles) { - if (tc.second.vid == repackInfo.vid) { + if (tc.vid == repackInfo.vid) { try { // Try to select the repack VID from a one-vid list. Helpers::selectBestRetrieveQueue({repackInfo.vid}, m_oStoreDB.m_catalogue, m_oStoreDB.m_objectStore); bestVid = repackInfo.vid; - activeCopyNumber = tc.second.copyNb; + activeCopyNumber = tc.copyNb; } catch (Helpers::NoTapeAvailableForRetrieve &) {} break; } @@ -2162,7 +2162,7 @@ void OStoreDB::RepackRequest::addSubrequests(std::list<Subrequest>& repackSubreq // The repack vid was not appropriate, let's try all candidates. if (bestVid.empty()) { std::set<std::string> candidateVids; - for (auto & tc: rsr.archiveFile.tapeFiles) candidateVids.insert(tc.second.vid); + for (auto & tc: rsr.archiveFile.tapeFiles) candidateVids.insert(tc.vid); try { bestVid = Helpers::selectBestRetrieveQueue(candidateVids, m_oStoreDB.m_catalogue, m_oStoreDB.m_objectStore); } catch (Helpers::NoTapeAvailableForRetrieve &) { @@ -2179,8 +2179,8 @@ void OStoreDB::RepackRequest::addSubrequests(std::list<Subrequest>& repackSubreq } } for (auto &tc: rsr.archiveFile.tapeFiles) - if (tc.second.vid == bestVid) { - activeCopyNumber = tc.second.copyNb; + if (tc.vid == bestVid) { + activeCopyNumber = tc.copyNb; goto copyNbFound; } { @@ -3468,7 +3468,7 @@ void OStoreDB::RetrieveMount::flushAsyncSuccessReports(std::list<cta::SchedulerD std::map<objectstore::RetrieveRequest *, OStoreDB::RetrieveJob *> requestToJobMap; for (auto & req: repackRequestQueue.second) { insertedRequests.push_back(RQTRTRFSAlgo::InsertedElement{&req->m_retrieveRequest, req->selectedCopyNb, - req->archiveFile.tapeFiles[req->selectedCopyNb].fSeq, req->archiveFile.fileSize, + req->archiveFile.tapeFiles.at(req->selectedCopyNb).fSeq, req->archiveFile.fileSize, cta::common::dataStructures::MountPolicy::s_defaultMountPolicyForRepack, serializers::RetrieveJobStatus::RJS_ToReportToRepackForSuccess}); requestToJobMap[&req->m_retrieveRequest] = req; @@ -4264,8 +4264,8 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log:: std::set<std::string> candidateVids; for(auto &tf: af.tapeFiles) { - if(m_retrieveRequest.getJobStatus(tf.second.copyNb) == serializers::RetrieveJobStatus::RJS_ToReportToUserForFailure) - candidateVids.insert(tf.second.vid); + if(m_retrieveRequest.getJobStatus(tf.copyNb) == serializers::RetrieveJobStatus::RJS_ToReportToUserForFailure) + candidateVids.insert(tf.vid); } if(candidateVids.empty()) { throw cta::exception::Exception( @@ -4278,14 +4278,14 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log:: m_oStoreDB.m_objectStore); auto tf_it = af.tapeFiles.begin(); - for( ; tf_it != af.tapeFiles.end() && tf_it->second.vid != bestVid; ++tf_it) ; + for( ; tf_it != af.tapeFiles.end() && tf_it->vid != bestVid; ++tf_it) ; if(tf_it == af.tapeFiles.end()) { std::stringstream err; err << "In OStoreDB::RetrieveJob::failTransfer(): no tape file for requested vid." << " archiveId=" << af.archiveFileID << " vid=" << bestVid; throw RetrieveRequestHasNoCopies(err.str()); } - auto &tf = tf_it->second; + auto &tf = *tf_it; CaRqtr::InsertedElement::list insertedElements; insertedElements.push_back(CaRqtr::InsertedElement{ @@ -4328,8 +4328,8 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log:: std::set<std::string> candidateVids; for(auto &tf : af.tapeFiles) { - if(m_retrieveRequest.getJobStatus(tf.second.copyNb) == serializers::RetrieveJobStatus::RJS_ToTransferForUser) - candidateVids.insert(tf.second.vid); + if(m_retrieveRequest.getJobStatus(tf.copyNb) == serializers::RetrieveJobStatus::RJS_ToTransferForUser) + candidateVids.insert(tf.vid); } if(candidateVids.empty()) { throw cta::exception::Exception( @@ -4344,14 +4344,14 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log:: m_oStoreDB.m_objectStore); auto tf_it = af.tapeFiles.begin(); - for( ; tf_it != af.tapeFiles.end() && tf_it->second.vid != bestVid; ++tf_it) ; + for( ; tf_it != af.tapeFiles.end() && tf_it->vid != bestVid; ++tf_it) ; if(tf_it == af.tapeFiles.end()) { std::stringstream err; err << "In OStoreDB::RetrieveJob::failTransfer(): no tape file for requested vid." << " archiveId=" << af.archiveFileID << " vid=" << bestVid; throw RetrieveRequestHasNoCopies(err.str()); } - auto &tf = tf_it->second; + auto &tf = *tf_it; CaRqtr::InsertedElement::list insertedElements; insertedElements.push_back(CaRqtr::InsertedElement{ @@ -4399,9 +4399,7 @@ void OStoreDB::RetrieveJob::failReport(const std::string &failureReason, log::Lo auto &af = rfqc.archiveFile; // Handle report failures for all tape copies in turn - for(auto &aftf: af.tapeFiles) { - auto &tf = aftf.second; - + for(auto &tf: af.tapeFiles) { // Add a job failure and decide what to do next EnqueueingNextStep enQueueingNextStep = m_retrieveRequest.addReportFailure(tf.copyNb, m_mountId, failureReason, lc); diff --git a/scheduler/OStoreDB/QueueItor.cpp b/scheduler/OStoreDB/QueueItor.cpp index d07bed698c16cc92d40530776886efb5c93e358e..dee57e6f037cf06c6c45e8f43fe7b7eaf396db27 100644 --- a/scheduler/OStoreDB/QueueItor.cpp +++ b/scheduler/OStoreDB/QueueItor.cpp @@ -204,13 +204,13 @@ getQueueJobs(const jobQueue_t &jobQueueChunk) // Find the copy for this Volume ID for(auto &tf: osrr.first.getArchiveFile().tapeFiles) { - if(tf.second.vid == m_jobQueuesQueueIt->vid) { + if(tf.vid == m_jobQueuesQueueIt->vid) { auto job = cta::common::dataStructures::RetrieveJob(); - job.request = osrr.first.getSchedulerRequest(); - job.fileSize = osrr.first.getArchiveFile().fileSize; - job.tapeCopies[tf.second.vid] = std::make_pair(tf.second.copyNb, tf.second); - job.failurelogs = osrr.first.getFailures(); + job.request = osrr.first.getSchedulerRequest(); + job.fileSize = osrr.first.getArchiveFile().fileSize; + job.tapeCopies[tf.vid] = std::make_pair(tf.copyNb, tf); + job.failurelogs = osrr.first.getFailures(); m_jobCache.push_back(job); } diff --git a/scheduler/RetrieveJob.cpp b/scheduler/RetrieveJob.cpp index 21900bc27437670280eec013512ac9126b84a7e0..567119857c1b63b43f929f391077acd78987fbf2 100644 --- a/scheduler/RetrieveJob.cpp +++ b/scheduler/RetrieveJob.cpp @@ -84,22 +84,12 @@ void cta::RetrieveJob::transferFailed(const std::string &failureReason, log::Log // selectedTapeFile //------------------------------------------------------------------------------ cta::common::dataStructures::TapeFile& cta::RetrieveJob::selectedTapeFile() { - try { - return archiveFile.tapeFiles.at(selectedCopyNb); - } catch (std::out_of_range &ex) { - auto __attribute__((__unused__)) & debug=ex; - throw std::runtime_error(std::string("cta::RetrieveJob::selectedTapeFile(): ") + ex.what()); - } + return archiveFile.tapeFiles.at(selectedCopyNb); } //------------------------------------------------------------------------------ // selectedTapeFile //------------------------------------------------------------------------------ const cta::common::dataStructures::TapeFile& cta::RetrieveJob::selectedTapeFile() const { - try { - return archiveFile.tapeFiles.at(selectedCopyNb); - } catch (std::out_of_range &ex) { - auto __attribute__((__unused__)) & debug=ex; - throw std::runtime_error(std::string("cta::RetrieveJob::selectedTapeFile(): ") + ex.what()); - } + return archiveFile.tapeFiles.at(selectedCopyNb); } diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp index 6751f0c30dec003c1312b3e12e76064ca4619c64..f2f9b67d2b58e81043a2291455ca7e567798960e 100644 --- a/scheduler/Scheduler.cpp +++ b/scheduler/Scheduler.cpp @@ -238,8 +238,8 @@ void Scheduler::queueRetrieve( .add("storageClass", queueCriteria.archiveFile.storageClass); for (auto & tf:queueCriteria.archiveFile.tapeFiles) { std::stringstream tc; - tc << "tapeCopy" << tf.first; - spc.add(tc.str(), tf.second); + tc << "tapeCopy" << tf.copyNb; + spc.add(tc.str(), tf); } spc.add("selectedVid", selectedVid) .add("catalogueTime", catalogueTime) @@ -464,13 +464,13 @@ void Scheduler::expandRepackRequest(std::unique_ptr<RepackRequest>& repackReques // We have to determine which copynbs we want to rearchive, and under which fSeq we record this file. if (repackInfo.type == RepackType::MoveAndAddCopies || repackInfo.type == RepackType::MoveOnly) { // determine which fSeq(s) (normally only one) lives on this tape. - for (auto & tc: archiveFile.tapeFiles) if (tc.second.vid == repackInfo.vid) { - rsr.copyNbsToRearchive.insert(tc.second.copyNb); + for (auto & tc: archiveFile.tapeFiles) if (tc.vid == repackInfo.vid) { + rsr.copyNbsToRearchive.insert(tc.copyNb); // We make the (reasonable) assumption that the archive file only has one copy on this tape. // If not, we will ensure the subrequest is filed under the lowest fSeq existing on this tape. // This will prevent double subrequest creation (we already have such a mechanism in case of crash and // restart of expansion. - rsr.fSeq = std::min(tc.second.fSeq, rsr.fSeq); + rsr.fSeq = std::min(tc.fSeq, rsr.fSeq); maxAddedFSeq = std::max(maxAddedFSeq, rsr.fSeq); totalStatsFile.totalFilesToArchive += 1; totalStatsFile.totalBytesToArchive += rsr.archiveFile.fileSize; diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp index 4e1383b6fc286f1ffe730c24bf1ef123d1e99699..7ff994ac948e6c6aefc09d73fb61c1eeb03c560a 100644 --- a/scheduler/SchedulerTest.cpp +++ b/scheduler/SchedulerTest.cpp @@ -1554,7 +1554,7 @@ TEST_P(SchedulerTest, expandRepackRequest) { cta::objectstore::RetrieveRequest retrieveRequest(job.address,schedulerDB.getBackend()); retrieveRequest.fetchNoLock(); uint32_t copyNb = job.copyNb; - common::dataStructures::TapeFile tapeFile = retrieveRequest.getArchiveFile().tapeFiles[copyNb]; + common::dataStructures::TapeFile tapeFile = retrieveRequest.getArchiveFile().tapeFiles.at(copyNb); common::dataStructures::RetrieveRequest schedulerRetrieveRequest = retrieveRequest.getSchedulerRequest(); common::dataStructures::ArchiveFile archiveFile = retrieveRequest.getArchiveFile(); diff --git a/scheduler/testingMocks/MockRetrieveJob.hpp b/scheduler/testingMocks/MockRetrieveJob.hpp index fb8128aadde9f806bab026ae55f6df51a9bf76ab..65acd9c3c8a323f97cc29f7258453be77f025a1b 100644 --- a/scheduler/testingMocks/MockRetrieveJob.hpp +++ b/scheduler/testingMocks/MockRetrieveJob.hpp @@ -31,7 +31,9 @@ namespace cta { cta::common::dataStructures::RetrieveRequest(), cta::common::dataStructures::ArchiveFile(), 1, cta::PositioningMethod::ByBlock), completes(0), failures(0) { - archiveFile.tapeFiles[1]; + common::dataStructures::TapeFile tf; + tf.copyNb = 1; + archiveFile.tapeFiles.push_back(tf); } virtual void asyncSetSuccessful() override { completes++; } void transferFailed(const std::string &failureReason, cta::log::LogContext&) override { failures++; }; diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp index 9165dbac7e6f919275202f251c2e3ddf9311117a..9739ae3a9185d518cd8b9f233b82d871ba5ec6b9 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp @@ -111,7 +111,9 @@ namespace unitTests{ std::unique_ptr<TestingRetrieveJob> fileToRecall(new TestingRetrieveJob(mrm)); fileToRecall->retrieveRequest.archiveFileID = 1; fileToRecall->selectedCopyNb=1; - fileToRecall->archiveFile.tapeFiles[1]; + cta::common::dataStructures::TapeFile tf; + tf.copyNb = 1; + fileToRecall->archiveFile.tapeFiles.push_back(tf); DiskWriteTask t(fileToRecall.release(),mm); for(int i=0;i<6;++i){ MemBlock* mb=mm.getFreeBlock(); diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp index 92b9206f0676838abe2e4c0b0799079e42556392..2fff5e769f016d9118971c56a1cad2ebcd4f947d 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp @@ -117,7 +117,9 @@ namespace unitTests{ fileToRecall->retrieveRequest.archiveFileID = i+1; fileToRecall->retrieveRequest.dstURL = "/dev/null"; fileToRecall->selectedCopyNb=1; - fileToRecall->archiveFile.tapeFiles[1]; + cta::common::dataStructures::TapeFile tf; + tf.copyNb = 1; + fileToRecall->archiveFile.tapeFiles.push_back(tf); fileToRecall->selectedTapeFile().blockId = 1; DiskWriteTask* t=new DiskWriteTask(fileToRecall.release(),mm); MemBlock* mb=mm.getFreeBlock(); diff --git a/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp b/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp index 683f1f9545445be1d4446da5c47b5923c522bcdd..12b63097edabc5889509ae00c5fa282858d2a446 100644 --- a/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp +++ b/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp @@ -217,7 +217,7 @@ int main (int argc, char *argv[]) BasicRetrieveJob fileToRecall; fileToRecall.selectedCopyNb=1; - fileToRecall.archiveFile.tapeFiles[1]; + fileToRecall.archiveFile.tapeFiles.push_back(cta::common::dataStructures::TapeFile()); fileToRecall.selectedTapeFile().blockId = 110; // here should be the block ID of HDR1 fileToRecall.selectedTapeFile().fSeq = 2; fileToRecall.retrieveRequest.archiveFileID = 2; diff --git a/tapeserver/castor/tape/tapeserver/file/FileTest.cpp b/tapeserver/castor/tape/tapeserver/file/FileTest.cpp index 1045ace1b565f546e4e08bd985481e328863b5d3..f9d05ae973c1bc4140e59af6c58578cd07a369d0 100644 --- a/tapeserver/castor/tape/tapeserver/file/FileTest.cpp +++ b/tapeserver/castor/tape/tapeserver/file/FileTest.cpp @@ -60,9 +60,11 @@ namespace unitTests { block_size = 262144; label = "K00001"; fileToRecall.selectedCopyNb=1; - fileToRecall.archiveFile.tapeFiles[1]; - fileToRecall.selectedTapeFile().blockId = 0; - fileToRecall.selectedTapeFile().fSeq = 1; + cta::common::dataStructures::TapeFile tf; + tf.blockId = 0; + tf.fSeq = 1; + tf.copyNb = 1; + fileToRecall.archiveFile.tapeFiles.push_back(tf); fileToRecall.retrieveRequest.archiveFileID = 1; fileToMigrate.archiveFile.fileSize = 500; fileToMigrate.archiveFile.archiveFileID = 1; diff --git a/xroot_plugins/XrdCtaArchiveFileLs.hpp b/xroot_plugins/XrdCtaArchiveFileLs.hpp index 4e7b1caf4196aecc45ae6546808a002daaa37258..99ccaca1df4c883c78c39a12559771b28ebb6ee1 100644 --- a/xroot_plugins/XrdCtaArchiveFileLs.hpp +++ b/xroot_plugins/XrdCtaArchiveFileLs.hpp @@ -112,10 +112,12 @@ public: // Tape file auto tf = record.mutable_afls_item()->mutable_tf(); - tf->set_vid(jt->second.vid); - tf->set_f_seq(jt->second.fSeq); - tf->set_block_id(jt->second.blockId); - record.mutable_afls_item()->set_copy_nb(jt->second.copyNb); + tf->set_vid(jt->vid); + tf->set_f_seq(jt->fSeq); + tf->set_block_id(jt->blockId); + tf->set_superseded_by_vid(jt->supersededByVid); + tf->set_superseded_by_f_seq(jt->supersededByFSeq); + record.mutable_afls_item()->set_copy_nb(jt->copyNb); // is_buffer_full is set to true when we have one full block of data in the buffer, i.e. // enough data to send to the client. The actual buffer size is double the block size,