dsmiley commented on code in PR #3883:
URL: https://github.com/apache/solr/pull/3883#discussion_r2572071834
##########
solr/core/src/java/org/apache/solr/index/LatestVersionFilterMergePolicy.java:
##########
@@ -0,0 +1,75 @@
+package org.apache.solr.index;
+
+import java.io.IOException;
+import java.util.Map;
+import org.apache.lucene.index.FilterMergePolicy;
+import org.apache.lucene.index.MergePolicy;
+import org.apache.lucene.index.MergeTrigger;
+import org.apache.lucene.index.SegmentCommitInfo;
+import org.apache.lucene.index.SegmentInfos;
+import org.apache.lucene.util.Version;
+
+/**
+ * Prevents any older version segment (< {@link Version.LATEST}), either
original or one derived as
+ * a result of merging with an older version segment, from being considered
for merges. That way a
+ * snapshot of older segments remains consistent. This assists in upgrading to
a future Lucene major
+ * version if existing documents are reindexed in the current version with
this merge policy in
+ * place.
+ */
+public class LatestVersionFilterMergePolicy extends FilterMergePolicy {
+
+ public LatestVersionFilterMergePolicy(MergePolicy in) {
+ super(in);
+ }
+
+ @Override
+ public MergeSpecification findMerges(
+ MergeTrigger mergeTrigger, SegmentInfos infos, MergeContext
mergeContext) throws IOException {
+ return in.findMerges(mergeTrigger, getFilteredInfosClone(infos),
mergeContext);
+ }
+
+ @Override
+ public MergeSpecification findForcedMerges(
+ SegmentInfos infos,
+ int maxSegmentCount,
+ Map<SegmentCommitInfo, Boolean> segmentsToMerge,
+ MergeContext mergeContext)
+ throws IOException {
+ return in.findForcedMerges(
+ getFilteredInfosClone(infos), maxSegmentCount, segmentsToMerge,
mergeContext);
+ }
+
+ @Override
+ public MergeSpecification findForcedDeletesMerges(SegmentInfos infos,
MergeContext mergeContext)
+ throws IOException {
+ return in.findForcedDeletesMerges(getFilteredInfosClone(infos),
mergeContext);
+ }
+
+ @Override
+ public MergeSpecification findFullFlushMerges(
+ MergeTrigger mergeTrigger, SegmentInfos infos, MergeContext
mergeContext) throws IOException {
+ return in.findFullFlushMerges(mergeTrigger, getFilteredInfosClone(infos),
mergeContext);
+ }
+
+ private SegmentInfos getFilteredInfosClone(SegmentInfos infos) {
Review Comment:
nit: clone is an implementation detail that doesn't belong in the method.
For example, maybe we see that rebuilding this thing is expensive-ish and we
decide to first check if all segments are current to not clone. Or if no
segments are updated, and return an empty one.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]