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

(lucene) branch main updated: Remove a few more boolean success flags (#14913)

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

thecoop 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 27d1272984f Remove a few more boolean success flags (#14913)
27d1272984f is described below

commit 27d1272984f924341a6ce73988f6a7f3ec812e32
Author: Simon Cooper <si...@elastic.co>
AuthorDate: Mon Jul 14 13:22:17 2025 +0100

    Remove a few more boolean success flags (#14913)
---
 .../lucene90/compressing/FieldsIndexReader.java    | 10 ++-
 .../lucene90/compressing/FieldsIndexWriter.java    |  9 +--
 .../Lucene90CompressingStoredFieldsReader.java     | 19 +++---
 .../lucene/index/ConcurrentMergeScheduler.java     | 10 +--
 .../org/apache/lucene/index/DocumentsWriter.java   | 27 ++++----
 .../lucene/index/DocumentsWriterPerThread.java     | 19 +++---
 .../org/apache/lucene/index/IndexingChain.java     | 36 +++++------
 .../org/apache/lucene/index/PendingDeletes.java    | 19 +++---
 .../index/PersistentSnapshotDeletionPolicy.java    | 43 +++++--------
 .../java/org/apache/lucene/index/SegmentInfos.java | 44 +++++--------
 .../org/apache/lucene/index/SegmentReader.java     | 18 ++----
 .../lucene/index/StandardDirectoryReader.java      | 32 ++++------
 .../org/apache/lucene/search/SearcherManager.java  |  9 +--
 .../org/apache/lucene/store/MMapDirectory.java     | 37 +++++------
 .../org/apache/lucene/store/NIOFSDirectory.java    | 13 ++--
 .../java/org/apache/lucene/util/OfflineSorter.java | 19 +++---
 .../src/java/org/apache/lucene/util/RefCount.java  | 11 ++--
 .../java/org/apache/lucene/util/bkd/BKDWriter.java | 10 +--
 .../apache/lucene/misc/index/BPIndexReorderer.java | 73 +++++++++++-----------
 .../apache/lucene/misc/index/PKIndexSplitter.java  | 23 +------
 .../apache/lucene/replicator/nrt/ReplicaNode.java  |  8 +--
 .../lucene/replicator/nrt/SimpleReplicaNode.java   |  8 +--
 .../codecs/idversion/IDVersionPostingsFormat.java  | 26 +++-----
 .../idversion/VersionBlockTreeTermsReader.java     | 12 ++--
 .../idversion/VersionBlockTreeTermsWriter.java     | 22 +++----
 .../suggest/document/CompletionFieldsConsumer.java |  9 +--
 26 files changed, 212 insertions(+), 354 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexReader.java
index b5631d29596..d823626c9da 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexReader.java
@@ -29,6 +29,7 @@ import org.apache.lucene.store.FileTypeHint;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.RandomAccessInput;
+import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.packed.DirectMonotonicReader;
 
 final class FieldsIndexReader extends FieldsIndex {
@@ -70,16 +71,13 @@ final class FieldsIndexReader extends FieldsIndex {
         dir.openInput(
             IndexFileNames.segmentFileName(name, suffix, extension),
             context.withHints(FileTypeHint.INDEX));
-    boolean success = false;
     try {
       CodecUtil.checkIndexHeader(
           indexInput, codecName + "Idx", VERSION_START, VERSION_CURRENT, id, suffix);
       CodecUtil.retrieveChecksum(indexInput);
-      success = true;
-    } finally {
-      if (success == false) {
-        indexInput.close();
-      }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, indexInput);
+      throw t;
     }
     final RandomAccessInput docsSlice =
         indexInput.randomAccessSlice(docsStartPointer, docsEndPointer - docsStartPointer);
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexWriter.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexWriter.java
index 17c15512e06..d06ca95fc87 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/FieldsIndexWriter.java
@@ -81,16 +81,13 @@ public final class FieldsIndexWriter implements Closeable {
     this.blockShift = blockShift;
     this.ioContext = ioContext;
     this.docsOut = dir.createTempOutput(name, codecName + "-doc_ids", ioContext);
-    boolean success = false;
     try {
       CodecUtil.writeHeader(docsOut, codecName + "Docs", VERSION_CURRENT);
       filePointersOut = dir.createTempOutput(name, codecName + "file_pointers", ioContext);
       CodecUtil.writeHeader(filePointersOut, codecName + "FilePointers", VERSION_CURRENT);
-      success = true;
-    } finally {
-      if (success == false) {
-        close();
-      }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, this);
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/Lucene90CompressingStoredFieldsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/Lucene90CompressingStoredFieldsReader.java
index a5d9e276044..9d142ba5ef2 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/Lucene90CompressingStoredFieldsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/compressing/Lucene90CompressingStoredFieldsReader.java
@@ -440,19 +440,16 @@ public final class Lucene90CompressingStoredFieldsReader extends StoredFieldsRea
 
     /** Reset this block so that it stores state for the block that contains the given doc id. */
     void reset(int docID) throws IOException {
-      boolean success = false;
       try {
         doReset(docID);
-        success = true;
-      } finally {
-        if (success == false) {
-          // if the read failed, set chunkDocs to 0 so that it does not
-          // contain any docs anymore and is not reused. This should help
-          // get consistent exceptions when trying to get several
-          // documents which are in the same corrupted block since it will
-          // force the header to be decoded again
-          chunkDocs = 0;
-        }
+      } catch (Throwable t) {
+        // if the read failed, set chunkDocs to 0 so that it does not
+        // contain any docs anymore and is not reused. This should help
+        // get consistent exceptions when trying to get several
+        // documents which are in the same corrupted block since it will
+        // force the header to be decoded again
+        chunkDocs = 0;
+        throw t;
       }
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java b/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
index 1a390d6606c..d3d47189c00 100644
--- a/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
+++ b/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
@@ -578,7 +578,6 @@ public class ConcurrentMergeScheduler extends MergeScheduler {
         return;
       }
 
-      boolean success = false;
       try {
         // OK to spawn a new merge thread to handle this
         // merge:
@@ -593,12 +592,9 @@ public class ConcurrentMergeScheduler extends MergeScheduler {
 
         newMergeThread.start();
         updateMergeThreads();
-
-        success = true;
-      } finally {
-        if (!success) {
-          mergeSource.onMergeFinished(merge);
-        }
+      } catch (Throwable t) {
+        mergeSource.onMergeFinished(merge);
+        throw t;
       }
     }
   }
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
index d645ac1a1b1..3414b882f89 100644
--- a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java
@@ -209,7 +209,6 @@ final class DocumentsWriter implements Closeable, Accountable {
    * all currently buffered docs. This resets our state, discarding any docs added since last flush.
    */
   synchronized void abort() throws IOException {
-    boolean success = false;
     try {
       deleteQueue.clear();
       if (infoStream.isEnabled("DW")) {
@@ -224,19 +223,22 @@ final class DocumentsWriter implements Closeable, Accountable {
       }
       flushControl.abortPendingFlushes();
       flushControl.waitForFlush();
+
       assert perThreadPool.size() == 0
           : "There are still active DWPT in the pool: " + perThreadPool.size();
-      success = true;
-    } finally {
-      if (success) {
-        assert flushControl.getFlushingBytes() == 0
-            : "flushingBytes has unexpected value 0 != " + flushControl.getFlushingBytes();
-        assert flushControl.netBytes() == 0
-            : "netBytes has unexpected value 0 != " + flushControl.netBytes();
+      assert flushControl.getFlushingBytes() == 0
+          : "flushingBytes has unexpected value 0 != " + flushControl.getFlushingBytes();
+      assert flushControl.netBytes() == 0
+          : "netBytes has unexpected value 0 != " + flushControl.netBytes();
+
+      if (infoStream.isEnabled("DW")) {
+        infoStream.message("DW", "done abort success=true");
       }
+    } catch (Throwable t) {
       if (infoStream.isEnabled("DW")) {
-        infoStream.message("DW", "done abort success=" + success);
+        infoStream.message("DW", "done abort success=false");
       }
+      throw t;
     }
   }
 
@@ -463,7 +465,6 @@ final class DocumentsWriter implements Closeable, Accountable {
     assert flushingDWPT != null : "Flushing DWPT must not be null";
     do {
       assert flushingDWPT.hasFlushed() == false;
-      boolean success = false;
       DocumentsWriterFlushQueue.FlushTicket ticket = null;
       try {
         assert currentFullFlushDelQueue == null
@@ -514,14 +515,14 @@ final class DocumentsWriter implements Closeable, Accountable {
           }
           // flush was successful once we reached this point - new seg. has been assigned to the
           // ticket!
-          success = true;
-        } finally {
-          if (!success && ticket != null) {
+        } catch (Throwable t) {
+          if (ticket != null) {
             // In the case of a failure make sure we are making progress and
             // apply all the deletes since the segment flush failed since the flush
             // ticket could hold global deletes see FlushTicket#canPublish()
             ticketQueue.markTicketFailed(ticket);
           }
+          throw t;
         }
         /*
          * Now we are done and try to flush the ticket queue if the head of the
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java
index ddd15657fea..8b81a6a9b7f 100644
--- a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java
+++ b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java
@@ -601,9 +601,7 @@ final class DocumentsWriterPerThread implements Accountable, Lock {
     IOContext context =
         IOContext.flush(new FlushInfo(newSegment.info.maxDoc(), newSegment.sizeInBytes()));
 
-    boolean success = false;
     try {
-
       if (indexWriterConfig.getUseCompoundFile()) {
         Set<String> originalFiles = newSegment.info.files();
         // TODO: like addIndexes, we are relying on createCompoundFile to successfully cleanup...
@@ -662,17 +660,14 @@ final class DocumentsWriterPerThread implements Accountable, Lock {
         newSegment.setDelCount(delCount);
         newSegment.advanceDelGen();
       }
-
-      success = true;
-    } finally {
-      if (!success) {
-        if (infoStream.isEnabled("DWPT")) {
-          infoStream.message(
-              "DWPT",
-              "hit exception creating compound file for newly flushed segment "
-                  + newSegment.info.name);
-        }
+    } catch (Throwable t) {
+      if (infoStream.isEnabled("DWPT")) {
+        infoStream.message(
+            "DWPT",
+            "hit exception creating compound file for newly flushed segment "
+                + newSegment.info.name);
       }
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java b/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java
index dc8d9013927..5b3a773bbe1 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java
@@ -368,7 +368,6 @@ final class IndexingChain implements Accountable {
   /** Writes all buffered points. */
   private void writePoints(SegmentWriteState state, Sorter.DocMap sortMap) throws IOException {
     PointsWriter pointsWriter = null;
-    boolean success = false;
     try {
       for (int i = 0; i < fieldHash.length; i++) {
         PerField perField = fieldHash[i];
@@ -396,21 +395,17 @@ final class IndexingChain implements Accountable {
       }
       if (pointsWriter != null) {
         pointsWriter.finish();
+        pointsWriter.close();
       }
-      success = true;
-    } finally {
-      if (success) {
-        IOUtils.close(pointsWriter);
-      } else {
-        IOUtils.closeWhileHandlingException(pointsWriter);
-      }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, pointsWriter);
+      throw t;
     }
   }
 
   /** Writes all buffered doc values (called from {@link #flush}). */
   private void writeDocValues(SegmentWriteState state, Sorter.DocMap sortMap) throws IOException {
     DocValuesConsumer dvConsumer = null;
-    boolean success = false;
     try {
       for (int i = 0; i < fieldHash.length; i++) {
         PerField perField = fieldHash[i];
@@ -450,13 +445,12 @@ final class IndexingChain implements Accountable {
       // null/"" depending on how docs landed in segments?
       // but we can't detect all cases, and we should leave
       // this behavior undefined. dv is not "schemaless": it's column-stride.
-      success = true;
-    } finally {
-      if (success) {
-        IOUtils.close(dvConsumer);
-      } else {
-        IOUtils.closeWhileHandlingException(dvConsumer);
+      if (dvConsumer != null) {
+        dvConsumer.close();
       }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, dvConsumer);
+      throw t;
     }
 
     if (state.fieldInfos.hasDocValues() == false) {
@@ -473,7 +467,6 @@ final class IndexingChain implements Accountable {
   }
 
   private void writeNorms(SegmentWriteState state, Sorter.DocMap sortMap) throws IOException {
-    boolean success = false;
     NormsConsumer normsConsumer = null;
     try {
       if (state.fieldInfos.hasNorms()) {
@@ -494,13 +487,12 @@ final class IndexingChain implements Accountable {
           }
         }
       }
-      success = true;
-    } finally {
-      if (success) {
-        IOUtils.close(normsConsumer);
-      } else {
-        IOUtils.closeWhileHandlingException(normsConsumer);
+      if (normsConsumer != null) {
+        normsConsumer.close();
       }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, normsConsumer);
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/PendingDeletes.java b/lucene/core/src/java/org/apache/lucene/index/PendingDeletes.java
index 4be3e41ad19..1844afc760e 100644
--- a/lucene/core/src/java/org/apache/lucene/index/PendingDeletes.java
+++ b/lucene/core/src/java/org/apache/lucene/index/PendingDeletes.java
@@ -186,24 +186,21 @@ class PendingDeletes {
     // We can write directly to the actual name (vs to a
     // .tmp & renaming it) because the file is not live
     // until segments file is written:
-    boolean success = false;
     try {
       Codec codec = info.info.getCodec();
       codec
           .liveDocsFormat()
           .writeLiveDocs(liveDocs, trackingDir, info, pendingDeleteCount, IOContext.DEFAULT);
-      success = true;
-    } finally {
-      if (!success) {
-        // Advance only the nextWriteDelGen so that a 2nd
-        // attempt to write will write to a new file
-        info.advanceNextWriteDelGen();
+    } catch (Throwable t) {
+      // Advance only the nextWriteDelGen so that a 2nd
+      // attempt to write will write to a new file
+      info.advanceNextWriteDelGen();
 
-        // Delete any partially created file(s):
-        for (String fileName : trackingDir.getCreatedFiles()) {
-          IOUtils.deleteFilesIgnoringExceptions(dir, fileName);
-        }
+      // Delete any partially created file(s):
+      for (String fileName : trackingDir.getCreatedFiles()) {
+        IOUtils.deleteFilesIgnoringExceptions(dir, fileName);
       }
+      throw t;
     }
 
     // If we hit an exc in the line above (eg disk full)
diff --git a/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java b/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
index 852adb97c0d..d3fa95c1623 100644
--- a/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
+++ b/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
@@ -112,20 +112,15 @@ public class PersistentSnapshotDeletionPolicy extends SnapshotDeletionPolicy {
   @Override
   public synchronized IndexCommit snapshot() throws IOException {
     IndexCommit ic = super.snapshot();
-    boolean success = false;
     try {
       persist();
-      success = true;
-    } finally {
-      if (!success) {
-        try {
-          super.release(ic);
-        } catch (
-            @SuppressWarnings("unused")
-            Exception e) {
-          // Suppress so we keep throwing original exception
-        }
+    } catch (Throwable t) {
+      try {
+        super.release(ic);
+      } catch (Exception e) {
+        t.addSuppressed(e);
       }
+      throw t;
     }
     return ic;
   }
@@ -139,20 +134,15 @@ public class PersistentSnapshotDeletionPolicy extends SnapshotDeletionPolicy {
   @Override
   public synchronized void release(IndexCommit commit) throws IOException {
     super.release(commit);
-    boolean success = false;
     try {
       persist();
-      success = true;
-    } finally {
-      if (!success) {
-        try {
-          incRef(commit);
-        } catch (
-            @SuppressWarnings("unused")
-            Exception e) {
-          // Suppress so we keep throwing original exception
-        }
+    } catch (Throwable t) {
+      try {
+        incRef(commit);
+      } catch (Exception e) {
+        t.addSuppressed(e);
       }
+      throw t;
     }
   }
 
@@ -170,7 +160,6 @@ public class PersistentSnapshotDeletionPolicy extends SnapshotDeletionPolicy {
 
   private synchronized void persist() throws IOException {
     String fileName = SNAPSHOTS_PREFIX + nextWriteGen;
-    boolean success = false;
     try (IndexOutput out = dir.createOutput(fileName, IOContext.DEFAULT)) {
       CodecUtil.writeHeader(out, CODEC_NAME, VERSION_CURRENT);
       out.writeVInt(refCounts.size());
@@ -178,11 +167,9 @@ public class PersistentSnapshotDeletionPolicy extends SnapshotDeletionPolicy {
         out.writeVLong(ent.getKey());
         out.writeVInt(ent.getValue());
       }
-      success = true;
-    } finally {
-      if (!success) {
-        IOUtils.deleteFilesIgnoringExceptions(dir, fileName);
-      }
+    } catch (Throwable t) {
+      IOUtils.deleteFilesSuppressingExceptions(t, dir, fileName);
+      throw t;
     }
 
     dir.sync(Collections.singletonList(fileName));
diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
index 0418ef746f5..3d69a31aac3 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
@@ -557,25 +557,20 @@ public final class SegmentInfos implements Cloneable, Iterable<SegmentCommitInfo
     generation = nextGeneration;
 
     IndexOutput segnOutput = null;
-    boolean success = false;
 
     try {
       segnOutput = directory.createOutput(segmentFileName, IOContext.DEFAULT);
       write(segnOutput);
       segnOutput.close();
       directory.sync(Collections.singleton(segmentFileName));
-      success = true;
-    } finally {
-      if (success) {
-        pendingCommit = true;
-      } else {
-        // We hit an exception above; try to close the file
-        // but suppress any exception:
-        IOUtils.closeWhileHandlingException(segnOutput);
-        // Try not to leave a truncated segments_N file in
-        // the index:
-        IOUtils.deleteFilesIgnoringExceptions(directory, segmentFileName);
-      }
+      pendingCommit = true;
+    } catch (Throwable t) {
+      // try to close the file but suppress any exception:
+      IOUtils.closeWhileSuppressingExceptions(t, segnOutput);
+      // Try not to leave a truncated segments_N file in
+      // the index:
+      IOUtils.deleteFilesSuppressingExceptions(t, directory, segmentFileName);
+      throw t;
     }
   }
 
@@ -933,7 +928,6 @@ public final class SegmentInfos implements Cloneable, Iterable<SegmentCommitInfo
     if (pendingCommit == false) {
       throw new IllegalStateException("prepareCommit was not called");
     }
-    boolean successRenameAndSync = false;
     final String dest;
     try {
       final String src =
@@ -942,20 +936,16 @@ public final class SegmentInfos implements Cloneable, Iterable<SegmentCommitInfo
       dir.rename(src, dest);
       try {
         dir.syncMetaData();
-        successRenameAndSync = true;
-      } finally {
-        if (successRenameAndSync == false) {
-          // at this point we already created the file but missed to sync directory let's also
-          // remove the
-          // renamed file
-          IOUtils.deleteFilesIgnoringExceptions(dir, dest);
-        }
-      }
-    } finally {
-      if (successRenameAndSync == false) {
-        // deletes pending_segments_N:
-        rollbackCommit(dir);
+      } catch (Throwable t) {
+        // at this point we already created the file but missed to sync directory let's also
+        // remove the renamed file
+        IOUtils.deleteFilesSuppressingExceptions(t, dir, dest);
+        throw t;
       }
+    } catch (Throwable t) {
+      // deletes pending_segments_N:
+      rollbackCommit(dir);
+      throw t;
     }
 
     pendingCommit = false;
diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java b/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java
index 12f48a1d98f..0d653df68ba 100644
--- a/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/SegmentReader.java
@@ -95,7 +95,6 @@ public final class SegmentReader extends CodecReader {
     core = new SegmentCoreReaders(si.info.dir, si, context);
     segDocValues = new SegmentDocValues();
 
-    boolean success = false;
     final Codec codec = si.info.getCodec();
     try {
       if (si.hasDeletions()) {
@@ -111,16 +110,14 @@ public final class SegmentReader extends CodecReader {
       fieldInfos = initFieldInfos();
       docValuesProducer = initDocValuesProducer();
       assert assertLiveDocs(isNRT, hardLiveDocs, liveDocs);
-      success = true;
-    } finally {
+    } catch (Throwable t) {
       // With lock-less commits, it's entirely possible (and
       // fine) to hit a FileNotFound exception above.  In
       // this case, we want to explicitly close any subset
       // of things that were opened so that we don't have to
       // wait for a GC to do so.
-      if (!success) {
-        doClose();
-      }
+      doClose();
+      throw t;
     }
   }
 
@@ -155,15 +152,12 @@ public final class SegmentReader extends CodecReader {
     core.incRef();
     this.segDocValues = sr.segDocValues;
 
-    boolean success = false;
     try {
       fieldInfos = initFieldInfos();
       docValuesProducer = initDocValuesProducer();
-      success = true;
-    } finally {
-      if (!success) {
-        doClose();
-      }
+    } catch (Throwable t) {
+      doClose();
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java b/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java
index 6cf7207a151..dd6d9716c4a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java
@@ -87,7 +87,6 @@ public final class StandardDirectoryReader extends DirectoryReader {
         SegmentInfos sis =
             SegmentInfos.readCommit(directory, segmentFileName, minSupportedMajorVersion);
         final SegmentReader[] readers = new SegmentReader[sis.size()];
-        boolean success = false;
         try {
           for (int i = sis.size() - 1; i >= 0; i--) {
             readers[i] =
@@ -96,15 +95,11 @@ public final class StandardDirectoryReader extends DirectoryReader {
           }
           // This may throw CorruptIndexException if there are too many docs, so
           // it must be inside try clause so we close readers in that case:
-          DirectoryReader reader =
-              new StandardDirectoryReader(directory, readers, null, sis, leafSorter, false, false);
-          success = true;
-
-          return reader;
-        } finally {
-          if (success == false) {
-            IOUtils.closeWhileHandlingException(readers);
-          }
+          return new StandardDirectoryReader(
+              directory, readers, null, sis, leafSorter, false, false);
+        } catch (Throwable t) {
+          IOUtils.closeWhileSuppressingExceptions(t, readers);
+          throw t;
         }
       }
     }.run(commit);
@@ -222,7 +217,6 @@ public final class StandardDirectoryReader extends DirectoryReader {
                 + " has invalid doc count change; likely you are re-opening a reader after illegally removing index files yourself and building a new index in their place.  Use IndexWriter.deleteAll or open a new IndexWriter using OpenMode.CREATE instead");
       }
 
-      boolean success = false;
       try {
         SegmentReader newReader;
         if (oldReader == null
@@ -295,11 +289,9 @@ public final class StandardDirectoryReader extends DirectoryReader {
             }
           }
         }
-        success = true;
-      } finally {
-        if (!success) {
-          decRefWhileHandlingException(newReaders);
-        }
+      } catch (Throwable t) {
+        decRefWhileSuppressingException(t, newReaders);
+        throw t;
       }
     }
     return new StandardDirectoryReader(
@@ -307,15 +299,13 @@ public final class StandardDirectoryReader extends DirectoryReader {
   }
 
   // TODO: move somewhere shared if it's useful elsewhere
-  private static void decRefWhileHandlingException(SegmentReader[] readers) {
+  private static void decRefWhileSuppressingException(Throwable t, SegmentReader[] readers) {
     for (SegmentReader reader : readers) {
       if (reader != null) {
         try {
           reader.decRef();
-        } catch (
-            @SuppressWarnings("unused")
-            Throwable t) {
-          // Ignore so we keep throwing original exception
+        } catch (Throwable rt) {
+          t.addSuppressed(rt);
         }
       }
     }
diff --git a/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java b/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
index 2d3c9f84d2d..862e62a8c5b 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
@@ -248,7 +248,6 @@ public final class SearcherManager extends ReferenceManager<IndexSearcher> {
   public static IndexSearcher getSearcher(
       SearcherFactory searcherFactory, IndexReader reader, IndexReader previousReader)
       throws IOException {
-    boolean success = false;
     final IndexSearcher searcher;
     try {
       searcher = searcherFactory.newSearcher(reader, previousReader);
@@ -260,11 +259,9 @@ public final class SearcherManager extends ReferenceManager<IndexSearcher> {
                 + reader
                 + ")");
       }
-      success = true;
-    } finally {
-      if (!success) {
-        reader.decRef();
-      }
+    } catch (Throwable t) {
+      reader.decRef();
+      throw t;
     }
     return searcher;
   }
diff --git a/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java b/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
index 77648079b04..8ca33b16d02 100644
--- a/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
@@ -312,35 +312,30 @@ public class MMapDirectory extends FSDirectory {
     // Work around for JDK-8259028: we need to unwrap our test-only file system layers
     path = Unwrappable.unwrapAll(path);
 
-    boolean success = false;
     final boolean confined = context.hints().contains(ReadOnceHint.INSTANCE);
     Function<IOContext, ReadAdvice> toReadAdvice =
         c -> readAdviceOverride.apply(name, c).orElseGet(() -> toReadAdvice(c));
     final Arena arena = confined ? Arena.ofConfined() : getSharedArena(name, arenas);
     try (var fc = FileChannel.open(path, StandardOpenOption.READ)) {
       final long fileSize = fc.size();
-      final IndexInput in =
-          MemorySegmentIndexInput.newInstance(
-              resourceDescription,
+      return MemorySegmentIndexInput.newInstance(
+          resourceDescription,
+          arena,
+          map(
               arena,
-              map(
-                  arena,
-                  resourceDescription,
-                  fc,
-                  toReadAdvice.apply(context),
-                  chunkSizePower,
-                  preload.test(name, context),
-                  fileSize),
-              fileSize,
+              resourceDescription,
+              fc,
+              toReadAdvice.apply(context),
               chunkSizePower,
-              confined,
-              toReadAdvice);
-      success = true;
-      return in;
-    } finally {
-      if (success == false) {
-        arena.close();
-      }
+              preload.test(name, context),
+              fileSize),
+          fileSize,
+          chunkSizePower,
+          confined,
+          toReadAdvice);
+    } catch (Throwable t) {
+      arena.close();
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java b/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java
index b05652789cf..016be793cb2 100644
--- a/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/NIOFSDirectory.java
@@ -76,16 +76,11 @@ public class NIOFSDirectory extends FSDirectory {
     ensureCanRead(name);
     Path path = getDirectory().resolve(name);
     FileChannel fc = FileChannel.open(path, StandardOpenOption.READ);
-    boolean success = false;
     try {
-      final NIOFSIndexInput indexInput =
-          new NIOFSIndexInput("NIOFSIndexInput(path=\"" + path + "\")", fc, context);
-      success = true;
-      return indexInput;
-    } finally {
-      if (success == false) {
-        IOUtils.closeWhileHandlingException(fc);
-      }
+      return new NIOFSIndexInput("NIOFSIndexInput(path=\"" + path + "\")", fc, context);
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, fc);
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/util/OfflineSorter.java b/lucene/core/src/java/org/apache/lucene/util/OfflineSorter.java
index c22236a7a21..39620b38df6 100644
--- a/lucene/core/src/java/org/apache/lucene/util/OfflineSorter.java
+++ b/lucene/core/src/java/org/apache/lucene/util/OfflineSorter.java
@@ -290,7 +290,6 @@ public class OfflineSorter {
     // So we can remove any partially written temp files on exception:
     TrackingDirectoryWrapper trackingDir = new TrackingDirectoryWrapper(dir);
 
-    boolean success = false;
     try (ByteSequencesReader is = getReader(dir.openChecksumInput(inputFileName), inputFileName)) {
       while (true) {
         Partition part = readPartition(is);
@@ -354,17 +353,14 @@ public class OfflineSorter {
       sortInfo.totalTimeMS = System.currentTimeMillis() - startMS;
 
       CodecUtil.checkFooter(is.in);
-
-      success = true;
-
       return result;
 
     } catch (InterruptedException ie) {
+      IOUtils.deleteFilesSuppressingExceptions(ie, trackingDir, trackingDir.getCreatedFiles());
       throw new ThreadInterruptedException(ie);
-    } finally {
-      if (success == false) {
-        IOUtils.deleteFilesIgnoringExceptions(trackingDir, trackingDir.getCreatedFiles());
-      }
+    } catch (Throwable t) {
+      IOUtils.deleteFilesSuppressingExceptions(t, trackingDir, trackingDir.getCreatedFiles());
+      throw t;
     }
   }
 
@@ -430,7 +426,6 @@ public class OfflineSorter {
     if (partitionsInRAM != null) {
       partitionsInRAM.acquire();
     }
-    boolean success = false;
     try {
       long start = System.currentTimeMillis();
       SortableBytesRefArray buffer;
@@ -475,12 +470,12 @@ public class OfflineSorter {
         }
       }
       sortInfo.readTimeMS += System.currentTimeMillis() - start;
-      success = true;
       return new Partition(buffer, exhausted);
-    } finally {
-      if (success == false && partitionsInRAM != null) {
+    } catch (Throwable t) {
+      if (partitionsInRAM != null) {
         partitionsInRAM.release();
       }
+      throw t;
     }
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/util/RefCount.java b/lucene/core/src/java/org/apache/lucene/util/RefCount.java
index 3f9f09ac1c6..9945adb9e4f 100644
--- a/lucene/core/src/java/org/apache/lucene/util/RefCount.java
+++ b/lucene/core/src/java/org/apache/lucene/util/RefCount.java
@@ -46,15 +46,12 @@ public class RefCount<T> {
   public final void decRef() throws IOException {
     final int rc = refCount.decrementAndGet();
     if (rc == 0) {
-      boolean success = false;
       try {
         release();
-        success = true;
-      } finally {
-        if (!success) {
-          // Put reference back on failure
-          refCount.incrementAndGet();
-        }
+      } catch (Throwable t) {
+        // Put reference back on failure
+        refCount.incrementAndGet();
+        throw t;
       }
     } else if (rc < 0) {
       throw new IllegalStateException(
diff --git a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
index 4fbd2a77693..0a1fdde57a4 100644
--- a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
@@ -975,7 +975,6 @@ public class BKDWriter implements Closeable {
         new BKDRadixSelector(config, maxPointsSortInHeap, tempDir, tempFileNamePrefix);
 
     final long dataStartFP = dataOut.getFilePointer();
-    boolean success = false;
     try {
 
       final int[] parentSplits = new int[config.numIndexDims()];
@@ -1000,12 +999,9 @@ public class BKDWriter implements Closeable {
       assert tempDir.getCreatedFiles().isEmpty();
       // System.out.println("write time: " + ((System.nanoTime() - t1) / (double)
       //   TimeUnit.SECONDS.toNanos(1)) + " ms");
-
-      success = true;
-    } finally {
-      if (success == false) {
-        IOUtils.deleteFilesIgnoringExceptions(tempDir, tempDir.getCreatedFiles());
-      }
+    } catch (Throwable t) {
+      IOUtils.deleteFilesSuppressingExceptions(t, tempDir, tempDir.getCreatedFiles());
+      throw t;
     }
 
     LongValues leafBlockLongValues = leafBlockFPs.build();
diff --git a/lucene/misc/src/java/org/apache/lucene/misc/index/BPIndexReorderer.java b/lucene/misc/src/java/org/apache/lucene/misc/index/BPIndexReorderer.java
index 6507ff02500..4d2bab216b9 100644
--- a/lucene/misc/src/java/org/apache/lucene/misc/index/BPIndexReorderer.java
+++ b/lucene/misc/src/java/org/apache/lucene/misc/index/BPIndexReorderer.java
@@ -24,6 +24,7 @@ import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
+import java.util.function.IntUnaryOperator;
 import org.apache.lucene.codecs.CodecUtil;
 import org.apache.lucene.index.CodecReader;
 import org.apache.lucene.index.DocValues;
@@ -857,51 +858,47 @@ public final class BPIndexReorderer extends AbstractBPReorderer {
     }
 
     final int maxDoc = reader.maxDoc();
-    ForwardIndex forwardIndex = null;
-    IndexOutput postingsOutput = null;
-    boolean success = false;
     try {
-      postingsOutput = trackingDir.createTempOutput("postings", "", IOContext.DEFAULT);
-      int numTerms = writePostings(reader, fields, trackingDir, postingsOutput, parallelism);
-      CodecUtil.writeFooter(postingsOutput);
-      postingsOutput.close();
-      final ForwardIndex finalForwardIndex =
-          forwardIndex = buildForwardIndex(trackingDir, postingsOutput.getName(), maxDoc, numTerms);
-      trackingDir.deleteFile(postingsOutput.getName());
-      postingsOutput = null;
-
-      int[] sortedDocs = new int[maxDoc];
-      for (int i = 0; i < maxDoc; ++i) {
-        sortedDocs[i] = i;
+      int numTerms;
+      String postingsName;
+      try (IndexOutput postingsOutput =
+          trackingDir.createTempOutput("postings", "", IOContext.DEFAULT)) {
+        numTerms = writePostings(reader, fields, trackingDir, postingsOutput, parallelism);
+        CodecUtil.writeFooter(postingsOutput);
+        postingsName = postingsOutput.getName();
       }
 
-      BitSet parents = null;
-      String parentField = reader.getFieldInfos().getParentField();
-      if (parentField != null) {
-        parents = BitSet.of(DocValues.getNumeric(reader, parentField), maxDoc);
-      }
+      try (ForwardIndex forwardIndex =
+          buildForwardIndex(trackingDir, postingsName, maxDoc, numTerms)) {
+        trackingDir.deleteFile(postingsName);
 
-      try (CloseableThreadLocal<PerThreadState> threadLocal =
-          new CloseableThreadLocal<>() {
-            @Override
-            protected PerThreadState initialValue() {
-              return new PerThreadState(numTerms, finalForwardIndex.clone());
-            }
-          }) {
-        IntsRef docs = new IntsRef(sortedDocs, 0, sortedDocs.length);
-        new IndexReorderingTask(docs, new float[maxDoc], threadLocal, parents, executor, 0).call();
-      }
+        int[] sortedDocs = new int[maxDoc];
+        Arrays.setAll(sortedDocs, IntUnaryOperator.identity());
+
+        BitSet parents = null;
+        String parentField = reader.getFieldInfos().getParentField();
+        if (parentField != null) {
+          parents = BitSet.of(DocValues.getNumeric(reader, parentField), maxDoc);
+        }
+
+        try (CloseableThreadLocal<PerThreadState> threadLocal =
+            new CloseableThreadLocal<>() {
+              @Override
+              protected PerThreadState initialValue() {
+                return new PerThreadState(numTerms, forwardIndex.clone());
+              }
+            }) {
+          IntsRef docs = new IntsRef(sortedDocs, 0, sortedDocs.length);
+          new IndexReorderingTask(docs, new float[maxDoc], threadLocal, parents, executor, 0)
+              .call();
+        }
 
-      success = true;
-      return sortedDocs;
-    } finally {
-      if (success) {
-        IOUtils.close(forwardIndex);
         IOUtils.deleteFiles(trackingDir, trackingDir.getCreatedFiles());
-      } else {
-        IOUtils.closeWhileHandlingException(postingsOutput, forwardIndex);
-        IOUtils.deleteFilesIgnoringExceptions(trackingDir, trackingDir.getCreatedFiles());
+        return sortedDocs;
       }
+    } catch (Throwable t) {
+      IOUtils.deleteFilesSuppressingExceptions(t, trackingDir, trackingDir.getCreatedFiles());
+      throw t;
     }
   }
 
diff --git a/lucene/misc/src/java/org/apache/lucene/misc/index/PKIndexSplitter.java b/lucene/misc/src/java/org/apache/lucene/misc/index/PKIndexSplitter.java
index 789db6646d6..8caa9d6b5e9 100644
--- a/lucene/misc/src/java/org/apache/lucene/misc/index/PKIndexSplitter.java
+++ b/lucene/misc/src/java/org/apache/lucene/misc/index/PKIndexSplitter.java
@@ -37,7 +37,6 @@ import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BitSetIterator;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.FixedBitSet;
-import org.apache.lucene.util.IOUtils;
 
 /** Split an index based on a {@link Query}. */
 public class PKIndexSplitter {
@@ -101,19 +100,10 @@ public class PKIndexSplitter {
   }
 
   public void split() throws IOException {
-    boolean success = false;
-    DirectoryReader reader = DirectoryReader.open(input);
-    try {
+    try (DirectoryReader reader = DirectoryReader.open(input)) {
       // pass an individual config in here since one config can not be reused!
       createIndex(config1, dir1, reader, docsInFirstIndex, false);
       createIndex(config2, dir2, reader, docsInFirstIndex, true);
-      success = true;
-    } finally {
-      if (success) {
-        IOUtils.close(reader);
-      } else {
-        IOUtils.closeWhileHandlingException(reader);
-      }
     }
   }
 
@@ -124,9 +114,7 @@ public class PKIndexSplitter {
       Query preserveFilter,
       boolean negateFilter)
       throws IOException {
-    boolean success = false;
-    final IndexWriter w = new IndexWriter(target, config);
-    try {
+    try (IndexWriter w = new IndexWriter(target, config)) {
       final IndexSearcher searcher = new IndexSearcher(reader);
       searcher.setQueryCache(null);
       preserveFilter = searcher.rewrite(preserveFilter);
@@ -139,13 +127,6 @@ public class PKIndexSplitter {
         subReaders[i++] = new DocumentFilteredLeafIndexReader(ctx, preserveWeight, negateFilter);
       }
       w.addIndexes(subReaders);
-      success = true;
-    } finally {
-      if (success) {
-        w.close();
-      } else {
-        IOUtils.closeWhileHandlingException(w);
-      }
     }
   }
 
diff --git a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
index 206c75efb75..5181ccccaf0 100644
--- a/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
+++ b/lucene/replicator/src/java/org/apache/lucene/replicator/nrt/ReplicaNode.java
@@ -95,8 +95,6 @@ public abstract class ReplicaNode extends Node {
           "Directory " + dir + " still has pending deleted files; cannot initialize IndexWriter");
     }
 
-    boolean success = false;
-
     try {
       message("top: init replica dir=" + dir);
 
@@ -106,15 +104,11 @@ public abstract class ReplicaNode extends Node {
 
       state = "init";
       deleter = new ReplicaFileDeleter(this, dir);
-      success = true;
     } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, this);
       message("exc on init:");
       t.printStackTrace(printStream);
       throw t;
-    } finally {
-      if (success == false) {
-        IOUtils.closeWhileHandlingException(this);
-      }
     }
   }
 
diff --git a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
index 03cb5a6bfdd..b81305fff18 100644
--- a/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
+++ b/lucene/replicator/src/test/org/apache/lucene/replicator/nrt/SimpleReplicaNode.java
@@ -343,7 +343,6 @@ class SimpleReplicaNode extends ReplicaNode {
 
           // Silly keep alive mechanism, else if e.g. we (replica node) crash, the primary
           // won't notice for a very long time:
-          boolean success = false;
           try {
             int count = 0;
             while (true) {
@@ -367,9 +366,10 @@ class SimpleReplicaNode extends ReplicaNode {
 
             out.writeByte((byte) 1);
             bos.flush();
-            success = true;
-          } finally {
-            message("done merge copy files=" + files.keySet() + " success=" + success);
+            message("done merge copy files=" + files.keySet() + " success=true");
+          } catch (Throwable t) {
+            message("done merge copy files=" + files.keySet() + " success=false");
+            throw t;
           }
           break;
 
diff --git a/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/IDVersionPostingsFormat.java b/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/IDVersionPostingsFormat.java
index 32072af9283..de42862cc65 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/IDVersionPostingsFormat.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/IDVersionPostingsFormat.java
@@ -80,31 +80,23 @@ public class IDVersionPostingsFormat extends PostingsFormat {
   @Override
   public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
     PostingsWriterBase postingsWriter = new IDVersionPostingsWriter(state.liveDocs);
-    boolean success = false;
     try {
-      FieldsConsumer ret =
-          new VersionBlockTreeTermsWriter(state, postingsWriter, minTermsInBlock, maxTermsInBlock);
-      success = true;
-      return ret;
-    } finally {
-      if (!success) {
-        IOUtils.closeWhileHandlingException(postingsWriter);
-      }
+      return new VersionBlockTreeTermsWriter(
+          state, postingsWriter, minTermsInBlock, maxTermsInBlock);
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, postingsWriter);
+      throw t;
     }
   }
 
   @Override
   public FieldsProducer fieldsProducer(SegmentReadState state) throws IOException {
     PostingsReaderBase postingsReader = new IDVersionPostingsReader();
-    boolean success = false;
     try {
-      FieldsProducer ret = new VersionBlockTreeTermsReader(postingsReader, state);
-      success = true;
-      return ret;
-    } finally {
-      if (!success) {
-        IOUtils.closeWhileHandlingException(postingsReader);
-      }
+      return new VersionBlockTreeTermsReader(postingsReader, state);
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, postingsReader);
+      throw t;
     }
   }
 
diff --git a/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsReader.java b/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsReader.java
index 12157ca652f..7be39835bef 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsReader.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsReader.java
@@ -64,7 +64,6 @@ public final class VersionBlockTreeTermsReader extends FieldsProducer {
             VersionBlockTreeTermsWriter.TERMS_EXTENSION);
     in = state.directory.openInput(termsFile, state.context);
 
-    boolean success = false;
     IndexInput indexIn = null;
 
     try {
@@ -180,13 +179,10 @@ public final class VersionBlockTreeTermsReader extends FieldsProducer {
         }
       }
       indexIn.close();
-
-      success = true;
-    } finally {
-      if (!success) {
-        // this.close() will close in:
-        IOUtils.closeWhileHandlingException(indexIn, this);
-      }
+    } catch (Throwable t) {
+      // this.close() will close in:
+      IOUtils.closeWhileSuppressingExceptions(t, indexIn, this);
+      throw t;
     }
   }
 
diff --git a/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsWriter.java b/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsWriter.java
index c416e0083c5..06dfa27e52c 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsWriter.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/sandbox/codecs/idversion/VersionBlockTreeTermsWriter.java
@@ -188,7 +188,6 @@ public final class VersionBlockTreeTermsWriter extends FieldsConsumer {
         IndexFileNames.segmentFileName(
             state.segmentInfo.name, state.segmentSuffix, TERMS_EXTENSION);
     out = state.directory.createOutput(termsFileName, state.context);
-    boolean success = false;
     IndexOutput indexOut = null;
     try {
       fieldInfos = state.fieldInfos;
@@ -216,11 +215,9 @@ public final class VersionBlockTreeTermsWriter extends FieldsConsumer {
       // System.out.println("BTW.init seg=" + state.segmentName);
 
       postingsWriter.init(out, state); // have consumer write its format/header
-      success = true;
-    } finally {
-      if (!success) {
-        IOUtils.closeWhileHandlingException(out, indexOut);
-      }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, out, indexOut);
+      throw t;
     }
     this.indexOut = indexOut;
   }
@@ -888,9 +885,7 @@ public final class VersionBlockTreeTermsWriter extends FieldsConsumer {
     }
     closed = true;
 
-    boolean success = false;
     try {
-
       final long dirStart = out.getFilePointer();
       final long indexDirStart = indexOut.getFilePointer();
 
@@ -915,13 +910,10 @@ public final class VersionBlockTreeTermsWriter extends FieldsConsumer {
       CodecUtil.writeFooter(out);
       writeIndexTrailer(indexOut, indexDirStart);
       CodecUtil.writeFooter(indexOut);
-      success = true;
-    } finally {
-      if (success) {
-        IOUtils.close(out, indexOut, postingsWriter);
-      } else {
-        IOUtils.closeWhileHandlingException(out, indexOut, postingsWriter);
-      }
+      IOUtils.close(out, indexOut, postingsWriter);
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, out, indexOut, postingsWriter);
+      throw t;
     }
   }
 
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionFieldsConsumer.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionFieldsConsumer.java
index 73518308b36..3c96151a55e 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionFieldsConsumer.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionFieldsConsumer.java
@@ -126,7 +126,6 @@ final class CompletionFieldsConsumer extends FieldsConsumer {
     String indexFile =
         IndexFileNames.segmentFileName(
             state.segmentInfo.name, state.segmentSuffix, INDEX_EXTENSION);
-    boolean success = false;
     try (IndexOutput indexOut = state.directory.createOutput(indexFile, state.context)) {
       delegateFieldsConsumer.close();
       CodecUtil.writeIndexHeader(
@@ -155,11 +154,9 @@ final class CompletionFieldsConsumer extends FieldsConsumer {
       CodecUtil.writeFooter(indexOut);
       CodecUtil.writeFooter(dictOut);
       IOUtils.close(dictOut);
-      success = true;
-    } finally {
-      if (success == false) {
-        IOUtils.closeWhileHandlingException(dictOut, delegateFieldsConsumer);
-      }
+    } catch (Throwable t) {
+      IOUtils.closeWhileSuppressingExceptions(t, dictOut, delegateFieldsConsumer);
+      throw t;
     }
   }