[ 
https://issues.apache.org/jira/browse/HADOOP-19729?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18033529#comment-18033529
 ] 

ASF GitHub Bot commented on HADOOP-19729:
-----------------------------------------

bhattmanish98 commented on code in PR #8043:
URL: https://github.com/apache/hadoop/pull/8043#discussion_r2469106859


##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/FileSystemConfigurations.java:
##########
@@ -266,5 +266,15 @@ public final class FileSystemConfigurations {
 
   public static final boolean DEFAULT_FS_AZURE_ENABLE_CREATE_BLOB_IDEMPOTENCY 
= true;
 
+  public static final boolean DEFAULT_FS_AZURE_ENABLE_TAIL_LATENCY_TRACKER = 
false;
+  public static final boolean 
DEFAULT_FS_AZURE_ENABLE_TAIL_LATENCY_REQUEST_TIMEOUT = false;
+  public static final int DEFAULT_FS_AZURE_TAIL_LATENCY_PERCENTILE = 99;

Review Comment:
   shouldn't it be float/double instead of int? Tomorrow we can change default 
percentile to 99.9 or 99.99.



##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/TailLatencyRequestTimeoutException.java:
##########
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.fs.azurebfs.contracts.exceptions;
+
+import java.util.concurrent.TimeoutException;
+import static 
org.apache.hadoop.fs.azurebfs.services.AbfsErrors.ERR_TAIL_LATENCY_REQUEST_TIMEOUT;
+
+/**
+ * Thrown when a request takes more time than the current reported tail 
latency.
+ */
+public class TailLatencyRequestTimeoutException extends 
AzureBlobFileSystemException {
+
+  /**
+   * Constructs a TailLatencyRequestTimeoutException with TimeoutException as 
the cause.
+   */
+  public TailLatencyRequestTimeoutException(TimeoutException innerException) {

Review Comment:
   @param missing in the java doc



##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsApacheHttpClient.java:
##########
@@ -132,6 +138,30 @@ public void close() throws IOException {
    * @throws IOException network error.
    */
   public HttpResponse execute(HttpRequestBase httpRequest,
+      final AbfsManagedHttpClientContext abfsHttpClientContext,
+      final int connectTimeout,
+      final int readTimeout,
+      final long tailLatencyTimeout) throws IOException {
+    if (tailLatencyTimeout <= 0) {
+      return executeWithoutDeadline(httpRequest, abfsHttpClientContext,
+          connectTimeout, readTimeout);
+    }
+    return executeWithDeadline(httpRequest, abfsHttpClientContext,
+        connectTimeout, readTimeout, tailLatencyTimeout);
+  }
+
+  /**
+   * Executes the HTTP request.
+   *
+   * @param httpRequest HTTP request to execute.
+   * @param abfsHttpClientContext HttpClient context.
+   * @param connectTimeout Connection timeout.
+   * @param readTimeout Read timeout.
+   *
+   * @return HTTP response.
+   * @throws IOException network error.
+   */
+  public HttpResponse executeWithoutDeadline(HttpRequestBase httpRequest,

Review Comment:
   executeWithoutDeadline and executeWithDeadline can be private methods.



##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/TailLatencyRequestTimeoutException.java:
##########
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.fs.azurebfs.contracts.exceptions;
+
+import java.util.concurrent.TimeoutException;
+import static 
org.apache.hadoop.fs.azurebfs.services.AbfsErrors.ERR_TAIL_LATENCY_REQUEST_TIMEOUT;
+
+/**
+ * Thrown when a request takes more time than the current reported tail 
latency.
+ */
+public class TailLatencyRequestTimeoutException extends 
AzureBlobFileSystemException {
+
+  /**
+   * Constructs a TailLatencyRequestTimeoutException with TimeoutException as 
the cause.
+   */
+  public TailLatencyRequestTimeoutException(TimeoutException innerException) {
+    super(ERR_TAIL_LATENCY_REQUEST_TIMEOUT, innerException);
+  }
+
+  public TailLatencyRequestTimeoutException() {

Review Comment:
   Java doc missing for this



##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsTailLatencyTracker.java:
##########
@@ -0,0 +1,159 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.fs.azurebfs.services;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.hadoop.fs.azurebfs.AbfsConfiguration;
+
+/**
+ * Account Specific Latency Tracker.
+ * This class tracks the latency of various operations like read, write etc 
for a single account.
+ * It maintains a sliding window histogram for each operation type to analyze 
latency patterns over time.
+ */
+public class AbfsTailLatencyTracker {
+
+  private static final Logger LOG = LoggerFactory.getLogger(
+      AbfsTailLatencyTracker.class);
+  private static AbfsTailLatencyTracker singleton;

Review Comment:
   We can rename this variable to something which is more relevant.



##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsTailLatencyTracker.java:
##########
@@ -0,0 +1,159 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.fs.azurebfs.services;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.hadoop.fs.azurebfs.AbfsConfiguration;
+
+/**
+ * Account Specific Latency Tracker.
+ * This class tracks the latency of various operations like read, write etc 
for a single account.
+ * It maintains a sliding window histogram for each operation type to analyze 
latency patterns over time.
+ */
+public class AbfsTailLatencyTracker {
+
+  private static final Logger LOG = LoggerFactory.getLogger(
+      AbfsTailLatencyTracker.class);
+  private static AbfsTailLatencyTracker singleton;
+  private static final ReentrantLock LOCK = new ReentrantLock();
+  private static final int HISTOGRAM_MAX_VALUE = 60_000;
+  private static final int HISTOGRAM_SIGNIFICANT_FIGURES = 3;
+  private final Map<AbfsRestOperationType, SlidingWindowHdrHistogram>
+      operationLatencyMap = new HashMap<>();
+  private final AbfsConfiguration configuration;
+
+  /**
+   * Constructor to initialize the latency tracker with configuration.
+   * @param abfsConfiguration Configuration settings for latency tracking.
+   */
+  public AbfsTailLatencyTracker(AbfsConfiguration abfsConfiguration) {
+    this.configuration = abfsConfiguration;
+    ScheduledExecutorService histogramRotatorThread = 
Executors.newSingleThreadScheduledExecutor(
+        r -> {
+          Thread t = new Thread(r, "Histogram-Rotator-Thread");
+          t.setDaemon(true);
+          return t;
+        });
+    long rotationInterval = 
configuration.getTailLatencyAnalysisWindowInMillis()
+        / configuration.getTailLatencyAnalysisWindowGranularity();
+    histogramRotatorThread.scheduleAtFixedRate(this::rotateHistograms,
+        rotationInterval, rotationInterval, TimeUnit.MILLISECONDS);
+
+
+    ScheduledExecutorService tailLatencyComputationThread = 
Executors.newSingleThreadScheduledExecutor(

Review Comment:
   We should close this thread pool and one below once the use is done or at 
least during filesystem close.



##########
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsRestOperation.java:
##########
@@ -611,10 +630,30 @@ AbfsJdkHttpOperation createAbfsHttpOperation() throws 
IOException {
 
   @VisibleForTesting
   AbfsAHCHttpOperation createAbfsAHCHttpOperation() throws IOException {
+    long tailLatency = getTailLatencyTimeoutIfEnabled();
     return new AbfsAHCHttpOperation(url, method, requestHeaders,
         
Duration.ofMillis(client.getAbfsConfiguration().getHttpConnectionTimeout()),
         Duration.ofMillis(client.getAbfsConfiguration().getHttpReadTimeout()),
-        client.getAbfsApacheHttpClient(), client);
+        tailLatency, client.getAbfsApacheHttpClient(), client);
+  }
+
+  /**
+   * Get Tail Latency Timeout value if profiling is enabled, timeout is enabled
+   * and retries due to tail latency request timeout is allowed.
+   * @return tail latency timeout value else return zero.
+   */
+  long getTailLatencyTimeoutIfEnabled() {
+    if (isTailLatencyTimeoutEnabled() && shouldTailLatencyTimeout) {
+      return (long) tailLatencyTracker.getTailLatency(this.operationType);
+    }
+    return ZERO;
+  }
+
+  boolean isTailLatencyTimeoutEnabled() {

Review Comment:
   Java doc missing





> ABFS: [Perf] Network Profiling of Tailing Requests and Killing Bad 
> Connections Proactively
> ------------------------------------------------------------------------------------------
>
>                 Key: HADOOP-19729
>                 URL: https://issues.apache.org/jira/browse/HADOOP-19729
>             Project: Hadoop Common
>          Issue Type: Sub-task
>          Components: fs/azure
>    Affects Versions: 3.4.2
>            Reporter: Anuj Modi
>            Assignee: Anuj Modi
>            Priority: Major
>              Labels: pull-request-available
>




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to