|
16 | 16 | import org.apache.lucene.index.CorruptIndexException;
|
17 | 17 | import org.apache.lucene.index.SegmentCommitInfo;
|
18 | 18 | import org.apache.lucene.index.SegmentInfo;
|
19 |
| -import org.apache.lucene.index.CorruptIndexException; |
20 | 19 | import org.apache.lucene.index.SegmentInfos;
|
21 | 20 | import org.apache.lucene.store.ByteBuffersDataOutput;
|
22 | 21 | import org.apache.lucene.store.ByteBuffersIndexOutput;
|
@@ -624,22 +623,12 @@ public void uploadMetadata(
|
624 | 623 | );
|
625 | 624 | try {
|
626 | 625 | try (IndexOutput indexOutput = storeDirectory.createOutput(metadataFilename, IOContext.DEFAULT)) {
|
627 |
| - Map<String, Integer> segmentToLuceneVersion = getSegmentToLuceneVersion(segmentInfosSnapshot); |
| 626 | + Map<String, Integer> segmentToLuceneVersion = getSegmentToLuceneVersion(segmentFiles, segmentInfosSnapshot); |
628 | 627 | Map<String, String> uploadedSegments = new HashMap<>();
|
629 | 628 | for (String file : segmentFiles) {
|
630 | 629 | if (segmentsUploadedToRemoteStore.containsKey(file)) {
|
631 | 630 | UploadedSegmentMetadata metadata = segmentsUploadedToRemoteStore.get(file);
|
632 |
| - if (segmentToLuceneVersion.containsKey(metadata.originalFilename)) { |
633 |
| - metadata.setWrittenByMajor(segmentToLuceneVersion.get(metadata.originalFilename)); |
634 |
| - } else if (metadata.originalFilename.equals(segmentInfosSnapshot.getSegmentsFileName())) { |
635 |
| - metadata.setWrittenByMajor(segmentInfosSnapshot.getCommitLuceneVersion().major); |
636 |
| - } else { |
637 |
| - throw new CorruptIndexException( |
638 |
| - "Lucene version is missing for segment file " + metadata.originalFilename, |
639 |
| - metadata.originalFilename |
640 |
| - ); |
641 |
| - } |
642 |
| - |
| 631 | + metadata.setWrittenByMajor(segmentToLuceneVersion.get(metadata.originalFilename)); |
643 | 632 | uploadedSegments.put(file, metadata.toString());
|
644 | 633 | } else {
|
645 | 634 | throw new NoSuchFileException(file);
|
@@ -671,34 +660,30 @@ public void uploadMetadata(
|
671 | 660 | }
|
672 | 661 |
|
673 | 662 | /**
|
674 |
| - * Parses the provided SegmenttInfos to retrieve a mapping of segment files to the respective Lucene major version that wrote the segments |
675 |
| - * @param segmentInfosSnapshot SegmenttInfos instance to parse |
676 |
| - * @return Map of segment file name to the Lucene major version that wrote it |
677 |
| - * @throws CorruptIndexException If the Lucene major version cannot be parsed for a segment file |
| 663 | + * Parses the provided SegmentInfos to retrieve a mapping of the provided segment files to |
| 664 | + * the respective Lucene major version that wrote the segments |
| 665 | + * @param segmentFiles List of segment files for which the Lucene major version is needed |
| 666 | + * @param segmentInfosSnapshot SegmentInfos instance to parse |
| 667 | + * @return Map of the segment file to its Lucene major version |
678 | 668 | */
|
679 |
| - private Map<String, Integer> getSegmentToLuceneVersion(SegmentInfos segmentInfosSnapshot) throws CorruptIndexException { |
| 669 | + private Map<String, Integer> getSegmentToLuceneVersion(Collection<String> segmentFiles, SegmentInfos segmentInfosSnapshot) { |
680 | 670 | Map<String, Integer> segmentToLuceneVersion = new HashMap<>();
|
681 | 671 | for (SegmentCommitInfo segmentCommitInfo : segmentInfosSnapshot) {
|
682 | 672 | SegmentInfo info = segmentCommitInfo.info;
|
683 | 673 | Set<String> segFiles = info.files();
|
684 | 674 | for (String file : segFiles) {
|
685 | 675 | segmentToLuceneVersion.put(file, info.getVersion().major);
|
686 | 676 | }
|
| 677 | + } |
687 | 678 |
|
688 |
| - int docValuesUpdatesLuceneMajorVersion = -1; |
689 |
| - Map<Integer, Set<String>> docValuesUpdatesFiles = segmentCommitInfo.getDocValuesUpdatesFiles(); |
690 |
| - for (int key : docValuesUpdatesFiles.keySet()) { |
691 |
| - for (String file : docValuesUpdatesFiles.get(key)) { |
692 |
| - if (docValuesUpdatesLuceneMajorVersion == -1) { |
693 |
| - docValuesUpdatesLuceneMajorVersion = RemoteStoreUtils.getLuceneVersionForDocValuesUpdates(file); |
694 |
| - } |
695 |
| - |
696 |
| - segmentToLuceneVersion.put(file, docValuesUpdatesLuceneMajorVersion); |
697 |
| - } |
698 |
| - |
699 |
| - Set<String> fieldInfosFiles = segmentCommitInfo.getFieldInfosFiles(); |
700 |
| - for (String file : fieldInfosFiles) { |
701 |
| - segmentToLuceneVersion.put(file, docValuesUpdatesLuceneMajorVersion); |
| 679 | + for (String file : segmentFiles) { |
| 680 | + if (segmentToLuceneVersion.containsKey(file) == false) { |
| 681 | + if (file.equals(segmentInfosSnapshot.getSegmentsFileName())) { |
| 682 | + segmentToLuceneVersion.put(file, segmentInfosSnapshot.getCommitLuceneVersion().major); |
| 683 | + } else { |
| 684 | + // Fallback to the Lucene major version of the respective segment's .si file |
| 685 | + String segmentInfoFileName = RemoteStoreUtils.getSegmentName(file) + ".si"; |
| 686 | + segmentToLuceneVersion.put(file, segmentToLuceneVersion.get(segmentInfoFileName)); |
702 | 687 | }
|
703 | 688 | }
|
704 | 689 | }
|
|
0 commit comments