You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2026/07/14 11:36:22 UTC

(lucene) branch main updated: Remove IOException from LeafReader.getDocValuesSkipper() (#16388)

This is an automated email from the ASF dual-hosted git repository.

romseygeek pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/main by this push:
     new 1593f87193b Remove IOException from LeafReader.getDocValuesSkipper() (#16388)
1593f87193b is described below

commit 1593f87193b8bb08306f113cab8d35a49b714bba
Author: Alan Woodward <ro...@apache.org>
AuthorDate: Tue Jul 14 12:36:16 2026 +0100

    Remove IOException from LeafReader.getDocValuesSkipper() (#16388)
    
    All of the global metadata available without calling advance() on a
    skipper is loaded at Skipper creation time and can therefore be
    returned without doing any IO. The only reason we need to do IO
    to create a Skipper is slicing an IndexInput, and that can be done
    lazily in advance() as skippers are designed to only be consumed
    in a single thread.  This removes the throws declaration from
    LeafReader.getDocValuesSkipper(), which in combination with a similar
    change on PointValues makes numeric field metadata available
    without IO.
---
 lucene/CHANGES.txt                                 |  7 +++-
 .../apache/lucene/codecs/DocValuesProducer.java    |  2 +-
 .../codecs/lucene90/Lucene90DocValuesProducer.java | 10 ++++-
 .../codecs/perfield/PerFieldDocValuesFormat.java   |  2 +-
 .../java/org/apache/lucene/index/CodecReader.java  |  2 +-
 .../apache/lucene/index/DocValuesLeafReader.java   |  2 +-
 .../org/apache/lucene/index/DocValuesSkipper.java  |  6 +--
 .../org/apache/lucene/index/FilterLeafReader.java  |  2 +-
 .../java/org/apache/lucene/index/LeafReader.java   |  2 +-
 .../apache/lucene/index/ParallelLeafReader.java    |  2 +-
 .../lucene/index/SegmentDocValuesProducer.java     |  2 +-
 .../java/org/apache/lucene/index/SegmentOrder.java | 48 +++++++++-------------
 .../lucene/index/SlowCodecReaderWrapper.java       |  2 +-
 .../index/SlowCompositeCodecReaderWrapper.java     |  2 +-
 .../apache/lucene/index/SortingCodecReader.java    |  2 +-
 .../apache/lucene/search/NumericFieldStats.java    |  8 ++--
 .../search/highlight/TermVectorLeafReader.java     |  2 +-
 .../apache/lucene/index/memory/MemoryIndex.java    |  2 +-
 .../codecs/asserting/AssertingDocValuesFormat.java |  2 +-
 .../lucene/tests/index/AssertingLeafReader.java    |  2 +-
 .../lucene/tests/index/MergeReaderWrapper.java     |  2 +-
 .../lucene/tests/index/MismatchedCodecReader.java  |  2 +-
 .../org/apache/lucene/tests/search/QueryUtils.java |  2 +-
 23 files changed, 57 insertions(+), 58 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index a1896e142c9..cfb3f46e77b 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -98,6 +98,11 @@ API Changes
 * GITHUB#16052: Remove IOException from LeafReader#getPointValues, LeafReader#terms,
   LeafReader#getDocCount signatures. (Ignacio Vera)
 
+* GITHUB#16388: Remove IOException from LeafReader#getDocValuesSkipper signature.
+  (Alan Woodward)
+
+* GITHUB#16387: Don't throw IOException from PointValues metadata methods. (Alan Woodward)
+
 * GITHUB#16281: The checkIntegrity() method of codec Producer APIs gains a OneMerge parameter,
   which is used to check for aborted merges during checksum validation. (Tanguy Leroux)
 
@@ -313,8 +318,6 @@ API Changes
 
 * GITHUB#16363: Add API to use a custom `DictionarySuggester` instead of hardcoded `GeneratingSuggester`
 
-* GITHUB#16387: Don't throw IOException from PointValues metadata methods. (Alan Woodward)
-
 New Features
 ---------------------
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/DocValuesProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/DocValuesProducer.java
index ea9cb78b0ed..7ed86e8f87f 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/DocValuesProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/DocValuesProducer.java
@@ -81,7 +81,7 @@ public abstract class DocValuesProducer implements Closeable {
    * thread-safe: it will only be used by a single thread. The return value is undefined if {@link
    * FieldInfo#docValuesSkipIndexType()} returns {@link DocValuesSkipIndexType#NONE}.
    */
-  public abstract DocValuesSkipper getSkipper(FieldInfo field) throws IOException;
+  public abstract DocValuesSkipper getSkipper(FieldInfo field);
 
   /**
    * Checks consistency of this producer
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90DocValuesProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90DocValuesProducer.java
index fcb1dad93d3..25eefc2660c 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90DocValuesProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90DocValuesProducer.java
@@ -2516,13 +2516,16 @@ final class Lucene90DocValuesProducer extends DocValuesProducer {
   }
 
   @Override
-  public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+  public DocValuesSkipper getSkipper(FieldInfo field) {
     final DocValuesSkipperEntry entry = skippers.get(field.number);
 
     final IndexInput skipperSource = skipIndexData != null ? skipIndexData : data;
-    final IndexInput input = skipperSource.slice("doc value skipper", entry.offset, entry.length);
+
     // TODO: should we write to disk the actual max level for this segment?
     return new DocValuesSkipper() {
+
+      IndexInput input;
+
       final int[] minDocID = new int[SKIP_INDEX_MAX_LEVEL];
       final int[] maxDocID = new int[SKIP_INDEX_MAX_LEVEL];
 
@@ -2539,6 +2542,9 @@ final class Lucene90DocValuesProducer extends DocValuesProducer {
 
       @Override
       public void advance(int target) throws IOException {
+        if (input == null) {
+          input = skipperSource.slice("doc value skipper", entry.offset, entry.length);
+        }
         if (target > entry.maxDocId) {
           // skipper is exhausted
           for (int i = 0; i < SKIP_INDEX_MAX_LEVEL; i++) {
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldDocValuesFormat.java b/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldDocValuesFormat.java
index 9954c40de7d..b43d551032f 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldDocValuesFormat.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldDocValuesFormat.java
@@ -343,7 +343,7 @@ public abstract class PerFieldDocValuesFormat extends DocValuesFormat {
     }
 
     @Override
-    public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+    public DocValuesSkipper getSkipper(FieldInfo field) {
       DocValuesProducer producer = fields.get(field.number);
       return producer == null ? null : producer.getSkipper(field);
     }
diff --git a/lucene/core/src/java/org/apache/lucene/index/CodecReader.java b/lucene/core/src/java/org/apache/lucene/index/CodecReader.java
index 9e579a23a33..4f7a1ea213e 100644
--- a/lucene/core/src/java/org/apache/lucene/index/CodecReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/CodecReader.java
@@ -197,7 +197,7 @@ public abstract class CodecReader extends LeafReader {
   }
 
   @Override
-  public final DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public final DocValuesSkipper getDocValuesSkipper(String field) {
     ensureOpen();
     FieldInfo fi = getFieldInfos().fieldInfo(field);
     if (fi == null || fi.docValuesSkipIndexType() == DocValuesSkipIndexType.NONE) {
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocValuesLeafReader.java b/lucene/core/src/java/org/apache/lucene/index/DocValuesLeafReader.java
index c7635c08fd4..86f9482606d 100644
--- a/lucene/core/src/java/org/apache/lucene/index/DocValuesLeafReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/DocValuesLeafReader.java
@@ -113,7 +113,7 @@ abstract class DocValuesLeafReader extends LeafReader {
   }
 
   @Override
-  public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public DocValuesSkipper getDocValuesSkipper(String field) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocValuesSkipper.java b/lucene/core/src/java/org/apache/lucene/index/DocValuesSkipper.java
index 0dd105d6b46..0ab5cec3312 100644
--- a/lucene/core/src/java/org/apache/lucene/index/DocValuesSkipper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/DocValuesSkipper.java
@@ -142,7 +142,7 @@ public abstract class DocValuesSkipper {
    * @param reader the index reader to be queried
    * @param field the field to retrieve values for
    */
-  public static long globalMinValue(IndexReader reader, String field) throws IOException {
+  public static long globalMinValue(IndexReader reader, String field) {
     long minValue = Long.MAX_VALUE;
     for (LeafReaderContext ctx : reader.leaves()) {
       if (ctx.reader().getFieldInfos().fieldInfo(field) == null) {
@@ -166,7 +166,7 @@ public abstract class DocValuesSkipper {
    * @param reader the index reader to be queried
    * @param field the field to retrieve values for
    */
-  public static long globalMaxValue(IndexReader reader, String field) throws IOException {
+  public static long globalMaxValue(IndexReader reader, String field) {
     long maxValue = Long.MIN_VALUE;
     for (LeafReaderContext ctx : reader.leaves()) {
       if (ctx.reader().getFieldInfos().fieldInfo(field) == null) {
@@ -189,7 +189,7 @@ public abstract class DocValuesSkipper {
    * @param reader the index reader to be queried
    * @param field the field to retrieve values for
    */
-  public static int globalDocCount(IndexReader reader, String field) throws IOException {
+  public static int globalDocCount(IndexReader reader, String field) {
     int docCount = 0;
     for (LeafReaderContext ctx : reader.leaves()) {
       DocValuesSkipper skipper = ctx.reader().getDocValuesSkipper(field);
diff --git a/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java b/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java
index e11dd33c0d0..e571f890c32 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java
@@ -451,7 +451,7 @@ public abstract class FilterLeafReader extends LeafReader {
   }
 
   @Override
-  public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public DocValuesSkipper getDocValuesSkipper(String field) {
     ensureOpen();
     return in.getDocValuesSkipper(field);
   }
diff --git a/lucene/core/src/java/org/apache/lucene/index/LeafReader.java b/lucene/core/src/java/org/apache/lucene/index/LeafReader.java
index 8e010151274..91aecdeb228 100644
--- a/lucene/core/src/java/org/apache/lucene/index/LeafReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/LeafReader.java
@@ -209,7 +209,7 @@ public abstract non-sealed class LeafReader extends IndexReader {
    * interest, or {@code null} if a skip index was not indexed. The returned instance should be
    * confined to the thread that created it.
    */
-  public abstract DocValuesSkipper getDocValuesSkipper(String field) throws IOException;
+  public abstract DocValuesSkipper getDocValuesSkipper(String field);
 
   /**
    * Returns {@link FloatVectorValues} for this field, or null if no {@link FloatVectorValues} were
diff --git a/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java b/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java
index 237347ae94d..036a8fbdd15 100644
--- a/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/ParallelLeafReader.java
@@ -428,7 +428,7 @@ public class ParallelLeafReader extends LeafReader {
   }
 
   @Override
-  public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public DocValuesSkipper getDocValuesSkipper(String field) {
     ensureOpen();
     LeafReader reader = fieldToReader.get(field);
     return reader == null ? null : reader.getDocValuesSkipper(field);
diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java b/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java
index 912f833eec7..542325eaefb 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java
@@ -124,7 +124,7 @@ class SegmentDocValuesProducer extends DocValuesProducer {
   }
 
   @Override
-  public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+  public DocValuesSkipper getSkipper(FieldInfo field) {
     DocValuesProducer dvProducer = dvProducersByField.get(field.number);
     assert dvProducer != null;
     return dvProducer.getSkipper(field);
diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentOrder.java b/lucene/core/src/java/org/apache/lucene/index/SegmentOrder.java
index 6f111cfbeeb..ea3c455c7be 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SegmentOrder.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SegmentOrder.java
@@ -142,39 +142,31 @@ public abstract class SegmentOrder {
     }
 
     private long loadSortValue(LeafReader reader) {
-      try {
-        DocValuesSkipper skipper = reader.getDocValuesSkipper(field);
-        if (skipper != null) {
-          if (skipper.docCount() == reader.maxDoc() || missingValue == null) {
-            return reverse ? skipper.maxValue() : skipper.minValue();
-          }
-          if (reverse) {
-            return Math.max(skipper.maxValue(), missingValue);
-          } else {
-            return Math.min(skipper.minValue(), missingValue);
-          }
+      DocValuesSkipper skipper = reader.getDocValuesSkipper(field);
+      if (skipper != null) {
+        if (skipper.docCount() == reader.maxDoc() || missingValue == null) {
+          return reverse ? skipper.maxValue() : skipper.minValue();
         }
-        PointValues pointValues = reader.getPointValues(field);
-        if (pointValues != null) {
-          if (pointValues.getDocCount() == reader.maxDoc() || missingValue == null) {
-            if (reverse) {
-              return pointDecoder.applyAsLong(pointValues.getMaxPackedValue());
-            } else {
-              return pointDecoder.applyAsLong(pointValues.getMinPackedValue());
-            }
-          }
+        if (reverse) {
+          return Math.max(skipper.maxValue(), missingValue);
+        } else {
+          return Math.min(skipper.minValue(), missingValue);
+        }
+      }
+      PointValues pointValues = reader.getPointValues(field);
+      if (pointValues != null) {
+        if (pointValues.getDocCount() == reader.maxDoc() || missingValue == null) {
           if (reverse) {
-            return Math.max(
-                pointDecoder.applyAsLong(pointValues.getMaxPackedValue()), missingValue);
+            return pointDecoder.applyAsLong(pointValues.getMaxPackedValue());
           } else {
-            return Math.min(
-                pointDecoder.applyAsLong(pointValues.getMinPackedValue()), missingValue);
+            return pointDecoder.applyAsLong(pointValues.getMinPackedValue());
           }
         }
-      } catch (IOException _) {
-        // We can't rethrow exceptions from inside a Comparator, so we instead
-        // return as if there are no index structures to read values from.
-        return reverse ? Long.MAX_VALUE : Long.MIN_VALUE;
+        if (reverse) {
+          return Math.max(pointDecoder.applyAsLong(pointValues.getMaxPackedValue()), missingValue);
+        } else {
+          return Math.min(pointDecoder.applyAsLong(pointValues.getMinPackedValue()), missingValue);
+        }
       }
       return reverse ? Long.MAX_VALUE : Long.MIN_VALUE;
     }
diff --git a/lucene/core/src/java/org/apache/lucene/index/SlowCodecReaderWrapper.java b/lucene/core/src/java/org/apache/lucene/index/SlowCodecReaderWrapper.java
index 555f459b699..8b09766bf0c 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SlowCodecReaderWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SlowCodecReaderWrapper.java
@@ -264,7 +264,7 @@ public final class SlowCodecReaderWrapper {
       }
 
       @Override
-      public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+      public DocValuesSkipper getSkipper(FieldInfo field) {
         return reader.getDocValuesSkipper(field.name);
       }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/SlowCompositeCodecReaderWrapper.java b/lucene/core/src/java/org/apache/lucene/index/SlowCompositeCodecReaderWrapper.java
index be5a8dbb766..7f92668458d 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SlowCompositeCodecReaderWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SlowCompositeCodecReaderWrapper.java
@@ -487,7 +487,7 @@ final class SlowCompositeCodecReaderWrapper extends CodecReader {
     }
 
     @Override
-    public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+    public DocValuesSkipper getSkipper(FieldInfo field) {
       throw new UnsupportedOperationException("This method is for searching not for merging");
     }
   }
diff --git a/lucene/core/src/java/org/apache/lucene/index/SortingCodecReader.java b/lucene/core/src/java/org/apache/lucene/index/SortingCodecReader.java
index 2f3ff5213dc..f21c87cdb00 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SortingCodecReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SortingCodecReader.java
@@ -711,7 +711,7 @@ public final class SortingCodecReader extends FilterCodecReader {
       }
 
       @Override
-      public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+      public DocValuesSkipper getSkipper(FieldInfo field) {
         // We can hardly return information about min/max values if doc IDs have been reordered.
         return null;
       }
diff --git a/lucene/core/src/java/org/apache/lucene/search/NumericFieldStats.java b/lucene/core/src/java/org/apache/lucene/search/NumericFieldStats.java
index 1a529947b3f..49980c6df24 100644
--- a/lucene/core/src/java/org/apache/lucene/search/NumericFieldStats.java
+++ b/lucene/core/src/java/org/apache/lucene/search/NumericFieldStats.java
@@ -16,7 +16,6 @@
  */
 package org.apache.lucene.search;
 
-import java.io.IOException;
 import org.apache.lucene.index.DocValuesSkipper;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReader;
@@ -51,9 +50,8 @@ public final class NumericFieldStats {
    * @param field the name of the numeric field
    * @return a {@link Stats} containing the global min, max, and doc count, or {@code null} if
    *     neither {@link PointValues} nor {@link DocValuesSkipper} are available for the field
-   * @throws IOException if an I/O error occurs
    */
-  public static Stats getStats(IndexReader reader, String field) throws IOException {
+  public static Stats getStats(IndexReader reader, String field) {
     final Stats result = getStatsFromPoints(reader, field);
     if (result != null) {
       return result;
@@ -61,7 +59,7 @@ public final class NumericFieldStats {
     return getStatsFromSkipper(reader, field);
   }
 
-  private static Stats getStatsFromPoints(IndexReader reader, String field) throws IOException {
+  private static Stats getStatsFromPoints(IndexReader reader, String field) {
     final byte[] minPacked = PointValues.getMinPackedValue(reader, field);
     final byte[] maxPacked = PointValues.getMaxPackedValue(reader, field);
     if (minPacked == null
@@ -74,7 +72,7 @@ public final class NumericFieldStats {
     return new Stats(decodeLong(minPacked), decodeLong(maxPacked), docCount);
   }
 
-  private static Stats getStatsFromSkipper(IndexReader reader, String field) throws IOException {
+  private static Stats getStatsFromSkipper(IndexReader reader, String field) {
     Long min = null;
     Long max = null;
     int docCount = 0;
diff --git a/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java b/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java
index 85aa566a646..0a03a61f5b1 100644
--- a/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java
+++ b/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java
@@ -146,7 +146,7 @@ public class TermVectorLeafReader extends LeafReader {
   }
 
   @Override
-  public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public DocValuesSkipper getDocValuesSkipper(String field) {
     return null;
   }
 
diff --git a/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java b/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
index f56e14de9d4..6d3f7f8dc2f 100644
--- a/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
+++ b/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
@@ -1724,7 +1724,7 @@ public class MemoryIndex {
     }
 
     @Override
-    public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+    public DocValuesSkipper getDocValuesSkipper(String field) {
       // Skipping isn't needed on a 1-doc index.
       return null;
     }
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/codecs/asserting/AssertingDocValuesFormat.java b/lucene/test-framework/src/java/org/apache/lucene/tests/codecs/asserting/AssertingDocValuesFormat.java
index de0c536d888..d9903cb9197 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/codecs/asserting/AssertingDocValuesFormat.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/codecs/asserting/AssertingDocValuesFormat.java
@@ -294,7 +294,7 @@ public class AssertingDocValuesFormat extends DocValuesFormat {
     }
 
     @Override
-    public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+    public DocValuesSkipper getSkipper(FieldInfo field) {
       assert fieldInfos.fieldInfo(field.name).number == field.number;
       assert field.docValuesSkipIndexType() != DocValuesSkipIndexType.NONE;
       DocValuesSkipper skipper = in.getSkipper(field);
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java b/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java
index 24e1c55fbad..bdedb641c47 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/index/AssertingLeafReader.java
@@ -1823,7 +1823,7 @@ public class AssertingLeafReader extends FilterLeafReader {
   }
 
   @Override
-  public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public DocValuesSkipper getDocValuesSkipper(String field) {
     DocValuesSkipper skipper = super.getDocValuesSkipper(field);
     FieldInfo fi = getFieldInfos().fieldInfo(field);
     if (skipper != null) {
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/index/MergeReaderWrapper.java b/lucene/test-framework/src/java/org/apache/lucene/tests/index/MergeReaderWrapper.java
index be846b6c654..3d2c802413d 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/index/MergeReaderWrapper.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/index/MergeReaderWrapper.java
@@ -190,7 +190,7 @@ class MergeReaderWrapper extends LeafReader {
   }
 
   @Override
-  public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+  public DocValuesSkipper getDocValuesSkipper(String field) {
     ensureOpen();
     FieldInfo fi = getFieldInfos().fieldInfo(field);
     if (fi == null) {
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/index/MismatchedCodecReader.java b/lucene/test-framework/src/java/org/apache/lucene/tests/index/MismatchedCodecReader.java
index 12709de0a80..bad68679475 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/index/MismatchedCodecReader.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/index/MismatchedCodecReader.java
@@ -162,7 +162,7 @@ public class MismatchedCodecReader extends FilterCodecReader {
     }
 
     @Override
-    public DocValuesSkipper getSkipper(FieldInfo field) throws IOException {
+    public DocValuesSkipper getSkipper(FieldInfo field) {
       return in.getSkipper(remapFieldInfo(field));
     }
 
diff --git a/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java b/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java
index 737e4184386..41d94746d0d 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/tests/search/QueryUtils.java
@@ -228,7 +228,7 @@ public class QueryUtils {
       }
 
       @Override
-      public DocValuesSkipper getDocValuesSkipper(String field) throws IOException {
+      public DocValuesSkipper getDocValuesSkipper(String field) {
         return null;
       }