From 049270326ee27cdb5e413cb8f4a4d58fc7112027 Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:02:16 -0700 Subject: [PATCH 1/8] Import closable --- .../fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java index f1eb3a2a77476..6add5b50a52c5 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java @@ -18,6 +18,8 @@ package org.apache.hadoop.fs.azurebfs.services; +import java.io.Closeable; + import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicBoolean; From 792a86fa4d41d9312d4008e86ac35e3c24f32639 Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:02:44 -0700 Subject: [PATCH 2/8] Class implements closable --- .../fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java index 6add5b50a52c5..a5c9f167dfa88 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java @@ -36,7 +36,7 @@ import static org.apache.hadoop.util.Time.now; -class AbfsClientThrottlingAnalyzer { +class AbfsClientThrottlingAnalyzer implements Closeable { private static final Logger LOG = LoggerFactory.getLogger( AbfsClientThrottlingAnalyzer.class); private static final int MIN_ANALYSIS_PERIOD_MS = 1000; From 05ee721f344dcd2e0ec9639761ad3966b12c2aad Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:05:45 -0700 Subject: [PATCH 3/8] Add in close method This method closes the throttling analyzer and releases any associated resources. --- .../services/AbfsClientThrottlingAnalyzer.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java index a5c9f167dfa88..20788d1b73468 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java @@ -174,6 +174,22 @@ public boolean suspendIfNecessary() { return false; } + /** + * Closes the throttling analyzer and releases associated resources. + * This method cancels the internal timer and cleans up any pending timer tasks. + * It is safe to call this method multiple times. + * + * @throws IOException if an I/O error occurs during cleanup + */ +@Override +public void close() throws IOException { + if (timer != null) { + timer.cancel(); + timer.purge(); + timer = null; + } +} + @VisibleForTesting int getSleepDuration() { return sleepDuration; From f894117e1f48f44c0e9d0a9062e3551fb307733f Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:06:18 -0700 Subject: [PATCH 4/8] Import in IOException --- .../fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java index 20788d1b73468..38878f8b5efd0 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingAnalyzer.java @@ -19,6 +19,7 @@ package org.apache.hadoop.fs.azurebfs.services; import java.io.Closeable; +import java.io.IOException; import java.util.Timer; import java.util.TimerTask; From 5cf275c955c8570078402663e1453042eb09dcb8 Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:11:08 -0700 Subject: [PATCH 5/8] Add in implementation to call close method --- .../fs/azurebfs/services/AbfsThrottlingIntercept.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsThrottlingIntercept.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsThrottlingIntercept.java index 725377714642b..6ce1979df9323 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsThrottlingIntercept.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsThrottlingIntercept.java @@ -26,7 +26,7 @@ */ @InterfaceAudience.Private @InterfaceStability.Unstable -public interface AbfsThrottlingIntercept { +public interface AbfsThrottlingIntercept extends Closable { /** * Updates the metrics for successful and failed read and write operations. @@ -47,4 +47,11 @@ void updateMetrics(AbfsRestOperationType operationType, void sendingRequest(AbfsRestOperationType operationType, AbfsCounters abfsCounters); + /** + * Closes the throttling intercept and releases associated resources. + * @throws IOException if an I/O error occurs during cleanup + */ + @Override + void close() throws IOException; + } From 0a0f4e197ef6432862eb88674d59e8bcbdc65914 Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:13:52 -0700 Subject: [PATCH 6/8] Add in cleanup method --- .../org/apache/hadoop/fs/azurebfs/services/AbfsClient.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClient.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClient.java index 09a2f1549a742..816f09be6d1bb 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClient.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClient.java @@ -363,6 +363,9 @@ public void close() throws IOException { if (abfsApacheHttpClient != null) { abfsApacheHttpClient.close(); } + if (intercept != null) { + IOUtils.cleanupWithLogger(LOG, intercept); + } if (tokenProvider instanceof Closeable) { IOUtils.cleanupWithLogger(LOG, (Closeable) tokenProvider); From 25c6d89e9c41ca118b2e935ae9a6003336a4d80d Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:17:08 -0700 Subject: [PATCH 7/8] Adding in close method --- .../services/AbfsClientThrottlingIntercept.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingIntercept.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingIntercept.java index 39aaf34db0d57..1afb642d798f5 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingIntercept.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClientThrottlingIntercept.java @@ -18,6 +18,7 @@ package org.apache.hadoop.fs.azurebfs.services; +import java.io.IOException; import java.net.HttpURLConnection; import java.util.concurrent.locks.ReentrantLock; @@ -223,4 +224,18 @@ private static long getContentLengthIfKnown(String range) { } return contentLength; } + + /** + * Closes the throttling intercept and releases associated resources. + * This method closes both the read and write throttling analyzers. + */ + @Override + public void close() throws IOException { + if (readThrottler != null) { + readThrottler.close(); + } + if (writeThrottler != null) { + writeThrottler.close(); + } + } } From fee9861e3ff8d302a76812102c6c0cf38ebf37b5 Mon Sep 17 00:00:00 2001 From: mattkduran <19656092+mattkduran@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:18:14 -0700 Subject: [PATCH 8/8] Added no-op method --- .../azurebfs/services/AbfsNoOpThrottlingIntercept.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsNoOpThrottlingIntercept.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsNoOpThrottlingIntercept.java index 58e50592997dc..92578021a9584 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsNoOpThrottlingIntercept.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsNoOpThrottlingIntercept.java @@ -18,6 +18,8 @@ package org.apache.hadoop.fs.azurebfs.services; +import java.io.IOException; + /** * Implementation of {@link AbfsThrottlingIntercept} that does not throttle * the ABFS process. @@ -40,4 +42,12 @@ public void updateMetrics(final AbfsRestOperationType operationType, public void sendingRequest(final AbfsRestOperationType operationType, final AbfsCounters abfsCounters) { } + +/** + * No-op implementation of close method. + */ + @Override + public void close() throws IOException { + // No resources to clean up in no-op implementation + } }