@@ -265,7 +265,7 @@ public MetadataSnapshot getMetadata(IndexCommit commit, boolean lockDirectory) t
265265 java .util .concurrent .locks .Lock lock = lockDirectory ? metadataLock .writeLock () : metadataLock .readLock ();
266266 lock .lock ();
267267 try (Closeable ignored = lockDirectory ? directory .obtainLock (IndexWriter .WRITE_LOCK_NAME ) : () -> {}) {
268- return new MetadataSnapshot (commit , directory , logger );
268+ return MetadataSnapshot . loadFromIndexCommit (commit , directory , logger );
269269 } catch (CorruptIndexException | IndexFormatTooOldException | IndexFormatTooNewException ex ) {
270270 markStoreCorrupted (ex );
271271 throw ex ;
@@ -448,7 +448,7 @@ public static MetadataSnapshot readMetadataSnapshot(
448448 Directory dir = new NIOFSDirectory (indexLocation )
449449 ) {
450450 failIfCorrupted (dir );
451- return new MetadataSnapshot (null , dir , logger );
451+ return MetadataSnapshot . loadFromIndexCommit (null , dir , logger );
452452 } catch (IndexNotFoundException ex ) {
453453 // that's fine - happens all the time no need to log
454454 } catch (FileNotFoundException | NoSuchFileException ex ) {
@@ -756,80 +756,24 @@ public String toString() {
756756 * change concurrently for safety reasons.
757757 *
758758 * @see StoreFileMetadata
759+ *
760+ * @param numDocs the number of documents in this store snapshot
759761 */
760- public static final class MetadataSnapshot implements Iterable < StoreFileMetadata >, Writeable {
761- private final Map < String , StoreFileMetadata > metadata ;
762- private final Map < String , String > commitUserData ;
763- private final long numDocs ;
762+ public record MetadataSnapshot ( Map < String , StoreFileMetadata > fileMetadataMap , Map < String , String > commitUserData , long numDocs )
763+ implements
764+ Iterable < StoreFileMetadata >,
765+ Writeable {
764766
765767 public static final MetadataSnapshot EMPTY = new MetadataSnapshot (emptyMap (), emptyMap (), 0L );
766768
767- public MetadataSnapshot (Map <String , StoreFileMetadata > metadata , Map <String , String > commitUserData , long numDocs ) {
768- this .metadata = metadata ;
769- this .commitUserData = commitUserData ;
770- this .numDocs = numDocs ;
771- }
772-
773- MetadataSnapshot (IndexCommit commit , Directory directory , Logger logger ) throws IOException {
774- LoadedMetadata loadedMetadata = loadMetadata (commit , directory , logger );
775- metadata = loadedMetadata .fileMetadata ;
776- commitUserData = loadedMetadata .userData ;
777- numDocs = loadedMetadata .numDocs ;
778- assert metadata .isEmpty () || numSegmentFiles () == 1 : "numSegmentFiles: " + numSegmentFiles ();
779- }
780-
781- public static MetadataSnapshot readFrom (StreamInput in ) throws IOException {
782- final Map <String , StoreFileMetadata > metadata = in .readMapValues (StoreFileMetadata ::new , StoreFileMetadata ::name );
783- final var commitUserData = in .readMap (StreamInput ::readString , StreamInput ::readString );
784- final var numDocs = in .readLong ();
785-
786- if (metadata .size () == 0 && commitUserData .size () == 0 && numDocs == 0 ) {
787- return MetadataSnapshot .EMPTY ;
788- } else {
789- return new MetadataSnapshot (metadata , commitUserData , numDocs );
790- }
791- }
792-
793- @ Override
794- public void writeTo (StreamOutput out ) throws IOException {
795- out .writeMapValues (metadata );
796- out .writeMap (commitUserData , StreamOutput ::writeString , StreamOutput ::writeString );
797- out .writeLong (numDocs );
798- }
799-
800- /**
801- * Returns the number of documents in this store snapshot
802- */
803- public long getNumDocs () {
804- return numDocs ;
805- }
806-
807- @ Nullable
808- public org .elasticsearch .Version getCommitVersion () {
809- String version = commitUserData .get (ES_VERSION );
810- return version == null ? null : org .elasticsearch .Version .fromString (version );
811- }
812-
813- static class LoadedMetadata {
814- final Map <String , StoreFileMetadata > fileMetadata ;
815- final Map <String , String > userData ;
769+ static MetadataSnapshot loadFromIndexCommit (IndexCommit commit , Directory directory , Logger logger ) throws IOException {
816770 final long numDocs ;
817-
818- LoadedMetadata (Map <String , StoreFileMetadata > fileMetadata , Map <String , String > userData , long numDocs ) {
819- this .fileMetadata = fileMetadata ;
820- this .userData = userData ;
821- this .numDocs = numDocs ;
822- }
823- }
824-
825- static LoadedMetadata loadMetadata (IndexCommit commit , Directory directory , Logger logger ) throws IOException {
826- long numDocs ;
827- Map <String , StoreFileMetadata > builder = new HashMap <>();
828- Map <String , String > commitUserDataBuilder = new HashMap <>();
771+ final Map <String , StoreFileMetadata > metadataByFile = new HashMap <>();
772+ final Map <String , String > commitUserData ;
829773 try {
830774 final SegmentInfos segmentCommitInfos = Store .readSegmentsInfo (commit , directory );
831775 numDocs = Lucene .getNumDocs (segmentCommitInfos );
832- commitUserDataBuilder . putAll (segmentCommitInfos .getUserData ());
776+ commitUserData = Map . copyOf (segmentCommitInfos .getUserData ());
833777 // we don't know which version was used to write so we take the max version.
834778 Version maxVersion = segmentCommitInfos .getMinSegmentLuceneVersion ();
835779 for (SegmentCommitInfo info : segmentCommitInfos ) {
@@ -849,7 +793,7 @@ static LoadedMetadata loadMetadata(IndexCommit commit, Directory directory, Logg
849793 checksumFromLuceneFile (
850794 directory ,
851795 file ,
852- builder ,
796+ metadataByFile ,
853797 logger ,
854798 version .toString (),
855799 SEGMENT_INFO_EXTENSION .equals (IndexFileNames .getExtension (file )),
@@ -864,7 +808,7 @@ static LoadedMetadata loadMetadata(IndexCommit commit, Directory directory, Logg
864808 checksumFromLuceneFile (
865809 directory ,
866810 segmentsFile ,
867- builder ,
811+ metadataByFile ,
868812 logger ,
869813 maxVersion .toString (),
870814 true ,
@@ -886,16 +830,41 @@ static LoadedMetadata loadMetadata(IndexCommit commit, Directory directory, Logg
886830 ex
887831 );
888832 Lucene .checkSegmentInfoIntegrity (directory );
889- } catch (CorruptIndexException | IndexFormatTooOldException | IndexFormatTooNewException cex ) {
890- cex .addSuppressed (ex );
891- throw cex ;
892833 } catch (Exception inner ) {
893834 inner .addSuppressed (ex );
894835 throw inner ;
895836 }
896837 throw ex ;
897838 }
898- return new LoadedMetadata (unmodifiableMap (builder ), unmodifiableMap (commitUserDataBuilder ), numDocs );
839+ final var metadataSnapshot = new MetadataSnapshot (unmodifiableMap (metadataByFile ), commitUserData , numDocs );
840+ assert metadataSnapshot .fileMetadataMap .isEmpty () || metadataSnapshot .numSegmentFiles () == 1
841+ : "numSegmentFiles: " + metadataSnapshot .numSegmentFiles ();
842+ return metadataSnapshot ;
843+ }
844+
845+ public static MetadataSnapshot readFrom (StreamInput in ) throws IOException {
846+ final Map <String , StoreFileMetadata > metadata = in .readMapValues (StoreFileMetadata ::new , StoreFileMetadata ::name );
847+ final var commitUserData = in .readMap (StreamInput ::readString , StreamInput ::readString );
848+ final var numDocs = in .readLong ();
849+
850+ if (metadata .size () == 0 && commitUserData .size () == 0 && numDocs == 0 ) {
851+ return MetadataSnapshot .EMPTY ;
852+ } else {
853+ return new MetadataSnapshot (metadata , commitUserData , numDocs );
854+ }
855+ }
856+
857+ @ Override
858+ public void writeTo (StreamOutput out ) throws IOException {
859+ out .writeMapValues (fileMetadataMap );
860+ out .writeMap (commitUserData , StreamOutput ::writeString , StreamOutput ::writeString );
861+ out .writeLong (numDocs );
862+ }
863+
864+ @ Nullable
865+ public org .elasticsearch .Version getCommitVersion () {
866+ String version = commitUserData .get (ES_VERSION );
867+ return version == null ? null : org .elasticsearch .Version .fromString (version );
899868 }
900869
901870 private static void checksumFromLuceneFile (
@@ -956,15 +925,11 @@ public static void hashFile(BytesRefBuilder fileHash, InputStream in, long size)
956925
957926 @ Override
958927 public Iterator <StoreFileMetadata > iterator () {
959- return metadata .values ().iterator ();
928+ return fileMetadataMap .values ().iterator ();
960929 }
961930
962931 public StoreFileMetadata get (String name ) {
963- return metadata .get (name );
964- }
965-
966- public Map <String , StoreFileMetadata > asMap () {
967- return metadata ;
932+ return fileMetadataMap .get (name );
968933 }
969934
970935 private static final String SEGMENT_INFO_EXTENSION = "si" ;
@@ -1079,13 +1044,13 @@ public RecoveryDiff recoveryDiff(final MetadataSnapshot targetSnapshot) {
10791044 Collections .unmodifiableList (different ),
10801045 Collections .unmodifiableList (missing )
10811046 );
1082- assert recoveryDiff .size () == metadata .size ()
1047+ assert recoveryDiff .size () == fileMetadataMap .size ()
10831048 : "some files are missing: recoveryDiff is ["
10841049 + recoveryDiff
10851050 + "] comparing: ["
1086- + metadata
1051+ + fileMetadataMap
10871052 + "] to ["
1088- + targetSnapshot .metadata
1053+ + targetSnapshot .fileMetadataMap
10891054 + "]" ;
10901055 return recoveryDiff ;
10911056 }
@@ -1094,11 +1059,7 @@ public RecoveryDiff recoveryDiff(final MetadataSnapshot targetSnapshot) {
10941059 * Returns the number of files in this snapshot
10951060 */
10961061 public int size () {
1097- return metadata .size ();
1098- }
1099-
1100- public Map <String , String > getCommitUserData () {
1101- return commitUserData ;
1062+ return fileMetadataMap .size ();
11021063 }
11031064
11041065 /**
@@ -1112,7 +1073,7 @@ public String getHistoryUUID() {
11121073 * Returns true iff this metadata contains the given file.
11131074 */
11141075 public boolean contains (String existingFile ) {
1115- return metadata .containsKey (existingFile );
1076+ return fileMetadataMap .containsKey (existingFile );
11161077 }
11171078
11181079 /**
@@ -1124,7 +1085,7 @@ public StoreFileMetadata getSegmentsFile() {
11241085 return file ;
11251086 }
11261087 }
1127- assert metadata .isEmpty ();
1088+ assert fileMetadataMap .isEmpty ();
11281089 return null ;
11291090 }
11301091
0 commit comments