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

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit f2ef282cc6396f84a8870b6045a1394c617a36d7
Author: Ritik Raj <raj.ritik9...@gmail.com>
AuthorDate: Wed Jun 18 01:53:11 2025 +0530

    [ASTERIXDB-3601][STO] Properly unpinning segment files
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    Properly unpinning the segment files, in case
    of failure. Otherwise it might cause resource
    leak.
    
    Ext-ref: MB-66306
    Change-Id: I1dec880871008fc6b9be6662df9fa034992858c9
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19990
    Reviewed-by: Peeyush Gupta <peeyush.gu...@couchbase.com>
    Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
    Tested-by: Ritik Raj <ritik....@couchbase.com>
---
 .../src/test/resources/cc-single-partition.conf        |  2 +-
 ...MultiPersistentPageZeroBufferBytesOutputStream.java |  2 +-
 .../column/zero/PageZeroWriterFlavorSelector.java      |  2 +-
 .../zero/readers/DefaultColumnPageZeroReader.java      | 18 ++++++++++++++++++
 .../multipage/AbstractColumnMultiPageZeroReader.java   |  3 +++
 .../multipage/DefaultColumnMultiPageZeroReader.java    | 14 ++++++++++++++
 .../multipage/SparseColumnMultiPageZeroReader.java     | 15 +++++++++++++++
 .../am/lsm/btree/column/cloud/sweep/ColumnSweeper.java | 16 +++++++++++++++-
 .../column/impls/btree/ColumnBTreeReadLeafFrame.java   |  4 ++++
 .../column/impls/btree/IColumnPageZeroReader.java      |  2 ++
 10 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf 
b/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf
index d5837adb17..23071d6501 100644
--- a/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf
+++ b/asterixdb/asterix-app/src/test/resources/cc-single-partition.conf
@@ -53,4 +53,4 @@ compiler.windowmemory=192KB
 compiler.ordered.fields=false
 messaging.frame.size=4096
 messaging.frame.count=512
-storage.buffercache.pagesize=32KB
+storage.buffercache.pagesize=32KB
\ No newline at end of file
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/MultiPersistentPageZeroBufferBytesOutputStream.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/MultiPersistentPageZeroBufferBytesOutputStream.java
index c156e49d2d..4ae01536c7 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/MultiPersistentPageZeroBufferBytesOutputStream.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/bytes/stream/out/MultiPersistentPageZeroBufferBytesOutputStream.java
@@ -42,7 +42,7 @@ public final class 
MultiPersistentPageZeroBufferBytesOutputStream extends Abstra
 
     @Override
     protected void preReset() {
-        if (allocatedBytes > 0) {
+        if (allocatedBytes > 0 || !buffers.isEmpty()) {
             //This should not be the case, with the pageZero segments.
             //As the stream should be finished after the flush.
             throw new IllegalStateException("PageZero segments should already 
be finished after flush");
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/PageZeroWriterFlavorSelector.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/PageZeroWriterFlavorSelector.java
index 06e441aa78..831e459ba6 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/PageZeroWriterFlavorSelector.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/PageZeroWriterFlavorSelector.java
@@ -44,12 +44,12 @@ import it.unimi.dsi.fastutil.bytes.Byte2ObjectArrayMap;
  * This class implements an optimization strategy for sparse columns:
  * - Default writer: Allocates space for all columns in the schema (suitable 
for dense data)
  * - Sparse writer: Only allocates space for present columns (suitable for 
sparse data)
+ * - Multi-page writers: Variants of the above writers that support multi-page 
operations
  *</p>
  * The selector automatically chooses the most space-efficient option based on 
the actual
  * space requirements of each approach.
  */
 public class PageZeroWriterFlavorSelector implements 
IColumnPageZeroWriterFlavorSelector {
-    // Flag indicating which writer type is currently selected 
(DEFAULT_WRITER_FLAG=default, SPARSE_WRITER_FLAG=sparse)
     protected byte writerFlag = 
IColumnPageZeroWriter.ColumnPageZeroWriterType.ADAPTIVE.getWriterFlag();
 
     // Cache of writer instances to avoid repeated object creation
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
index 1692e70d67..a34d8c1af1 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.column.zero.readers;
 
+import static 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.AbstractColumnBTreeLeafFrame.FLAG_OFFSET;
 import static 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.AbstractColumnBTreeLeafFrame.LEFT_MOST_KEY_OFFSET;
 import static 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.AbstractColumnBTreeLeafFrame.MEGA_LEAF_NODE_LENGTH;
 import static 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.AbstractColumnBTreeLeafFrame.NEXT_LEAF_OFFSET;
@@ -31,9 +32,16 @@ import java.util.BitSet;
 import org.apache.asterix.column.zero.writers.DefaultColumnPageZeroWriter;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.IColumnPageZeroReader;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class DefaultColumnPageZeroReader implements IColumnPageZeroReader {
+    protected static Logger LOGGER = LogManager.getLogger();
+
     protected ByteBuffer pageZeroBuf;
     protected BitSet pageZeroSegmentsPages;
     protected int numberOfPresentColumns;
@@ -182,4 +190,14 @@ public class DefaultColumnPageZeroReader implements 
IColumnPageZeroReader {
         pageZeroSegmentsPages.set(0);
         return pageZeroSegmentsPages;
     }
+
+    @Override
+    public void printPageZeroReaderInfo() {
+        ColumnarValueException ex = new ColumnarValueException();
+        ObjectNode readerNode = ex.createNode(getClass().getSimpleName());
+        readerNode.put("headerSize", headerSize);
+        readerNode.put("numberOfPresentColumns", numberOfPresentColumns);
+        readerNode.put("flag", pageZeroBuf.get(FLAG_OFFSET));
+        LOGGER.debug("SingleColumnPageZeroReader Info: {}", 
readerNode.toPrettyString());
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/AbstractColumnMultiPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/AbstractColumnMultiPageZeroReader.java
index 3b05fc38a8..b0fc721baa 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/AbstractColumnMultiPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/AbstractColumnMultiPageZeroReader.java
@@ -20,8 +20,11 @@ package org.apache.asterix.column.zero.writers.multipage;
 
 import 
org.apache.asterix.column.bytes.stream.in.MultiPageZeroByteBuffersReader;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.IColumnPageZeroReader;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractColumnMultiPageZeroReader implements 
IColumnPageZeroReader {
+    protected static final Logger LOGGER = LogManager.getLogger();
     protected MultiPageZeroByteBuffersReader segmentBuffers;
 
     AbstractColumnMultiPageZeroReader() {
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
index db800ae877..5a0b1808d3 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
@@ -40,6 +40,9 @@ import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class DefaultColumnMultiPageZeroReader extends 
AbstractColumnMultiPageZeroReader {
     public static final int headerSize = 
DefaultColumnMultiPageZeroWriter.EXTENDED_HEADER_SIZE;
@@ -273,4 +276,15 @@ public class DefaultColumnMultiPageZeroReader extends 
AbstractColumnMultiPageZer
     public int getHeaderSize() {
         return EXTENDED_HEADER_SIZE;
     }
+
+    @Override
+    public void printPageZeroReaderInfo() {
+        ColumnarValueException ex = new ColumnarValueException();
+        ObjectNode readerNode = ex.createNode(getClass().getSimpleName());
+        readerNode.put("headerSize", headerSize);
+        readerNode.put("maxColumnsInZerothSegment", zerothSegmentMaxColumns);
+        readerNode.put("maxNumberOfColumnsInAPage", maxNumberOfColumnsInAPage);
+        readerNode.put("numberOfPageZeroSegments", numberOfPageZeroSegments);
+        LOGGER.debug("DefaultColumnMultiPageZeroReader Info: {}", 
readerNode.toPrettyString());
+    }
 }
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
index d555bdc88d..0a0a817048 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
@@ -40,6 +40,9 @@ import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
 
@@ -358,4 +361,16 @@ public class SparseColumnMultiPageZeroReader extends 
AbstractColumnMultiPageZero
         }
         return pageZeroSegmentsPages;
     }
+
+    @Override
+    public void printPageZeroReaderInfo() {
+        ColumnarValueException ex = new ColumnarValueException();
+        ObjectNode readerNode = ex.createNode(getClass().getSimpleName());
+        readerNode.put("headerSize", headerSize);
+        readerNode.put("maxColumnIndexInZerothSegment", 
maxColumnIndexInZerothSegment);
+        readerNode.put("numberOfColumnInZerothSegment", 
numberOfColumnInZerothSegment);
+        readerNode.put("maxNumberOfColumnsInAPage", maxNumberOfColumnsInAPage);
+        readerNode.put("numberOfPageZeroSegments", numberOfPageZeroSegments);
+        LOGGER.debug("SparseColumnMultiPageZeroReader Info: {}", 
readerNode.toPrettyString());
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/sweep/ColumnSweeper.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/sweep/ColumnSweeper.java
index 1f0c7f4d6c..ba4376f963 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/sweep/ColumnSweeper.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/sweep/ColumnSweeper.java
@@ -165,6 +165,7 @@ public final class ColumnSweeper {
         int freedSpace = 0;
         context.open(fileId);
         try {
+            Throwable failure = null;
             while (nextPageId >= 0) {
                 if (context.stopSweeping()) {
                     // Exit as the index is being dropped
@@ -183,17 +184,30 @@ public final class ColumnSweeper {
                         ranges.reset(leafFrame, plan);
                         freedSpace += punchHoles(context, leafFrame);
                     }
+                } catch (Throwable th) {
+                    failure = th;
                 } finally {
                     if (columnsLocked) {
                         page0.sweepUnlock();
                     }
                     // unpin segment pages
                     for (ICachedPage cachedPage : segmentPagesTempHolder) {
-                        context.unpin(cachedPage, bcOpCtx);
+                        try {
+                            context.unpin(cachedPage, bcOpCtx);
+                        } catch (Throwable e) {
+                            if (failure == null) {
+                                failure = e;
+                            } else {
+                                failure.addSuppressed(e);
+                            }
+                        }
                     }
                     context.unpin(page0, bcOpCtx);
                 }
             }
+            if (failure != null) {
+                throw HyracksDataException.create(failure);
+            }
         } finally {
             context.close();
         }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
index 4a784000a1..c3f822815f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
@@ -188,4 +188,8 @@ public final class ColumnBTreeReadLeafFrame extends 
AbstractColumnBTreeLeafFrame
     public BitSet markRequiredPageZeroSegments(BitSet projectedColumns, int 
pageZeroId, boolean markAll) {
         return columnPageZeroReader.markRequiredPageSegments(projectedColumns, 
pageZeroId, markAll);
     }
+
+    public void printPageZeroReaderInfo() {
+        columnPageZeroReader.printPageZeroReaderInfo();
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
index db4f778c95..d9cf11be9f 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
@@ -75,4 +75,6 @@ public interface IColumnPageZeroReader {
     void resetStream(IColumnBufferProvider pageZeroSegmentBufferProvider) 
throws HyracksDataException;
 
     BitSet markRequiredPageSegments(BitSet projectedColumns, int pageZeroId, 
boolean markAll);
+
+    void printPageZeroReaderInfo();
 }

Reply via email to