From 96e5e9292ff8dc994b3d6f9d51f1beabb1bef21f Mon Sep 17 00:00:00 2001 From: "yumwang@ebay.com" Date: Sat, 19 Apr 2025 00:13:29 +0800 Subject: [PATCH] [GH-3193] Avoid deadlock in writeAllTo by removing WritableByteChannel usage --- .../bytes/ConcatenatingByteBufferCollector.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/parquet-common/src/main/java/org/apache/parquet/bytes/ConcatenatingByteBufferCollector.java b/parquet-common/src/main/java/org/apache/parquet/bytes/ConcatenatingByteBufferCollector.java index 7a616e9b9d..095cee572f 100644 --- a/parquet-common/src/main/java/org/apache/parquet/bytes/ConcatenatingByteBufferCollector.java +++ b/parquet-common/src/main/java/org/apache/parquet/bytes/ConcatenatingByteBufferCollector.java @@ -23,8 +23,6 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; -import java.nio.channels.Channels; -import java.nio.channels.WritableByteChannel; import java.util.ArrayList; import java.util.List; @@ -72,9 +70,15 @@ public void close() { @Override public void writeAllTo(OutputStream out) throws IOException { - WritableByteChannel channel = Channels.newChannel(out); for (ByteBuffer buffer : slabs) { - channel.write(buffer.duplicate()); + ByteBuffer dup = buffer.duplicate(); + if (dup.hasArray()) { + out.write(dup.array(), dup.arrayOffset() + dup.position(), dup.remaining()); + } else { + byte[] bytes = new byte[dup.remaining()]; + dup.get(bytes); + out.write(bytes); + } } }