Samrat002 commented on code in PR #28012:
URL: https://github.com/apache/flink/pull/28012#discussion_r3137959500


##########
flink-filesystems/flink-s3-fs-native/src/main/java/org/apache/flink/fs/s3native/NativeS3InputStream.java:
##########
@@ -143,27 +126,35 @@ private void openStreamAtCurrentPosition() throws 
IOException {
                 currentStream = s3Client.getObject(requestBuilder.build());
                 bufferedStream = new BufferedInputStream(currentStream, 
readBufferSize);
             } catch (Exception e) {
-                if (bufferedStream != null) {
-                    try {
-                        bufferedStream.close();
-                    } catch (IOException ignored) {
-                    }
-                    bufferedStream = null;
-                }
-                if (currentStream != null) {
-                    try {
-                        currentStream.close();
-                    } catch (IOException ignored) {
-                    }
-                    currentStream = null;
-                }
+                releaseStream();
                 throw new IOException("Failed to open S3 stream for " + 
bucketName + "/" + key, e);
             }
         } finally {
             lock.unlock();
         }
     }
 
+    /**
+     * Aborts the in-flight S3 response and releases both stream references.
+     *
+     * <p>We deliberately skip {@link BufferedInputStream#close()} because it 
delegates to the
+     * underlying {@link ResponseInputStream#close()}, which drains remaining 
bytes.
+     */
+    private void releaseStream() {
+        // Drop the wrapper without closing it; closing would trigger the 
drain path.
+        bufferedStream = null;

Review Comment:
   In the revised approach, both `bufferedStream.close()` and 
`currentStream.close()` are still called. The abort() call placed before them 
terminates the underlying HTTP connection, so when 
`BufferedInputStream.close()` delegates to `ResponseInputStream.close()`, the 
connection is already dead, and no drain occurs. BufferedInputStream itself 
holds only a byte[] heap buffer with no native resources. The JVM GCs it upon 
dereferencing. The `currentStream.close()` call handles any remaining SDK 
resource cleanup (connection pool return, etc.) after the abort.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to