1313import org .apache .lucene .index .MergeTrigger ;
1414import org .apache .lucene .index .SegmentCommitInfo ;
1515import org .apache .lucene .index .SegmentInfos ;
16+ import org .opensearch .common .CheckedFunction ;
1617import org .opensearch .index .codec .CriteriaBasedCodec ;
1718
1819import java .io .IOException ;
@@ -36,47 +37,106 @@ public CriteriaBasedMergePolicy(MergePolicy in) {
3637 this .in = in ;
3738 }
3839
39- /**
40- * Merges the segments belonging to same group.
41- *
42- * @param mergeTrigger the event that triggered the merge
43- * @param infos the total set of segments in the index
44- * @param mergeContext the IndexWriter to find the merges on
45- * @return
46- * @throws IOException
47- */
48- @ Override
49- public MergeSpecification findMerges (MergeTrigger mergeTrigger , SegmentInfos infos , MergeContext mergeContext ) throws IOException {
40+ private MergeSpecification findMergesInternal (
41+ SegmentInfos segmentInfos ,
42+ MergeContext mergeContext ,
43+ CheckedFunction <SegmentInfos , MergeSpecification , IOException > mergeFinderFunction
44+ ) throws IOException {
45+
5046 final Set <SegmentCommitInfo > merging = mergeContext .getMergingSegments ();
51- MergeSpecification spec = null ;
5247 final Map <String , List <SegmentCommitInfo >> commitInfos = new HashMap <>();
53- for (SegmentCommitInfo si : infos ) {
48+
49+ for (SegmentCommitInfo si : segmentInfos ) {
5450 if (merging .contains (si )) {
5551 continue ;
5652 }
57-
5853 final String dwptGroupNumber = si .info .getAttribute (CriteriaBasedCodec .BUCKET_NAME );
5954 commitInfos .computeIfAbsent (dwptGroupNumber , k -> new ArrayList <>()).add (si );
6055 }
6156
62- for ( String dwptGroupNumber : commitInfos . keySet ()) {
63- if ( commitInfos .get ( dwptGroupNumber ). size () > 1 ) {
64- final SegmentInfos newSIS = new SegmentInfos ( infos . getIndexCreatedVersionMajor () );
65- for ( SegmentCommitInfo info : commitInfos . get ( dwptGroupNumber ) ) {
66- newSIS . add ( info );
67- }
57+ MergeSpecification spec = null ;
58+ for ( Map . Entry < String , List < SegmentCommitInfo >> entry : commitInfos .entrySet () ) {
59+ List < SegmentCommitInfo > segments = entry . getValue ( );
60+ if ( segments . size () > 1 ) {
61+ final SegmentInfos newSIS = new SegmentInfos ( segmentInfos . getIndexCreatedVersionMajor () );
62+ segments . forEach ( newSIS :: add );
6863
69- final MergeSpecification tieredMergePolicySpec = in . findMerges ( mergeTrigger , newSIS , mergeContext );
70- if (tieredMergePolicySpec != null ) {
64+ final MergeSpecification delegateSpec = mergeFinderFunction . apply ( newSIS );
65+ if (delegateSpec != null ) {
7166 if (spec == null ) {
7267 spec = new MergeSpecification ();
7368 }
74-
75- spec .merges .addAll (tieredMergePolicySpec .merges );
69+ spec .merges .addAll (delegateSpec .merges );
7670 }
7771 }
7872 }
7973
8074 return spec ;
8175 }
76+
77+ /**
78+ * Merges the segments belonging to same group
79+ *
80+ * @param mergeTrigger the event that triggered the merge
81+ * @param infos the total set of segments in the index
82+ * @param mergeContext the IndexWriter to find the merges on
83+ * @return
84+ * @throws IOException
85+ */
86+ @ Override
87+ public MergeSpecification findMerges (MergeTrigger mergeTrigger , SegmentInfos infos , MergeContext mergeContext ) throws IOException {
88+ return findMergesInternal (infos , mergeContext , newSIS -> in .findMerges (mergeTrigger , newSIS , mergeContext ));
89+ }
90+
91+ /**
92+ * Force merges segments belonging to same group.
93+ *
94+ * @param segmentInfos the total set of segments in the index
95+ * @param maxSegmentCount requested maximum number of segments in the index
96+ * @param segmentsToMerge contains the specific SegmentInfo instances that must be merged away.
97+ * @param mergeContext the MergeContext to find the merges on
98+ * @return
99+ * @throws IOException
100+ */
101+ @ Override
102+ public MergeSpecification findForcedMerges (
103+ SegmentInfos segmentInfos ,
104+ int maxSegmentCount ,
105+ Map <SegmentCommitInfo , Boolean > segmentsToMerge ,
106+ MergeContext mergeContext
107+ ) throws IOException {
108+ return findMergesInternal (
109+ segmentInfos ,
110+ mergeContext ,
111+ newSIS -> in .findForcedMerges (newSIS , maxSegmentCount , segmentsToMerge , mergeContext )
112+ );
113+ }
114+
115+ /**
116+ * Merges segment belonging to same group to expunge deletes.
117+ *
118+ * @param segmentInfos the total set of segments in the index
119+ * @param mergeContext the MergeContext to find the merges on
120+ * @return
121+ * @throws IOException
122+ */
123+ @ Override
124+ public MergeSpecification findForcedDeletesMerges (SegmentInfos segmentInfos , MergeContext mergeContext ) throws IOException {
125+ return findMergesInternal (segmentInfos , mergeContext , newSIS -> in .findForcedDeletesMerges (newSIS , mergeContext ));
126+ }
127+
128+ /**
129+ * Identifies merges that we want to execute (synchronously) on commit
130+ *
131+ * @param mergeTrigger the event that triggered the merge (COMMIT or GET_READER).
132+ * @param segmentInfos the total set of segments in the index (while preparing the commit)
133+ * @param mergeContext the MergeContext to find the merges on.
134+ * @return
135+ * @throws IOException
136+ */
137+ @ Override
138+ public MergeSpecification findFullFlushMerges (MergeTrigger mergeTrigger , SegmentInfos segmentInfos , MergeContext mergeContext )
139+ throws IOException {
140+ return findMergesInternal (segmentInfos , mergeContext , newSIS -> in .findFullFlushMerges (mergeTrigger , newSIS , mergeContext ));
141+ }
82142}
0 commit comments