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

Jackie-Jiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 1216618848e Fix FSDirectory resource leak when IndexWriter 
construction fails in HNSW vector index (#18964)
1216618848e is described below

commit 1216618848ed4fc69e4aa4b514a8479823b87a26
Author: Akanksha kedia <[email protected]>
AuthorDate: Fri Jul 17 03:11:51 2026 +0530

    Fix FSDirectory resource leak when IndexWriter construction fails in HNSW 
vector index (#18964)
---
 .../realtime/impl/vector/MutableVectorIndex.java   | 33 ++++++++++++++++++----
 .../impl/vector/HnswVectorIndexCreator.java        | 17 +++++++++--
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/vector/MutableVectorIndex.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/vector/MutableVectorIndex.java
index 39c05e532f7..b62ea4b81d9 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/vector/MutableVectorIndex.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/vector/MutableVectorIndex.java
@@ -91,21 +91,42 @@ public class MutableVectorIndex implements 
VectorIndexReader, MutableIndex, Vect
     _commitDocs = Long.parseLong(
         vectorIndexConfig.getProperties().getOrDefault("commitDocs", 
String.valueOf(DEFAULT_COMMIT_DOCS)));
     _vectorSimilarityFunction = 
VectorIndexUtils.toSimilarityFunction(vectorIndexConfig.getVectorDistanceFunction());
+    // Use local variables so that resources opened before a failure can be 
closed before rethrowing,
+    // preventing file-descriptor and temp-directory leaks.
+    File indexDir = new File(FileUtils.getTempDirectory(), segmentName);
+    FSDirectory indexDirectory = null;
+    IndexWriter indexWriter = null;
     try {
       // segment generation is always in V1 and later we convert (as part of 
post creation processing)
       // to V3 if segmentVersion is set to V3 in SegmentGeneratorConfig.
-      _indexDir = new File(FileUtils.getTempDirectory(), segmentName);
-      _indexDirectory = FSDirectory.open(
-          new File(_indexDir, _vectorColumn + 
V1Constants.Indexes.VECTOR_V912_HNSW_INDEX_FILE_EXTENSION).toPath());
+      indexDirectory = FSDirectory.open(
+          new File(indexDir, _vectorColumn + 
V1Constants.Indexes.VECTOR_V912_HNSW_INDEX_FILE_EXTENSION).toPath());
       LOGGER.info("Creating mutable HNSW index for segment: {}, column: {} at 
path: {} with {}", segmentName,
-          vectorColumn, _indexDir.getAbsolutePath(), 
vectorIndexConfig.getProperties());
-      _indexWriter = new IndexWriter(_indexDirectory, 
VectorIndexUtils.getIndexWriterConfig(vectorIndexConfig));
-      _indexWriter.commit();
+          vectorColumn, indexDir.getAbsolutePath(), 
vectorIndexConfig.getProperties());
+      indexWriter = new IndexWriter(indexDirectory, 
VectorIndexUtils.getIndexWriterConfig(vectorIndexConfig));
+      indexWriter.commit();
       _lastCommitTime = System.currentTimeMillis();
     } catch (Exception e) {
+      if (indexWriter != null) {
+        try {
+          indexWriter.close();
+        } catch (IOException closeEx) {
+          e.addSuppressed(closeEx);
+        }
+      } else if (indexDirectory != null) {
+        try {
+          indexDirectory.close();
+        } catch (IOException closeEx) {
+          e.addSuppressed(closeEx);
+        }
+      }
+      FileUtils.deleteQuietly(indexDir);
       throw new RuntimeException(
           "Caught exception while instantiating the LuceneTextIndexCreator for 
column: " + vectorColumn, e);
     }
+    _indexDir = indexDir;
+    _indexDirectory = indexDirectory;
+    _indexWriter = indexWriter;
   }
 
   @Override
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/vector/HnswVectorIndexCreator.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/vector/HnswVectorIndexCreator.java
index 9c34995060e..dd58ccc47e9 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/vector/HnswVectorIndexCreator.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/vector/HnswVectorIndexCreator.java
@@ -65,20 +65,33 @@ public class HnswVectorIndexCreator implements 
VectorIndexCreator {
     _vectorSimilarityFunction = 
VectorIndexUtils.toSimilarityFunction(vectorIndexConfig.getVectorDistanceFunction());
     _storeInSegmentFile = vectorIndexConfig.isStoreInSegmentFile();
     _segmentIndexDir = segmentIndexDir;
+    // Use local variables so that, if IndexWriter construction fails after 
FSDirectory is already
+    // open, we can close the directory before rethrowing — preventing a 
file-descriptor leak.
+    Directory indexDirectory = null;
+    IndexWriter indexWriter;
     try {
       // segment generation is always in V1 and later we convert (as part of 
post creation processing)
       // to V3 if segmentVersion is set to V3 in SegmentGeneratorConfig.
       File indexFile = new File(segmentIndexDir, _vectorColumn
           + V1Constants.Indexes.VECTOR_V912_HNSW_INDEX_FILE_EXTENSION);
       _hnswIndexDir = indexFile;
-      _indexDirectory = FSDirectory.open(indexFile.toPath());
+      indexDirectory = FSDirectory.open(indexFile.toPath());
       LOGGER.info("Creating HNSW index for column: {} at path: {} with {} for 
segment: {}", column,
           indexFile.getAbsolutePath(), vectorIndexConfig.getProperties(), 
segmentIndexDir.getAbsolutePath());
-      _indexWriter = new IndexWriter(_indexDirectory, 
VectorIndexUtils.getIndexWriterConfig(vectorIndexConfig));
+      indexWriter = new IndexWriter(indexDirectory, 
VectorIndexUtils.getIndexWriterConfig(vectorIndexConfig));
     } catch (Exception e) {
+      if (indexDirectory != null) {
+        try {
+          indexDirectory.close();
+        } catch (IOException closeEx) {
+          e.addSuppressed(closeEx);
+        }
+      }
       throw new RuntimeException(
           "Caught exception while instantiating the HnswVectorIndexCreator for 
column: " + column, e);
     }
+    _indexDirectory = indexDirectory;
+    _indexWriter = indexWriter;
   }
 
   @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to