You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2026/01/18 14:51:00 UTC

(hbase-site) branch asf-site updated: Published site at 2c8d1c0073078c30efacf1a5542196199557d52c.

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

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 2529b19cb58 Published site at 2c8d1c0073078c30efacf1a5542196199557d52c.
2529b19cb58 is described below

commit 2529b19cb58d7e7c84a058208fff4f1da8df0e2b
Author: jenkins <bu...@apache.org>
AuthorDate: Sun Jan 18 14:50:38 2026 +0000

    Published site at 2c8d1c0073078c30efacf1a5542196199557d52c.
---
 apache_hbase_reference_guide.pdf                   |    4 +-
 book.html                                          |    2 +-
 checkstyle-aggregate.html                          |    4 +-
 dependency-convergence.html                        |    4 +-
 dependency-info.html                               |    4 +-
 dependency-management.html                         |    4 +-
 hbase-website/dependency-convergence.html          |    4 +-
 hbase-website/dependency-info.html                 |    4 +-
 hbase-website/dependency-management.html           |    4 +-
 hbase-website/index.html                           |    4 +-
 hbase-website/issue-management.html                |    4 +-
 hbase-website/licenses.html                        |    4 +-
 hbase-website/mailing-lists.html                   |    4 +-
 hbase-website/plugin-management.html               |    4 +-
 hbase-website/plugins.html                         |    4 +-
 hbase-website/project-info.html                    |    4 +-
 hbase-website/scm.html                             |    4 +-
 hbase-website/summary.html                         |    4 +-
 hbase-website/team.html                            |    4 +-
 issue-management.html                              |    4 +-
 licenses.html                                      |    4 +-
 mailing-lists.html                                 |    4 +-
 plugin-management.html                             |    4 +-
 plugins.html                                       |    4 +-
 project-info.html                                  |    4 +-
 project-reports.html                               |    4 +-
 scm.html                                           |    4 +-
 summary.html                                       |    4 +-
 team.html                                          |    4 +-
 testapidocs/index-all.html                         |   38 +-
 testapidocs/member-search-index.js                 |    2 +-
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |   69 +-
 .../class-use/HBaseParameterizedTestTemplate.html  |   24 +-
 .../hbase/io/crypto/tls/class-use/X509KeyType.html |   18 +-
 .../org/apache/hadoop/hbase/package-use.html       |   10 +-
 .../apache/hadoop/hbase/ipc/AbstractTestIPC.html   | 1362 ++++++++++----------
 .../apache/hadoop/hbase/ipc/TestBlockingIPC.html   |  133 +-
 .../org/apache/hadoop/hbase/ipc/TestNettyIPC.html  |  247 ++--
 .../apache/hadoop/hbase/ipc/TestNettyTlsIPC.html   |  144 +--
 testdevapidocs/index-all.html                      |   26 +-
 testdevapidocs/member-search-index.js              |    2 +-
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |   69 +-
 .../class-use/HBaseParameterizedTestTemplate.html  |   24 +-
 .../hbase/io/crypto/tls/class-use/X509KeyType.html |   18 +-
 ...C.FailingSimpleRpcServer.FailingConnection.html |    6 +-
 .../AbstractTestIPC.FailingSimpleRpcServer.html    |    6 +-
 .../apache/hadoop/hbase/ipc/AbstractTestIPC.html   |  123 +-
 .../apache/hadoop/hbase/ipc/TestBlockingIPC.html   |   54 +-
 .../org/apache/hadoop/hbase/ipc/TestNettyIPC.html  |   62 +-
 .../apache/hadoop/hbase/ipc/TestNettyTlsIPC.html   |  100 +-
 .../org/apache/hadoop/hbase/package-use.html       |   10 +-
 ...C.FailingSimpleRpcServer.FailingConnection.html | 1362 ++++++++++----------
 .../AbstractTestIPC.FailingSimpleRpcServer.html    | 1362 ++++++++++----------
 .../apache/hadoop/hbase/ipc/AbstractTestIPC.html   | 1362 ++++++++++----------
 .../apache/hadoop/hbase/ipc/TestBlockingIPC.html   |  133 +-
 .../org/apache/hadoop/hbase/ipc/TestNettyIPC.html  |  247 ++--
 .../apache/hadoop/hbase/ipc/TestNettyTlsIPC.html   |  144 +--
 57 files changed, 3647 insertions(+), 3624 deletions(-)

diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 3af3d73c7ef..3ef37a46b15 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 2.0.6, based on Prawn 2.4.0)
 /Producer (Apache HBase Team)
-/ModDate (D:20260115143212+00'00')
-/CreationDate (D:20260115144712+00'00')
+/ModDate (D:20260118143121+00'00')
+/CreationDate (D:20260118144602+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index db1be186c81..8028e39643c 100644
--- a/book.html
+++ b/book.html
@@ -50183,7 +50183,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 4.0.0-alpha-1-SNAPSHOT<br>
-Last updated 2026-01-15 14:32:12 UTC
+Last updated 2026-01-18 14:31:21 UTC
 </div>
 </div>
 <script type="text/x-mathjax-config">
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index e2cf19288cc..872ca5e7546 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:checkstyle-aggregate at 2026-01-15
+ from org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:checkstyle-aggregate at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/dependency-convergence.html b/dependency-convergence.html
index a6b3c8c14d8..c11af53c559 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/dependency-info.html b/dependency-info.html
index 94898cd85b3..82fc17bf29e 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/dependency-management.html b/dependency-management.html
index dcc48867937..1b99f3dcfd4 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/dependency-convergence.html b/hbase-website/dependency-convergence.html
index 3e59f7b84b4..ceaa57954f0 100644
--- a/hbase-website/dependency-convergence.html
+++ b/hbase-website/dependency-convergence.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/dependency-info.html b/hbase-website/dependency-info.html
index 403555781da..d89a82d9169 100644
--- a/hbase-website/dependency-info.html
+++ b/hbase-website/dependency-info.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/dependency-management.html b/hbase-website/dependency-management.html
index 4a016ed37a1..6f6c2971def 100644
--- a/hbase-website/dependency-management.html
+++ b/hbase-website/dependency-management.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/index.html b/hbase-website/index.html
index 9845e867a42..1e6b1b80db9 100644
--- a/hbase-website/index.html
+++ b/hbase-website/index.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:index at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:index at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/issue-management.html b/hbase-website/issue-management.html
index 52b85bf8f02..ff886ddc0b8 100644
--- a/hbase-website/issue-management.html
+++ b/hbase-website/issue-management.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/licenses.html b/hbase-website/licenses.html
index b1be56373da..246d237811f 100644
--- a/hbase-website/licenses.html
+++ b/hbase-website/licenses.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/mailing-lists.html b/hbase-website/mailing-lists.html
index 2865891cade..0367321ccc0 100644
--- a/hbase-website/mailing-lists.html
+++ b/hbase-website/mailing-lists.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/plugin-management.html b/hbase-website/plugin-management.html
index d6932b6f1e8..e4e67924b65 100644
--- a/hbase-website/plugin-management.html
+++ b/hbase-website/plugin-management.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/plugins.html b/hbase-website/plugins.html
index f5f5297f5ba..4708e187d40 100644
--- a/hbase-website/plugins.html
+++ b/hbase-website/plugins.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/project-info.html b/hbase-website/project-info.html
index 51f0e7ff554..07cb42c62a0 100644
--- a/hbase-website/project-info.html
+++ b/hbase-website/project-info.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-site-plugin:3.12.0:CategorySummaryDocumentRenderer at 2026-01-15
+ from org.apache.maven.plugins:maven-site-plugin:3.12.0:CategorySummaryDocumentRenderer at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/scm.html b/hbase-website/scm.html
index 219695f4795..088fca0a0b5 100644
--- a/hbase-website/scm.html
+++ b/hbase-website/scm.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/summary.html b/hbase-website/summary.html
index 8aade0f5e43..189eede6d43 100644
--- a/hbase-website/summary.html
+++ b/hbase-website/summary.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/hbase-website/team.html b/hbase-website/team.html
index ed2bd63db4b..1d7af6b05fa 100644
--- a/hbase-website/team.html
+++ b/hbase-website/team.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase - Website
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/issue-management.html b/issue-management.html
index 5660024cdd2..6dca8b75d00 100644
--- a/issue-management.html
+++ b/issue-management.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/licenses.html b/licenses.html
index fb52edcff23..b530ed96cdd 100644
--- a/licenses.html
+++ b/licenses.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/mailing-lists.html b/mailing-lists.html
index 08c14ce8628..b0b94eb2092 100644
--- a/mailing-lists.html
+++ b/mailing-lists.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/plugin-management.html b/plugin-management.html
index 7b925492597..4fa871934a6 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/plugins.html b/plugins.html
index 48ad3b425e9..53704fedbba 100644
--- a/plugins.html
+++ b/plugins.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/project-info.html b/project-info.html
index e26fa76e0ed..8b730477c2c 100644
--- a/project-info.html
+++ b/project-info.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-site-plugin:3.12.0:CategorySummaryDocumentRenderer at 2026-01-15
+ from org.apache.maven.plugins:maven-site-plugin:3.12.0:CategorySummaryDocumentRenderer at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/project-reports.html b/project-reports.html
index 8a907ed399e..f503e30875a 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-site-plugin:3.12.0:CategorySummaryDocumentRenderer at 2026-01-15
+ from org.apache.maven.plugins:maven-site-plugin:3.12.0:CategorySummaryDocumentRenderer at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/scm.html b/scm.html
index c5deffde98a..f8ef8016c62 100644
--- a/scm.html
+++ b/scm.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/summary.html b/summary.html
index a1db6f3a679..30889478efe 100644
--- a/summary.html
+++ b/summary.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/team.html b/team.html
index 70aeb359f48..d9eaccd0ea9 100644
--- a/team.html
+++ b/team.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!--
  | Generated by Apache Maven Doxia Site Renderer 1.11.1
- from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-01-15
+ from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-01-18
 
  | Rendered using Apache Maven Default Skin
 -->
@@ -45,7 +45,7 @@ Apache HBase
 
 
       <div class="xleft">
-        <span id="publishDate">Last Published: 2026-01-15</span>
+        <span id="publishDate">Last Published: 2026-01-18</span>
            | <span id="projectVersion">Version: 4.0.0-alpha-1-SNAPSHOT</span>
 
 
diff --git a/testapidocs/index-all.html b/testapidocs/index-all.html
index f9b48b4e757..0a3aedf049e 100644
--- a/testapidocs/index-all.html
+++ b/testapidocs/index-all.html
@@ -158,7 +158,7 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Some basic ipc tests.</div>
 </dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#%3Cinit%3E()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">AbstractTestIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">AbstractTestIPC</a></dt>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#%3Cinit%3E(java.lang.Class)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">AbstractTestIPC(Class&lt;? extends RpcServer&gt;)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">AbstractTestIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.regionserver.wal">AbstractTestLogRolling</a> - Class in <a href="org/apache/hadoop/hbase/regionserver/wal/package-summary.html">org.apache.hadoop.hbase.regionserver.wal</a></dt>
 <dd>
@@ -242,8 +242,6 @@ loadScripts(document, 'script');</script>
 </dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html#%3Cinit%3E()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls">AbstractTestX509Parameterized()</a> - Constructor for class org.apache.hadoop.hbase.io.crypto.tls.<a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="externa [...]
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#acceptPlainText" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">acceptPlainText</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/http/HttpServerFunctionalTest.html#access(java.lang.String)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.http">access(String)</a> - Static method in class org.apache.hadoop.hbase.http.<a href="../apidocs/org/apache/hadoop/hbase/http/HttpServerFunctionalTest.html" title="class or interface in org.apache.hadoop.hbase.http" class="external-link">HttpServerFunctionalTest</a></dt>
 <dd>
 <div class="block">access a url, ignoring some IOException such as the page does not exist</div>
@@ -1731,8 +1729,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html#caKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls">caKeyType</a> - Variable in class org.apache.hadoop.hbase.io.crypto.tls.<a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">AbstractTestX509Param [...]
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#caKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">caKeyType</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestMutualTls.html#caKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">caKeyType</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestMutualTls.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">AbstractTestMutualTls</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.html#caKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">caKeyType</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">AbstractTestTlsRejectPlainText</a></dt>
@@ -1799,8 +1795,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html#certKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls">certKeyType</a> - Variable in class org.apache.hadoop.hbase.io.crypto.tls.<a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">AbstractTestX509P [...]
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#certKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">certKeyType</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestMutualTls.html#certKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">certKeyType</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestMutualTls.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">AbstractTestMutualTls</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.html#certKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">certKeyType</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">AbstractTestTlsRejectPlainText</a></dt>
@@ -3091,8 +3085,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/util/TestMemorySizeUtil.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.util">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.io.util.<a href="../apidocs/org/apache/hadoop/hbase/io/util/TestMemorySizeUtil.html" title="class or interface in org.apache.hadoop.hbase.io.util" class="external-link">TestMemorySizeUtil</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestBlockingIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBufferChain.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBufferChain.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestBufferChain</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestCallRunner.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestCallRunner.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestCallRunner</a></dt>
@@ -3117,16 +3109,12 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyChannelWritability</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyIPCCloseConnection</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyRpcConnection</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyRpcServer</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestProtoBufRpc</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestRemoteWithExtrasException</a></dt>
@@ -5240,8 +5228,6 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Tag a test as related to the client.</div>
 </dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#clientTlsEnabled" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">clientTlsEnabled</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/client/TestCloneSnapshotFromClientCustomSFT.html#CLONE_SFT" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.client">CLONE_SFT</a> - Static variable in class org.apache.hadoop.hbase.client.<a href="../apidocs/org/apache/hadoop/hbase/client/TestCloneSnapshotFromClientCustomSFT.html" title="class or interface in org.apache.hadoop.hbase.client" class="external-link">TestCloneSnapshotFromClientCustomSF [...]
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#cloneAndAssertOneRetry(java.lang.String,org.apache.hadoop.hbase.TableName)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.snapshot">cloneAndAssertOneRetry(String, TableName)</a> - Method in class org.apache.hadoop.hbase.snapshot.<a href="../apidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html" title="class or interface in org.apache.hado [...]
@@ -6912,10 +6898,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/hfile/TestLazyDataBlockDecompression.html#data()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.hfile">data()</a> - Static method in class org.apache.hadoop.hbase.io.hfile.<a href="../apidocs/org/apache/hadoop/hbase/io/hfile/TestLazyDataBlockDecompression.html" title="class or interface in org.apache.hadoop.hbase.io.hfile" class="external-link">TestLazyDataBlockDecompression</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#data()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">data()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestBlockingIPC</a></dt>
-<dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#data()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">data()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.html#data()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.mob">data()</a> - Static method in class org.apache.hadoop.hbase.mob.<a href="../apidocs/org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.html" title="class or interface in org.apache.hadoop.hbase.mob" class="external-link">TestDefaultMobStoreFlusher</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.html#data()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.mob">data()</a> - Static method in class org.apache.hadoop.hbase.mob.<a href="../apidocs/org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.html" title="class or interface in org.apache.hadoop.hbase.mob" class="external-link">TestMobCompactionWithDefaults</a></dt>
@@ -8000,8 +7982,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>EVENT_ID - Enum constant in enum class org.apache.hadoop.hbase.util.bulkdatagenerator.Utility.TableColumnNames</dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#eventLoopType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">eventLoopType</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt>org.apache.hadoop.hbase.client.trace.hamcrest.EventMatchers - Class in <a href="org/apache/hadoop/hbase/client/trace/hamcrest/package-summary.html">org.apache.hadoop.hbase.client.trace.hamcrest</a></dt>
 <dd>
 <div class="block">Helper methods for matching against instances of <code>EventData</code>.</div>
@@ -12993,8 +12973,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html#keyPassword" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls">keyPassword</a> - Variable in class org.apache.hadoop.hbase.io.crypto.tls.<a href="../apidocs/org/apache/hadoop/hbase/io/crypto/tls/AbstractTestX509Parameterized.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">AbstractTestX509P [...]
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#keyPassword" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">keyPassword</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestMutualTls.html#keyPassword" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">keyPassword</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestMutualTls.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">AbstractTestMutualTls</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.html#keyPassword" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">keyPassword</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/AbstractTestTlsRejectPlainText.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">AbstractTestTlsRejectPlainText</a></dt>
@@ -15639,10 +15617,14 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/hfile/TestSeekTo.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.hfile">parameters()</a> - Static method in class org.apache.hadoop.hbase.io.hfile.<a href="../apidocs/org/apache/hadoop/hbase/io/hfile/TestSeekTo.html" title="class or interface in org.apache.hadoop.hbase.io.hfile" class="external-link">TestSeekTo</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestBlockingIPC</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyRpcServer</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestProtoBufRpc</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html#parameters()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestRpcHandlerException</a></dt>
@@ -18109,8 +18091,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/TestMutualTlsClientSideNonLocalhost.html#rpcServer" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">rpcServer</a> - Variable in class org.apache.hadoop.hbase.security.<a href="../apidocs/org/apache/hadoop/hbase/security/TestMutualTlsClientSideNonLocalhost.html" title="class or interface in org.apache.hadoop.hbase.security" class="external-link">TestMutualTlsClientSideNonLocalhos [...]
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#rpcServerImpl" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">rpcServerImpl</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">AbstractTestIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.html#rpcServerImpl" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">rpcServerImpl</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestMultipleServerPrincipalsIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#rpcServerImpl" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">rpcServerImpl</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestProtoBufRpc</a></dt>
@@ -26004,7 +25984,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#%3Cinit%3E()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestBlockingIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestBlockingIPC</a></dt>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#%3Cinit%3E(java.lang.Class)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestBlockingIPC(Class&lt;? extends RpcServer&gt;)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestBlockingIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/io/hfile/TestBlockIOUtils.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.io.hfile">TestBlockIOUtils</a> - Class in <a href="org/apache/hadoop/hbase/io/hfile/package-summary.html">org.apache.hadoop.hbase.io.hfile</a></dt>
 <dd>&nbsp;</dd>
@@ -37068,7 +37048,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyIPC</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#%3Cinit%3E()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyIPC</a></dt>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#%3Cinit%3E(java.lang.Class,java.lang.String)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyIPC(Class&lt;? extends RpcServer&gt;, String)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyIPCCloseConnection</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>
@@ -37094,7 +37074,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#%3Cinit%3E()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">TestNettyTlsIPC</a></dt>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#%3Cinit%3E(java.lang.Class,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,char%5B%5D,boolean,boolean)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC(Class&lt;? extends RpcServer&gt;, X509KeyType, X509KeyType, char[], boolean, boolean)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href= [...]
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/security/TestNettyTLSIPCFileWatcher.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.security">TestNettyTLSIPCFileWatcher</a> - Class in <a href="org/apache/hadoop/hbase/security/package-summary.html">org.apache.hadoop.hbase.security</a></dt>
 <dd>&nbsp;</dd>
@@ -46402,8 +46382,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/client/TestAsyncTableTracing.html#traceRule" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.client">traceRule</a> - Variable in class org.apache.hadoop.hbase.client.<a href="../apidocs/org/apache/hadoop/hbase/client/TestAsyncTableTracing.html" title="class or interface in org.apache.hadoop.hbase.client" class="external-link">TestAsyncTableTracing</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#traceRule" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">traceRule</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="../apidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class or interface in org.apache.hadoop.hbase.ipc" class="external-link">AbstractTestIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/regionserver/TestHRegionTracing.html#traceRule" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.regionserver">traceRule</a> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="../apidocs/org/apache/hadoop/hbase/regionserver/TestHRegionTracing.html" title="class or interface in org.apache.hadoop.hbase.regionserver" class="external-link">TestHRegionTracing</a></dt>
 <dd>&nbsp;</dd>
 <dt>org.apache.hadoop.hbase.client.trace.hamcrest.TraceTestUtil - Class in <a href="org/apache/hadoop/hbase/client/trace/hamcrest/package-summary.html">org.apache.hadoop.hbase.client.trace.hamcrest</a></dt>
diff --git a/testapidocs/member-search-index.js b/testapidocs/member-search-index.js
index ac1733ecd21..d386250e99c 100644
--- a/testapidocs/member-search-index.js
+++ b/testapidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"TestRegionObserverInterface","l":"A"},{"p":"org.apache.hadoop.hbase.client","c":"TestGetProcedureResult.DummyProcedure","l":"abort(MasterProcedureEnv)","u":"abort(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv)"},{"p":"org.apache.hadoop.hbase.master","c":"TestMigrateNamespaceTable.SuspendProcedure","l" [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"TestRegionObserverInterface","l":"A"},{"p":"org.apache.hadoop.hbase.client","c":"TestGetProcedureResult.DummyProcedure","l":"abort(MasterProcedureEnv)","u":"abort(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv)"},{"p":"org.apache.hadoop.hbase.master","c":"TestMigrateNamespaceTable.SuspendProcedure","l" [...]
\ No newline at end of file
diff --git a/testapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index 5bc5c1de2df..1cbeba152fa 100644
--- a/testapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -2378,46 +2378,40 @@ loadScripts(document, 'script');</script>
 <div class="table-header col-second">Field</div>
 <div class="table-header col-last">Description</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestBlockingIPC.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestBufferChain.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestBufferChain.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestBufferChain.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestBufferChain.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestCallRunner.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestCallRunner.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestCallRunner.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestCallRunner.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestCellBlockBuilder.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestCellBlockBuilder.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestConnectionId.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestConnectionId.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestConnectionId.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestConnectionId.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestFailedServersLog.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestFailedServersLog.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestFailedServersLog.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestFailedServersLog.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestFifoRpcScheduler.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestFifoRpcScheduler.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestHBaseClient.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestHBaseClient.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestHBaseClient.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestHBaseClient.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestHBaseRpcControllerImpl.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestHBaseRpcControllerImpl.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestIPCUtil.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestIPCUtil.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestIPCUtil.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestIPCUtil.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestMasterFifoRpcScheduler.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestMasterFifoRpcScheduler.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestMasterFifoRpcScheduler.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestMasterFifoRpcScheduler.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestMultipleServerPrincipalsIPC.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestMultipleServerPrincipalsIPC.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestMultipleServerPrincipalsIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestNettyChannelWritability.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
-<div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestNettyIPC.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestNettyChannelWritability.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
 <div class="col-second even-row-color"><span class="type-name-label">TestNettyIPCCloseConnection.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
@@ -2429,62 +2423,59 @@ loadScripts(document, 'script');</script>
 <div class="col-second even-row-color"><span class="type-name-label">TestNettyRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestNettyTlsIPC.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestProtoBufRpc.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestProtoBufRpc.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRemoteWithExtrasException.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRemoteWithExtrasException.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcClientDeprecatedNameMapping.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcClientDeprecatedNameMapping.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcClientDeprecatedNameMapping.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcClientDeprecatedNameMapping.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcClientLeaks.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcClientLeaks.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcClientLeaks.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcClientLeaks.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcConnectionHeader.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcConnectionHeader.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcConnectionHeader.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcConnectionHeader.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcHandlerException.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcHandlerException.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcMetrics.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcMetrics.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcMetrics.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcMetrics.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcServerSlowConnectionSetup.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcServerSlowConnectionSetup.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcServerSlowConnectionSetup.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcServerSlowConnectionSetup.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcServerTraceLogging.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcServerTraceLogging.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcServerTraceLogging.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcServerTraceLogging.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcSkipInitialSaslHandshake.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcSkipInitialSaslHandshake.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcSkipInitialSaslHandshake.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRpcSkipInitialSaslHandshake.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRWQueueRpcExecutor.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRWQueueRpcExecutor.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRWQueueRpcExecutor.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestRWQueueRpcExecutor.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestSecureNettyRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSecureNettyRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestSecureNettyRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSecureNettyRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestSecureSimpleRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSecureSimpleRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestSecureSimpleRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSecureSimpleRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestSecurityRpcSentBytesMetrics.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSecurityRpcSentBytesMetrics.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestSecurityRpcSentBytesMetrics.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSecurityRpcSentBytesMetrics.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestServerCall.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestServerCall.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestServerCall.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestServerCall.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestSimpleRpcScheduler.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestSimpleRpcScheduler.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestSimpleRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestSimpleRpcServer.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestSimpleRpcServer.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestTLSHandshadeFailure.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestTLSHandshadeFailure.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>static final <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestTLSHandshadeFailure.</span><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestTLSHandshadeFailure.html#CLASS_RULE" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">CLASS_RULE</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 </div>
 </section>
 </li>
diff --git a/testapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html b/testapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html
index ba5b730a17a..866cc9dfef0 100644
--- a/testapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html
+++ b/testapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html
@@ -57,8 +57,10 @@ loadScripts(document, 'script');</script>
 <div class="table-header col-last">Description</div>
 <div class="col-first even-row-color"><a href="#org.apache.hadoop.hbase.io.asyncfs">org.apache.hadoop.hbase.io.asyncfs</a></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><a href="#org.apache.hadoop.hbase.security">org.apache.hadoop.hbase.security</a></div>
+<div class="col-first odd-row-color"><a href="#org.apache.hadoop.hbase.ipc">org.apache.hadoop.hbase.ipc</a></div>
 <div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><a href="#org.apache.hadoop.hbase.security">org.apache.hadoop.hbase.security</a></div>
+<div class="col-last even-row-color">&nbsp;</div>
 </div>
 <section class="class-uses">
 <ul class="block-list">
@@ -77,6 +79,26 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="org.apache.hadoop.hbase.ipc">
+<h2>Uses of <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseParameterizedTestTemplate.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseParameterizedTestTemplate</a> in <a href="../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></h2>
+<div class="caption"><span>Classes in <a href="../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a> with annotations of type <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseParameterizedTestTemplate.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseParameterizedTestTemplate</a></span></div>
+<div class="summary-table three-column-summary">
+<div class="table-header col-first">Modifier and Type</div>
+<div class="table-header col-second">Class</div>
+<div class="table-header col-last">Description</div>
+<div class="col-first even-row-color"><code>class&nbsp;</code></div>
+<div class="col-second even-row-color"><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>class&nbsp;</code></div>
+<div class="col-second odd-row-color"><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>class&nbsp;</code></div>
+<div class="col-second even-row-color"><code><a href="../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" class="type-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+</div>
+</section>
+</li>
+<li>
 <section class="detail" id="org.apache.hadoop.hbase.security">
 <h2>Uses of <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseParameterizedTestTemplate.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseParameterizedTestTemplate</a> in <a href="../security/package-summary.html">org.apache.hadoop.hbase.security</a></h2>
 <div class="caption"><span>Classes in <a href="../security/package-summary.html">org.apache.hadoop.hbase.security</a> with annotations of type <a href="../../../../../../apidocs/org/apache/hadoop/hbase/HBaseParameterizedTestTemplate.html" title="class or interface in org.apache.hadoop.hbase" class="external-link">HBaseParameterizedTestTemplate</a></span></div>
diff --git a/testapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html b/testapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html
index 19ae8c696af..f080206aacd 100644
--- a/testapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html
+++ b/testapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html
@@ -124,17 +124,19 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="org.apache.hadoop.hbase.ipc">
 <h2>Uses of <a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a> in <a href="../../../../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></h2>
-<div class="caption"><span>Fields in <a href="../../../../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a> declared as <a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a></span></div>
+<div class="caption"><span>Constructors in <a href="../../../../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a> with parameters of type <a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a></span></div>
 <div class="summary-table three-column-summary">
-<div class="table-header col-first">Modifier and Type</div>
-<div class="table-header col-second">Field</div>
+<div class="table-header col-first">Modifier</div>
+<div class="table-header col-second">Constructor</div>
 <div class="table-header col-last">Description</div>
-<div class="col-first even-row-color"><code><a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestNettyTlsIPC.</span><code><a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#caKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">caKeyType</a></code></div>
+<div class="col-first even-row-color"><code>&nbsp;</code></div>
+<div class="col-second even-row-color"><code><a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#%3Cinit%3E(java.lang.Class,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,char%5B%5D,boolean,boolean)" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/l [...]
+ <a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a>&nbsp;caKeyType,
+ <a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a>&nbsp;certKeyType,
+ char[]&nbsp;keyPassword,
+ boolean&nbsp;acceptPlainText,
+ boolean&nbsp;clientTlsEnabled)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code><a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/io/crypto/tls/X509KeyType.html" title="class or interface in org.apache.hadoop.hbase.io.crypto.tls" class="external-link">X509KeyType</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestNettyTlsIPC.</span><code><a href="../../../../../../../../../apidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#certKeyType" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.ipc">certKeyType</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 </div>
 </section>
 </li>
diff --git a/testapidocs/org/apache/hadoop/hbase/package-use.html b/testapidocs/org/apache/hadoop/hbase/package-use.html
index ecd4e392291..3e2a13d07a5 100644
--- a/testapidocs/org/apache/hadoop/hbase/package-use.html
+++ b/testapidocs/org/apache/hadoop/hbase/package-use.html
@@ -949,12 +949,16 @@ loadScripts(document, 'script');</script>
 <div class="col-last even-row-color">
 <div class="block">The class level TestRule for all the tests.</div>
 </div>
-<div class="col-first odd-row-color"><a href="class-use/HBaseTestingUtil.html#org.apache.hadoop.hbase.ipc">HBaseTestingUtil</a></div>
+<div class="col-first odd-row-color"><a href="class-use/HBaseParameterizedTestTemplate.html#org.apache.hadoop.hbase.ipc">HBaseParameterizedTestTemplate</a></div>
 <div class="col-last odd-row-color">
-<div class="block">Facility for testing HBase.</div>
+<div class="block">The annotation for running JUnit4 like parameterized tests with JUnit5.</div>
 </div>
-<div class="col-first even-row-color"><a href="class-use/TableNameTestRule.html#org.apache.hadoop.hbase.ipc">TableNameTestRule</a></div>
+<div class="col-first even-row-color"><a href="class-use/HBaseTestingUtil.html#org.apache.hadoop.hbase.ipc">HBaseTestingUtil</a></div>
 <div class="col-last even-row-color">
+<div class="block">Facility for testing HBase.</div>
+</div>
+<div class="col-first odd-row-color"><a href="class-use/TableNameTestRule.html#org.apache.hadoop.hbase.ipc">TableNameTestRule</a></div>
+<div class="col-last odd-row-color">
 <div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
 </div>
 </div>
diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
index 6e454396038..1cdaeb4e72d 100644
--- a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
+++ b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
@@ -40,691 +40,695 @@
 <span class="source-line-no">027</span><span id="line-27">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;</span>
 <span class="source-line-no">028</span><span id="line-28">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newBlockingStub;</span>
 <span class="source-line-no">029</span><span id="line-29">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newStub;</span>
-<span class="source-line-no">030</span><span id="line-30">import static org.hamcrest.MatcherAssert.assertThat;</span>
-<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.Matchers.allOf;</span>
-<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.containsString;</span>
-<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.everyItem;</span>
-<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
-<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.hasItem;</span>
-<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.instanceOf;</span>
-<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.startsWith;</span>
-<span class="source-line-no">038</span><span id="line-38">import static org.junit.Assert.assertEquals;</span>
-<span class="source-line-no">039</span><span id="line-39">import static org.junit.Assert.assertFalse;</span>
-<span class="source-line-no">040</span><span id="line-40">import static org.junit.Assert.assertNotNull;</span>
-<span class="source-line-no">041</span><span id="line-41">import static org.junit.Assert.assertNull;</span>
-<span class="source-line-no">042</span><span id="line-42">import static org.junit.Assert.assertThrows;</span>
-<span class="source-line-no">043</span><span id="line-43">import static org.junit.Assert.assertTrue;</span>
-<span class="source-line-no">044</span><span id="line-44">import static org.junit.Assert.fail;</span>
-<span class="source-line-no">045</span><span id="line-45">import static org.mockito.ArgumentMatchers.any;</span>
-<span class="source-line-no">046</span><span id="line-46">import static org.mockito.Mockito.mock;</span>
-<span class="source-line-no">047</span><span id="line-47">import static org.mockito.Mockito.spy;</span>
-<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.verify;</span>
-<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.when;</span>
-<span class="source-line-no">050</span><span id="line-50">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
-<span class="source-line-no">051</span><span id="line-51"></span>
-<span class="source-line-no">052</span><span id="line-52">import io.opentelemetry.api.common.AttributeKey;</span>
-<span class="source-line-no">053</span><span id="line-53">import io.opentelemetry.api.trace.SpanKind;</span>
-<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.trace.StatusCode;</span>
-<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;</span>
-<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.sdk.trace.data.SpanData;</span>
-<span class="source-line-no">057</span><span id="line-57">import java.io.IOException;</span>
-<span class="source-line-no">058</span><span id="line-58">import java.net.InetSocketAddress;</span>
-<span class="source-line-no">059</span><span id="line-59">import java.nio.channels.SocketChannel;</span>
-<span class="source-line-no">060</span><span id="line-60">import java.time.Duration;</span>
-<span class="source-line-no">061</span><span id="line-61">import java.util.ArrayList;</span>
-<span class="source-line-no">062</span><span id="line-62">import java.util.Collections;</span>
-<span class="source-line-no">063</span><span id="line-63">import java.util.List;</span>
-<span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.CellScanner;</span>
-<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
-<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.ExtendedCell;</span>
-<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
-<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.HBaseServerBase;</span>
-<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.KeyValue;</span>
-<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.MatcherPredicate;</span>
-<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
-<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.Server;</span>
-<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.ServerName;</span>
-<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Waiter;</span>
-<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
-<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
-<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.io.compress.GzipCodec;</span>
-<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.ipc.RemoteException;</span>
-<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.util.StringUtils;</span>
-<span class="source-line-no">084</span><span id="line-84">import org.hamcrest.Matcher;</span>
-<span class="source-line-no">085</span><span id="line-85">import org.junit.Before;</span>
-<span class="source-line-no">086</span><span id="line-86">import org.junit.Rule;</span>
-<span class="source-line-no">087</span><span id="line-87">import org.junit.Test;</span>
-<span class="source-line-no">088</span><span id="line-88">import org.junit.runners.Parameterized.Parameter;</span>
-<span class="source-line-no">089</span><span id="line-89">import org.slf4j.Logger;</span>
-<span class="source-line-no">090</span><span id="line-90">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">091</span><span id="line-91"></span>
-<span class="source-line-no">092</span><span id="line-92">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
-<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
-<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
-<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
-<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
-<span class="source-line-no">097</span><span id="line-97"></span>
-<span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
-<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
-<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
-<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
-<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
-<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
-<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
-<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
-<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
-<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
-<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
-<span class="source-line-no">109</span><span id="line-109"></span>
-<span class="source-line-no">110</span><span id="line-110">/**</span>
-<span class="source-line-no">111</span><span id="line-111"> * Some basic ipc tests.</span>
-<span class="source-line-no">112</span><span id="line-112"> */</span>
-<span class="source-line-no">113</span><span id="line-113">public abstract class AbstractTestIPC {</span>
-<span class="source-line-no">114</span><span id="line-114"></span>
-<span class="source-line-no">115</span><span id="line-115">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
-<span class="source-line-no">116</span><span id="line-116"></span>
-<span class="source-line-no">117</span><span id="line-117">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
-<span class="source-line-no">118</span><span id="line-118">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
-<span class="source-line-no">119</span><span id="line-119"></span>
-<span class="source-line-no">120</span><span id="line-120">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
-<span class="source-line-no">121</span><span id="line-121"></span>
-<span class="source-line-no">122</span><span id="line-122">  protected RpcServer createRpcServer(Server server, String name,</span>
-<span class="source-line-no">123</span><span id="line-123">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
-<span class="source-line-no">124</span><span id="line-124">    RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">125</span><span id="line-125">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
-<span class="source-line-no">129</span><span id="line-129">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">130</span><span id="line-130">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">131</span><span id="line-131">  }</span>
-<span class="source-line-no">132</span><span id="line-132"></span>
-<span class="source-line-no">133</span><span id="line-133">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
-<span class="source-line-no">134</span><span id="line-134"></span>
-<span class="source-line-no">135</span><span id="line-135">  @Rule</span>
-<span class="source-line-no">136</span><span id="line-136">  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();</span>
-<span class="source-line-no">137</span><span id="line-137"></span>
-<span class="source-line-no">138</span><span id="line-138">  @Parameter(0)</span>
-<span class="source-line-no">139</span><span id="line-139">  public Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
+<span class="source-line-no">030</span><span id="line-30">import static org.awaitility.Awaitility.await;</span>
+<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.MatcherAssert.assertThat;</span>
+<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.allOf;</span>
+<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.containsString;</span>
+<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.everyItem;</span>
+<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
+<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.hasItem;</span>
+<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.instanceOf;</span>
+<span class="source-line-no">038</span><span id="line-38">import static org.hamcrest.Matchers.lessThan;</span>
+<span class="source-line-no">039</span><span id="line-39">import static org.hamcrest.Matchers.startsWith;</span>
+<span class="source-line-no">040</span><span id="line-40">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">041</span><span id="line-41">import static org.junit.jupiter.api.Assertions.assertFalse;</span>
+<span class="source-line-no">042</span><span id="line-42">import static org.junit.jupiter.api.Assertions.assertNotNull;</span>
+<span class="source-line-no">043</span><span id="line-43">import static org.junit.jupiter.api.Assertions.assertNull;</span>
+<span class="source-line-no">044</span><span id="line-44">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">045</span><span id="line-45">import static org.junit.jupiter.api.Assertions.assertTrue;</span>
+<span class="source-line-no">046</span><span id="line-46">import static org.junit.jupiter.api.Assertions.fail;</span>
+<span class="source-line-no">047</span><span id="line-47">import static org.mockito.ArgumentMatchers.any;</span>
+<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.mock;</span>
+<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.spy;</span>
+<span class="source-line-no">050</span><span id="line-50">import static org.mockito.Mockito.verify;</span>
+<span class="source-line-no">051</span><span id="line-51">import static org.mockito.Mockito.when;</span>
+<span class="source-line-no">052</span><span id="line-52">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.common.AttributeKey;</span>
+<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.api.trace.SpanKind;</span>
+<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.api.trace.StatusCode;</span>
+<span class="source-line-no">057</span><span id="line-57">import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;</span>
+<span class="source-line-no">058</span><span id="line-58">import io.opentelemetry.sdk.trace.data.SpanData;</span>
+<span class="source-line-no">059</span><span id="line-59">import java.io.IOException;</span>
+<span class="source-line-no">060</span><span id="line-60">import java.net.InetSocketAddress;</span>
+<span class="source-line-no">061</span><span id="line-61">import java.nio.channels.SocketChannel;</span>
+<span class="source-line-no">062</span><span id="line-62">import java.time.Duration;</span>
+<span class="source-line-no">063</span><span id="line-63">import java.util.ArrayList;</span>
+<span class="source-line-no">064</span><span id="line-64">import java.util.Collections;</span>
+<span class="source-line-no">065</span><span id="line-65">import java.util.List;</span>
+<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.CellScanner;</span>
+<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
+<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.ExtendedCell;</span>
+<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
+<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.HBaseServerBase;</span>
+<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.KeyValue;</span>
+<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.MatcherPredicate;</span>
+<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
+<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Server;</span>
+<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ServerName;</span>
+<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.Waiter;</span>
+<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
+<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
+<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.io.compress.GzipCodec;</span>
+<span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.ipc.RemoteException;</span>
+<span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.util.StringUtils;</span>
+<span class="source-line-no">086</span><span id="line-86">import org.hamcrest.Matcher;</span>
+<span class="source-line-no">087</span><span id="line-87">import org.junit.jupiter.api.BeforeEach;</span>
+<span class="source-line-no">088</span><span id="line-88">import org.junit.jupiter.api.TestTemplate;</span>
+<span class="source-line-no">089</span><span id="line-89">import org.junit.jupiter.api.extension.RegisterExtension;</span>
+<span class="source-line-no">090</span><span id="line-90">import org.slf4j.Logger;</span>
+<span class="source-line-no">091</span><span id="line-91">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">092</span><span id="line-92"></span>
+<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
+<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
+<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
+<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
+<span class="source-line-no">097</span><span id="line-97">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
+<span class="source-line-no">098</span><span id="line-98"></span>
+<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
+<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
+<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
+<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
+<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
+<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
+<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
+<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
+<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
+<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
+<span class="source-line-no">109</span><span id="line-109">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
+<span class="source-line-no">110</span><span id="line-110"></span>
+<span class="source-line-no">111</span><span id="line-111">/**</span>
+<span class="source-line-no">112</span><span id="line-112"> * Some basic ipc tests.</span>
+<span class="source-line-no">113</span><span id="line-113"> */</span>
+<span class="source-line-no">114</span><span id="line-114">public abstract class AbstractTestIPC {</span>
+<span class="source-line-no">115</span><span id="line-115"></span>
+<span class="source-line-no">116</span><span id="line-116">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
+<span class="source-line-no">117</span><span id="line-117"></span>
+<span class="source-line-no">118</span><span id="line-118">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
+<span class="source-line-no">119</span><span id="line-119">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
+<span class="source-line-no">120</span><span id="line-120"></span>
+<span class="source-line-no">121</span><span id="line-121">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
+<span class="source-line-no">122</span><span id="line-122"></span>
+<span class="source-line-no">123</span><span id="line-123">  protected RpcServer createRpcServer(Server server, String name,</span>
+<span class="source-line-no">124</span><span id="line-124">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
+<span class="source-line-no">125</span><span id="line-125">    RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">126</span><span id="line-126">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">127</span><span id="line-127">  }</span>
+<span class="source-line-no">128</span><span id="line-128"></span>
+<span class="source-line-no">129</span><span id="line-129">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
+<span class="source-line-no">130</span><span id="line-130">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">131</span><span id="line-131">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">132</span><span id="line-132">  }</span>
+<span class="source-line-no">133</span><span id="line-133"></span>
+<span class="source-line-no">134</span><span id="line-134">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
+<span class="source-line-no">135</span><span id="line-135"></span>
+<span class="source-line-no">136</span><span id="line-136">  @RegisterExtension</span>
+<span class="source-line-no">137</span><span id="line-137">  private static final OpenTelemetryExtension OTEL_EXT = OpenTelemetryExtension.create();</span>
+<span class="source-line-no">138</span><span id="line-138"></span>
+<span class="source-line-no">139</span><span id="line-139">  private Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
 <span class="source-line-no">140</span><span id="line-140"></span>
-<span class="source-line-no">141</span><span id="line-141">  @Before</span>
-<span class="source-line-no">142</span><span id="line-142">  public void setUpBeforeTest() {</span>
-<span class="source-line-no">143</span><span id="line-143">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
-<span class="source-line-no">144</span><span id="line-144">  }</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">  /**</span>
-<span class="source-line-no">147</span><span id="line-147">   * Ensure we do not HAVE TO HAVE a codec.</span>
-<span class="source-line-no">148</span><span id="line-148">   */</span>
-<span class="source-line-no">149</span><span id="line-149">  @Test</span>
-<span class="source-line-no">150</span><span id="line-150">  public void testNoCodec() throws IOException, ServiceException {</span>
-<span class="source-line-no">151</span><span id="line-151">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">152</span><span id="line-152">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">153</span><span id="line-153">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">154</span><span id="line-154">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">155</span><span id="line-155">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
-<span class="source-line-no">156</span><span id="line-156">      rpcServer.start();</span>
-<span class="source-line-no">157</span><span id="line-157">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">158</span><span id="line-158">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">159</span><span id="line-159">      String message = "hello";</span>
-<span class="source-line-no">160</span><span id="line-160">      assertEquals(message,</span>
-<span class="source-line-no">161</span><span id="line-161">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">162</span><span id="line-162">      assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">163</span><span id="line-163">    } finally {</span>
-<span class="source-line-no">164</span><span id="line-164">      rpcServer.stop();</span>
-<span class="source-line-no">165</span><span id="line-165">    }</span>
-<span class="source-line-no">166</span><span id="line-166">  }</span>
-<span class="source-line-no">167</span><span id="line-167"></span>
-<span class="source-line-no">168</span><span id="line-168">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
-<span class="source-line-no">169</span><span id="line-169"></span>
-<span class="source-line-no">170</span><span id="line-170">  /**</span>
-<span class="source-line-no">171</span><span id="line-171">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
-<span class="source-line-no">172</span><span id="line-172">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
-<span class="source-line-no">173</span><span id="line-173">   * confirm that compression is happening down in the client and server).</span>
-<span class="source-line-no">174</span><span id="line-174">   */</span>
-<span class="source-line-no">175</span><span id="line-175">  @Test</span>
-<span class="source-line-no">176</span><span id="line-176">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
-<span class="source-line-no">177</span><span id="line-177">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">178</span><span id="line-178">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
-<span class="source-line-no">179</span><span id="line-179">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">180</span><span id="line-180">    int count = 3;</span>
-<span class="source-line-no">181</span><span id="line-181">    for (int i = 0; i &lt; count; i++) {</span>
-<span class="source-line-no">182</span><span id="line-182">      cells.add(CELL);</span>
-<span class="source-line-no">183</span><span id="line-183">    }</span>
-<span class="source-line-no">184</span><span id="line-184">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">185</span><span id="line-185">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">186</span><span id="line-186">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">189</span><span id="line-189">      rpcServer.start();</span>
-<span class="source-line-no">190</span><span id="line-190">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">191</span><span id="line-191">      HBaseRpcController pcrc =</span>
-<span class="source-line-no">192</span><span id="line-192">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
-<span class="source-line-no">193</span><span id="line-193">      String message = "hello";</span>
-<span class="source-line-no">194</span><span id="line-194">      assertEquals(message,</span>
-<span class="source-line-no">195</span><span id="line-195">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">196</span><span id="line-196">      int index = 0;</span>
-<span class="source-line-no">197</span><span id="line-197">      CellScanner cellScanner = pcrc.cellScanner();</span>
-<span class="source-line-no">198</span><span id="line-198">      assertNotNull(cellScanner);</span>
-<span class="source-line-no">199</span><span id="line-199">      while (cellScanner.advance()) {</span>
-<span class="source-line-no">200</span><span id="line-200">        assertEquals(CELL, cellScanner.current());</span>
-<span class="source-line-no">201</span><span id="line-201">        index++;</span>
-<span class="source-line-no">202</span><span id="line-202">      }</span>
-<span class="source-line-no">203</span><span id="line-203">      assertEquals(count, index);</span>
-<span class="source-line-no">204</span><span id="line-204">    } finally {</span>
-<span class="source-line-no">205</span><span id="line-205">      rpcServer.stop();</span>
-<span class="source-line-no">206</span><span id="line-206">    }</span>
-<span class="source-line-no">207</span><span id="line-207">  }</span>
-<span class="source-line-no">208</span><span id="line-208"></span>
-<span class="source-line-no">209</span><span id="line-209">  protected abstract AbstractRpcClient&lt;?&gt;</span>
-<span class="source-line-no">210</span><span id="line-210">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
-<span class="source-line-no">211</span><span id="line-211"></span>
-<span class="source-line-no">212</span><span id="line-212">  @Test</span>
-<span class="source-line-no">213</span><span id="line-213">  public void testRTEDuringConnectionSetup() throws Exception {</span>
-<span class="source-line-no">214</span><span id="line-214">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">215</span><span id="line-215">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">216</span><span id="line-216">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">217</span><span id="line-217">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">218</span><span id="line-218">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
-<span class="source-line-no">219</span><span id="line-219">      rpcServer.start();</span>
-<span class="source-line-no">220</span><span id="line-220">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">221</span><span id="line-221">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">222</span><span id="line-222">      fail("Expected an exception to have been thrown!");</span>
-<span class="source-line-no">223</span><span id="line-223">    } catch (Exception e) {</span>
-<span class="source-line-no">224</span><span id="line-224">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">225</span><span id="line-225">      assertTrue(e.toString(), StringUtils.stringifyException(e).contains("Injected fault"));</span>
-<span class="source-line-no">226</span><span id="line-226">    } finally {</span>
-<span class="source-line-no">227</span><span id="line-227">      rpcServer.stop();</span>
-<span class="source-line-no">228</span><span id="line-228">    }</span>
-<span class="source-line-no">229</span><span id="line-229">  }</span>
-<span class="source-line-no">230</span><span id="line-230"></span>
-<span class="source-line-no">231</span><span id="line-231">  /**</span>
-<span class="source-line-no">232</span><span id="line-232">   * Tests that the rpc scheduler is called when requests arrive.</span>
-<span class="source-line-no">233</span><span id="line-233">   */</span>
-<span class="source-line-no">234</span><span id="line-234">  @Test</span>
-<span class="source-line-no">235</span><span id="line-235">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
-<span class="source-line-no">236</span><span id="line-236">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">237</span><span id="line-237">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">238</span><span id="line-238">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">239</span><span id="line-239">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">240</span><span id="line-240">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
-<span class="source-line-no">241</span><span id="line-241">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
-<span class="source-line-no">242</span><span id="line-242">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">243</span><span id="line-243">      rpcServer.start();</span>
-<span class="source-line-no">244</span><span id="line-244">      verify(scheduler).start();</span>
-<span class="source-line-no">245</span><span id="line-245">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">246</span><span id="line-246">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">247</span><span id="line-247">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">248</span><span id="line-248">        stub.echo(null, param);</span>
-<span class="source-line-no">249</span><span id="line-249">      }</span>
-<span class="source-line-no">250</span><span id="line-250">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
-<span class="source-line-no">251</span><span id="line-251">    } finally {</span>
-<span class="source-line-no">252</span><span id="line-252">      rpcServer.stop();</span>
-<span class="source-line-no">253</span><span id="line-253">      verify(scheduler).stop();</span>
-<span class="source-line-no">254</span><span id="line-254">    }</span>
-<span class="source-line-no">255</span><span id="line-255">  }</span>
-<span class="source-line-no">256</span><span id="line-256"></span>
-<span class="source-line-no">257</span><span id="line-257">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
-<span class="source-line-no">258</span><span id="line-258">  @Test</span>
-<span class="source-line-no">259</span><span id="line-259">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
-<span class="source-line-no">260</span><span id="line-260">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">261</span><span id="line-261">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
-<span class="source-line-no">262</span><span id="line-262">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">263</span><span id="line-263">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">264</span><span id="line-264">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
-<span class="source-line-no">265</span><span id="line-265">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">266</span><span id="line-266">      rpcServer.start();</span>
-<span class="source-line-no">267</span><span id="line-267">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">268</span><span id="line-268">      StringBuilder message = new StringBuilder(1200);</span>
-<span class="source-line-no">269</span><span id="line-269">      for (int i = 0; i &lt; 200; i++) {</span>
-<span class="source-line-no">270</span><span id="line-270">        message.append("hello.");</span>
-<span class="source-line-no">271</span><span id="line-271">      }</span>
-<span class="source-line-no">272</span><span id="line-272">      // set total RPC size bigger than 100 bytes</span>
-<span class="source-line-no">273</span><span id="line-273">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
-<span class="source-line-no">274</span><span id="line-274">      stub.echo(new HBaseRpcControllerImpl(</span>
-<span class="source-line-no">275</span><span id="line-275">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
-<span class="source-line-no">276</span><span id="line-276">      fail("RPC should have failed because it exceeds max request size");</span>
-<span class="source-line-no">277</span><span id="line-277">    } catch (ServiceException e) {</span>
-<span class="source-line-no">278</span><span id="line-278">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">279</span><span id="line-279">      assertTrue(e.toString(),</span>
-<span class="source-line-no">280</span><span id="line-280">        StringUtils.stringifyException(e).contains("RequestTooBigException"));</span>
-<span class="source-line-no">281</span><span id="line-281">    } finally {</span>
-<span class="source-line-no">282</span><span id="line-282">      rpcServer.stop();</span>
-<span class="source-line-no">283</span><span id="line-283">    }</span>
-<span class="source-line-no">284</span><span id="line-284">  }</span>
-<span class="source-line-no">285</span><span id="line-285"></span>
-<span class="source-line-no">286</span><span id="line-286">  /**</span>
-<span class="source-line-no">287</span><span id="line-287">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
-<span class="source-line-no">288</span><span id="line-288">   * remoteAddress set to its Call Object</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  @Test</span>
-<span class="source-line-no">291</span><span id="line-291">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
-<span class="source-line-no">292</span><span id="line-292">    throws IOException, ServiceException {</span>
-<span class="source-line-no">293</span><span id="line-293">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">294</span><span id="line-294">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">295</span><span id="line-295">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">296</span><span id="line-296">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">297</span><span id="line-297">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
-<span class="source-line-no">298</span><span id="line-298">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">299</span><span id="line-299">      rpcServer.start();</span>
-<span class="source-line-no">300</span><span id="line-300">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">301</span><span id="line-301">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
-<span class="source-line-no">302</span><span id="line-302">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
-<span class="source-line-no">303</span><span id="line-303">    } finally {</span>
-<span class="source-line-no">304</span><span id="line-304">      rpcServer.stop();</span>
-<span class="source-line-no">305</span><span id="line-305">    }</span>
-<span class="source-line-no">306</span><span id="line-306">  }</span>
-<span class="source-line-no">307</span><span id="line-307"></span>
-<span class="source-line-no">308</span><span id="line-308">  @Test</span>
-<span class="source-line-no">309</span><span id="line-309">  public void testRemoteError() throws IOException, ServiceException {</span>
-<span class="source-line-no">310</span><span id="line-310">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">311</span><span id="line-311">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">312</span><span id="line-312">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">313</span><span id="line-313">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">314</span><span id="line-314">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">315</span><span id="line-315">      rpcServer.start();</span>
-<span class="source-line-no">316</span><span id="line-316">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">317</span><span id="line-317">      stub.error(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">318</span><span id="line-318">    } catch (ServiceException e) {</span>
-<span class="source-line-no">319</span><span id="line-319">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">320</span><span id="line-320">      IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">321</span><span id="line-321">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">322</span><span id="line-322">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">323</span><span id="line-323">    } finally {</span>
-<span class="source-line-no">324</span><span id="line-324">      rpcServer.stop();</span>
-<span class="source-line-no">325</span><span id="line-325">    }</span>
-<span class="source-line-no">326</span><span id="line-326">  }</span>
-<span class="source-line-no">327</span><span id="line-327"></span>
-<span class="source-line-no">328</span><span id="line-328">  @Test</span>
-<span class="source-line-no">329</span><span id="line-329">  public void testTimeout() throws IOException {</span>
-<span class="source-line-no">330</span><span id="line-330">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">331</span><span id="line-331">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">332</span><span id="line-332">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">333</span><span id="line-333">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">334</span><span id="line-334">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">335</span><span id="line-335">      rpcServer.start();</span>
-<span class="source-line-no">336</span><span id="line-336">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">337</span><span id="line-337">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">338</span><span id="line-338">      int ms = 1000;</span>
-<span class="source-line-no">339</span><span id="line-339">      int timeout = 100;</span>
-<span class="source-line-no">340</span><span id="line-340">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">341</span><span id="line-341">        pcrc.reset();</span>
-<span class="source-line-no">342</span><span id="line-342">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">343</span><span id="line-343">        long startTime = System.nanoTime();</span>
-<span class="source-line-no">344</span><span id="line-344">        try {</span>
-<span class="source-line-no">345</span><span id="line-345">          stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build());</span>
-<span class="source-line-no">346</span><span id="line-346">        } catch (ServiceException e) {</span>
-<span class="source-line-no">347</span><span id="line-347">          long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">348</span><span id="line-348">          // expected</span>
-<span class="source-line-no">349</span><span id="line-349">          LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">350</span><span id="line-350">          IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">351</span><span id="line-351">          assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">352</span><span id="line-352">          // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">353</span><span id="line-353">          assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">354</span><span id="line-354">        }</span>
-<span class="source-line-no">355</span><span id="line-355">      }</span>
-<span class="source-line-no">356</span><span id="line-356">    } finally {</span>
-<span class="source-line-no">357</span><span id="line-357">      rpcServer.stop();</span>
-<span class="source-line-no">358</span><span id="line-358">    }</span>
-<span class="source-line-no">359</span><span id="line-359">  }</span>
-<span class="source-line-no">360</span><span id="line-360"></span>
-<span class="source-line-no">361</span><span id="line-361">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
-<span class="source-line-no">362</span><span id="line-362"></span>
-<span class="source-line-no">363</span><span id="line-363">    FailingSimpleRpcServer(Server server, String name,</span>
-<span class="source-line-no">364</span><span id="line-364">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
-<span class="source-line-no">365</span><span id="line-365">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">366</span><span id="line-366">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
-<span class="source-line-no">367</span><span id="line-367">    }</span>
+<span class="source-line-no">141</span><span id="line-141">  protected AbstractTestIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl) {</span>
+<span class="source-line-no">142</span><span id="line-142">    this.rpcServerImpl = rpcServerImpl;</span>
+<span class="source-line-no">143</span><span id="line-143">  }</span>
+<span class="source-line-no">144</span><span id="line-144"></span>
+<span class="source-line-no">145</span><span id="line-145">  @BeforeEach</span>
+<span class="source-line-no">146</span><span id="line-146">  public void setUpBeforeTest() {</span>
+<span class="source-line-no">147</span><span id="line-147">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
+<span class="source-line-no">148</span><span id="line-148">  }</span>
+<span class="source-line-no">149</span><span id="line-149"></span>
+<span class="source-line-no">150</span><span id="line-150">  /**</span>
+<span class="source-line-no">151</span><span id="line-151">   * Ensure we do not HAVE TO HAVE a codec.</span>
+<span class="source-line-no">152</span><span id="line-152">   */</span>
+<span class="source-line-no">153</span><span id="line-153">  @TestTemplate</span>
+<span class="source-line-no">154</span><span id="line-154">  public void testNoCodec() throws IOException, ServiceException {</span>
+<span class="source-line-no">155</span><span id="line-155">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">156</span><span id="line-156">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">157</span><span id="line-157">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">158</span><span id="line-158">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">159</span><span id="line-159">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
+<span class="source-line-no">160</span><span id="line-160">      rpcServer.start();</span>
+<span class="source-line-no">161</span><span id="line-161">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">162</span><span id="line-162">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">163</span><span id="line-163">      String message = "hello";</span>
+<span class="source-line-no">164</span><span id="line-164">      assertEquals(message,</span>
+<span class="source-line-no">165</span><span id="line-165">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">166</span><span id="line-166">      assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">167</span><span id="line-167">    } finally {</span>
+<span class="source-line-no">168</span><span id="line-168">      rpcServer.stop();</span>
+<span class="source-line-no">169</span><span id="line-169">    }</span>
+<span class="source-line-no">170</span><span id="line-170">  }</span>
+<span class="source-line-no">171</span><span id="line-171"></span>
+<span class="source-line-no">172</span><span id="line-172">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
+<span class="source-line-no">173</span><span id="line-173"></span>
+<span class="source-line-no">174</span><span id="line-174">  /**</span>
+<span class="source-line-no">175</span><span id="line-175">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
+<span class="source-line-no">176</span><span id="line-176">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
+<span class="source-line-no">177</span><span id="line-177">   * confirm that compression is happening down in the client and server).</span>
+<span class="source-line-no">178</span><span id="line-178">   */</span>
+<span class="source-line-no">179</span><span id="line-179">  @TestTemplate</span>
+<span class="source-line-no">180</span><span id="line-180">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
+<span class="source-line-no">181</span><span id="line-181">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">182</span><span id="line-182">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
+<span class="source-line-no">183</span><span id="line-183">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">184</span><span id="line-184">    int count = 3;</span>
+<span class="source-line-no">185</span><span id="line-185">    for (int i = 0; i &lt; count; i++) {</span>
+<span class="source-line-no">186</span><span id="line-186">      cells.add(CELL);</span>
+<span class="source-line-no">187</span><span id="line-187">    }</span>
+<span class="source-line-no">188</span><span id="line-188">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">189</span><span id="line-189">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">190</span><span id="line-190">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">191</span><span id="line-191"></span>
+<span class="source-line-no">192</span><span id="line-192">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">193</span><span id="line-193">      rpcServer.start();</span>
+<span class="source-line-no">194</span><span id="line-194">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">195</span><span id="line-195">      HBaseRpcController pcrc =</span>
+<span class="source-line-no">196</span><span id="line-196">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
+<span class="source-line-no">197</span><span id="line-197">      String message = "hello";</span>
+<span class="source-line-no">198</span><span id="line-198">      assertEquals(message,</span>
+<span class="source-line-no">199</span><span id="line-199">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">200</span><span id="line-200">      int index = 0;</span>
+<span class="source-line-no">201</span><span id="line-201">      CellScanner cellScanner = pcrc.cellScanner();</span>
+<span class="source-line-no">202</span><span id="line-202">      assertNotNull(cellScanner);</span>
+<span class="source-line-no">203</span><span id="line-203">      while (cellScanner.advance()) {</span>
+<span class="source-line-no">204</span><span id="line-204">        assertEquals(CELL, cellScanner.current());</span>
+<span class="source-line-no">205</span><span id="line-205">        index++;</span>
+<span class="source-line-no">206</span><span id="line-206">      }</span>
+<span class="source-line-no">207</span><span id="line-207">      assertEquals(count, index);</span>
+<span class="source-line-no">208</span><span id="line-208">    } finally {</span>
+<span class="source-line-no">209</span><span id="line-209">      rpcServer.stop();</span>
+<span class="source-line-no">210</span><span id="line-210">    }</span>
+<span class="source-line-no">211</span><span id="line-211">  }</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">  protected abstract AbstractRpcClient&lt;?&gt;</span>
+<span class="source-line-no">214</span><span id="line-214">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
+<span class="source-line-no">215</span><span id="line-215"></span>
+<span class="source-line-no">216</span><span id="line-216">  @TestTemplate</span>
+<span class="source-line-no">217</span><span id="line-217">  public void testRTEDuringConnectionSetup() throws Exception {</span>
+<span class="source-line-no">218</span><span id="line-218">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">219</span><span id="line-219">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">220</span><span id="line-220">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">221</span><span id="line-221">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">222</span><span id="line-222">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
+<span class="source-line-no">223</span><span id="line-223">      rpcServer.start();</span>
+<span class="source-line-no">224</span><span id="line-224">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">225</span><span id="line-225">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
+<span class="source-line-no">226</span><span id="line-226">      fail("Expected an exception to have been thrown!");</span>
+<span class="source-line-no">227</span><span id="line-227">    } catch (Exception e) {</span>
+<span class="source-line-no">228</span><span id="line-228">      LOG.info("Caught expected exception: " + e.toString());</span>
+<span class="source-line-no">229</span><span id="line-229">      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"), e.toString());</span>
+<span class="source-line-no">230</span><span id="line-230">    } finally {</span>
+<span class="source-line-no">231</span><span id="line-231">      rpcServer.stop();</span>
+<span class="source-line-no">232</span><span id="line-232">    }</span>
+<span class="source-line-no">233</span><span id="line-233">  }</span>
+<span class="source-line-no">234</span><span id="line-234"></span>
+<span class="source-line-no">235</span><span id="line-235">  /**</span>
+<span class="source-line-no">236</span><span id="line-236">   * Tests that the rpc scheduler is called when requests arrive.</span>
+<span class="source-line-no">237</span><span id="line-237">   */</span>
+<span class="source-line-no">238</span><span id="line-238">  @TestTemplate</span>
+<span class="source-line-no">239</span><span id="line-239">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
+<span class="source-line-no">240</span><span id="line-240">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">241</span><span id="line-241">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">242</span><span id="line-242">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">243</span><span id="line-243">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">244</span><span id="line-244">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
+<span class="source-line-no">245</span><span id="line-245">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
+<span class="source-line-no">246</span><span id="line-246">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">247</span><span id="line-247">      rpcServer.start();</span>
+<span class="source-line-no">248</span><span id="line-248">      verify(scheduler).start();</span>
+<span class="source-line-no">249</span><span id="line-249">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">250</span><span id="line-250">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">251</span><span id="line-251">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">252</span><span id="line-252">        stub.echo(null, param);</span>
+<span class="source-line-no">253</span><span id="line-253">      }</span>
+<span class="source-line-no">254</span><span id="line-254">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
+<span class="source-line-no">255</span><span id="line-255">    } finally {</span>
+<span class="source-line-no">256</span><span id="line-256">      rpcServer.stop();</span>
+<span class="source-line-no">257</span><span id="line-257">      verify(scheduler).stop();</span>
+<span class="source-line-no">258</span><span id="line-258">    }</span>
+<span class="source-line-no">259</span><span id="line-259">  }</span>
+<span class="source-line-no">260</span><span id="line-260"></span>
+<span class="source-line-no">261</span><span id="line-261">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
+<span class="source-line-no">262</span><span id="line-262">  @TestTemplate</span>
+<span class="source-line-no">263</span><span id="line-263">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
+<span class="source-line-no">264</span><span id="line-264">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">265</span><span id="line-265">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
+<span class="source-line-no">266</span><span id="line-266">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">267</span><span id="line-267">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">268</span><span id="line-268">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
+<span class="source-line-no">269</span><span id="line-269">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">270</span><span id="line-270">      rpcServer.start();</span>
+<span class="source-line-no">271</span><span id="line-271">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">272</span><span id="line-272">      StringBuilder message = new StringBuilder(1200);</span>
+<span class="source-line-no">273</span><span id="line-273">      for (int i = 0; i &lt; 200; i++) {</span>
+<span class="source-line-no">274</span><span id="line-274">        message.append("hello.");</span>
+<span class="source-line-no">275</span><span id="line-275">      }</span>
+<span class="source-line-no">276</span><span id="line-276">      // set total RPC size bigger than 100 bytes</span>
+<span class="source-line-no">277</span><span id="line-277">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
+<span class="source-line-no">278</span><span id="line-278">      stub.echo(new HBaseRpcControllerImpl(</span>
+<span class="source-line-no">279</span><span id="line-279">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
+<span class="source-line-no">280</span><span id="line-280">      fail("RPC should have failed because it exceeds max request size");</span>
+<span class="source-line-no">281</span><span id="line-281">    } catch (ServiceException e) {</span>
+<span class="source-line-no">282</span><span id="line-282">      LOG.info("Caught expected exception: " + e);</span>
+<span class="source-line-no">283</span><span id="line-283">      assertTrue(StringUtils.stringifyException(e).contains("RequestTooBigException"),</span>
+<span class="source-line-no">284</span><span id="line-284">        e.toString());</span>
+<span class="source-line-no">285</span><span id="line-285">    } finally {</span>
+<span class="source-line-no">286</span><span id="line-286">      rpcServer.stop();</span>
+<span class="source-line-no">287</span><span id="line-287">    }</span>
+<span class="source-line-no">288</span><span id="line-288">  }</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
+<span class="source-line-no">292</span><span id="line-292">   * remoteAddress set to its Call Object</span>
+<span class="source-line-no">293</span><span id="line-293">   */</span>
+<span class="source-line-no">294</span><span id="line-294">  @TestTemplate</span>
+<span class="source-line-no">295</span><span id="line-295">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
+<span class="source-line-no">296</span><span id="line-296">    throws IOException, ServiceException {</span>
+<span class="source-line-no">297</span><span id="line-297">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">298</span><span id="line-298">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">299</span><span id="line-299">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">300</span><span id="line-300">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">301</span><span id="line-301">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
+<span class="source-line-no">302</span><span id="line-302">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">303</span><span id="line-303">      rpcServer.start();</span>
+<span class="source-line-no">304</span><span id="line-304">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">305</span><span id="line-305">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
+<span class="source-line-no">306</span><span id="line-306">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
+<span class="source-line-no">307</span><span id="line-307">    } finally {</span>
+<span class="source-line-no">308</span><span id="line-308">      rpcServer.stop();</span>
+<span class="source-line-no">309</span><span id="line-309">    }</span>
+<span class="source-line-no">310</span><span id="line-310">  }</span>
+<span class="source-line-no">311</span><span id="line-311"></span>
+<span class="source-line-no">312</span><span id="line-312">  @TestTemplate</span>
+<span class="source-line-no">313</span><span id="line-313">  public void testRemoteError() throws IOException, ServiceException {</span>
+<span class="source-line-no">314</span><span id="line-314">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">315</span><span id="line-315">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">316</span><span id="line-316">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">317</span><span id="line-317">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">318</span><span id="line-318">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">319</span><span id="line-319">      rpcServer.start();</span>
+<span class="source-line-no">320</span><span id="line-320">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">321</span><span id="line-321">      ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">322</span><span id="line-322">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">323</span><span id="line-323">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">324</span><span id="line-324">      IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">325</span><span id="line-325">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">326</span><span id="line-326">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">327</span><span id="line-327">    } finally {</span>
+<span class="source-line-no">328</span><span id="line-328">      rpcServer.stop();</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330">  }</span>
+<span class="source-line-no">331</span><span id="line-331"></span>
+<span class="source-line-no">332</span><span id="line-332">  @TestTemplate</span>
+<span class="source-line-no">333</span><span id="line-333">  public void testTimeout() throws IOException {</span>
+<span class="source-line-no">334</span><span id="line-334">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">335</span><span id="line-335">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">336</span><span id="line-336">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">337</span><span id="line-337">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">338</span><span id="line-338">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">339</span><span id="line-339">      rpcServer.start();</span>
+<span class="source-line-no">340</span><span id="line-340">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">341</span><span id="line-341">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">342</span><span id="line-342">      int ms = 1000;</span>
+<span class="source-line-no">343</span><span id="line-343">      int timeout = 100;</span>
+<span class="source-line-no">344</span><span id="line-344">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">345</span><span id="line-345">        pcrc.reset();</span>
+<span class="source-line-no">346</span><span id="line-346">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">347</span><span id="line-347">        long startTime = System.nanoTime();</span>
+<span class="source-line-no">348</span><span id="line-348">        ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">349</span><span id="line-349">          () -&gt; stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build()));</span>
+<span class="source-line-no">350</span><span id="line-350">        long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">351</span><span id="line-351">        // expected</span>
+<span class="source-line-no">352</span><span id="line-352">        LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">353</span><span id="line-353">        IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">354</span><span id="line-354">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">355</span><span id="line-355">        // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">356</span><span id="line-356">        assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">357</span><span id="line-357">      }</span>
+<span class="source-line-no">358</span><span id="line-358">    } finally {</span>
+<span class="source-line-no">359</span><span id="line-359">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">360</span><span id="line-360">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">361</span><span id="line-361">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">362</span><span id="line-362">      rpcServer.stop();</span>
+<span class="source-line-no">363</span><span id="line-363">    }</span>
+<span class="source-line-no">364</span><span id="line-364">  }</span>
+<span class="source-line-no">365</span><span id="line-365"></span>
+<span class="source-line-no">366</span><span id="line-366">  @SuppressWarnings("deprecation")</span>
+<span class="source-line-no">367</span><span id="line-367">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
 <span class="source-line-no">368</span><span id="line-368"></span>
-<span class="source-line-no">369</span><span id="line-369">    final class FailingConnection extends SimpleServerRpcConnection {</span>
-<span class="source-line-no">370</span><span id="line-370">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
-<span class="source-line-no">371</span><span id="line-371">        long lastContact) {</span>
-<span class="source-line-no">372</span><span id="line-372">        super(rpcServer, channel, lastContact);</span>
-<span class="source-line-no">373</span><span id="line-373">      }</span>
+<span class="source-line-no">369</span><span id="line-369">    FailingSimpleRpcServer(Server server, String name,</span>
+<span class="source-line-no">370</span><span id="line-370">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
+<span class="source-line-no">371</span><span id="line-371">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">372</span><span id="line-372">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
+<span class="source-line-no">373</span><span id="line-373">    }</span>
 <span class="source-line-no">374</span><span id="line-374"></span>
-<span class="source-line-no">375</span><span id="line-375">      @Override</span>
-<span class="source-line-no">376</span><span id="line-376">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
-<span class="source-line-no">377</span><span id="line-377">        // this will throw exception after the connection header is read, and an RPC is sent</span>
-<span class="source-line-no">378</span><span id="line-378">        // from client</span>
-<span class="source-line-no">379</span><span id="line-379">        throw new DoNotRetryIOException("Failing for test");</span>
-<span class="source-line-no">380</span><span id="line-380">      }</span>
-<span class="source-line-no">381</span><span id="line-381">    }</span>
-<span class="source-line-no">382</span><span id="line-382"></span>
-<span class="source-line-no">383</span><span id="line-383">    @Override</span>
-<span class="source-line-no">384</span><span id="line-384">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
-<span class="source-line-no">385</span><span id="line-385">      return new FailingConnection(this, channel, time);</span>
-<span class="source-line-no">386</span><span id="line-386">    }</span>
-<span class="source-line-no">387</span><span id="line-387">  }</span>
+<span class="source-line-no">375</span><span id="line-375">    final class FailingConnection extends SimpleServerRpcConnection {</span>
+<span class="source-line-no">376</span><span id="line-376">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
+<span class="source-line-no">377</span><span id="line-377">        long lastContact) {</span>
+<span class="source-line-no">378</span><span id="line-378">        super(rpcServer, channel, lastContact);</span>
+<span class="source-line-no">379</span><span id="line-379">      }</span>
+<span class="source-line-no">380</span><span id="line-380"></span>
+<span class="source-line-no">381</span><span id="line-381">      @Override</span>
+<span class="source-line-no">382</span><span id="line-382">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
+<span class="source-line-no">383</span><span id="line-383">        // this will throw exception after the connection header is read, and an RPC is sent</span>
+<span class="source-line-no">384</span><span id="line-384">        // from client</span>
+<span class="source-line-no">385</span><span id="line-385">        throw new DoNotRetryIOException("Failing for test");</span>
+<span class="source-line-no">386</span><span id="line-386">      }</span>
+<span class="source-line-no">387</span><span id="line-387">    }</span>
 <span class="source-line-no">388</span><span id="line-388"></span>
-<span class="source-line-no">389</span><span id="line-389">  protected RpcServer createTestFailingRpcServer(final String name,</span>
-<span class="source-line-no">390</span><span id="line-390">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
-<span class="source-line-no">391</span><span id="line-391">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">392</span><span id="line-392">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
-<span class="source-line-no">393</span><span id="line-393">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">394</span><span id="line-394">    } else {</span>
-<span class="source-line-no">395</span><span id="line-395">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">396</span><span id="line-396">    }</span>
-<span class="source-line-no">397</span><span id="line-397">  }</span>
-<span class="source-line-no">398</span><span id="line-398"></span>
-<span class="source-line-no">399</span><span id="line-399">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
-<span class="source-line-no">400</span><span id="line-400">  @Test</span>
-<span class="source-line-no">401</span><span id="line-401">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
-<span class="source-line-no">402</span><span id="line-402">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">403</span><span id="line-403">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
-<span class="source-line-no">404</span><span id="line-404">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">405</span><span id="line-405">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">406</span><span id="line-406"></span>
-<span class="source-line-no">407</span><span id="line-407">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">408</span><span id="line-408">      rpcServer.start();</span>
-<span class="source-line-no">409</span><span id="line-409">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">410</span><span id="line-410">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">411</span><span id="line-411">      stub.echo(null, param);</span>
-<span class="source-line-no">412</span><span id="line-412">      fail("RPC should have failed because connection closed");</span>
-<span class="source-line-no">413</span><span id="line-413">    } catch (ServiceException e) {</span>
-<span class="source-line-no">414</span><span id="line-414">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">415</span><span id="line-415">    } finally {</span>
-<span class="source-line-no">416</span><span id="line-416">      rpcServer.stop();</span>
-<span class="source-line-no">417</span><span id="line-417">    }</span>
-<span class="source-line-no">418</span><span id="line-418">  }</span>
-<span class="source-line-no">419</span><span id="line-419"></span>
-<span class="source-line-no">420</span><span id="line-420">  @Test</span>
-<span class="source-line-no">421</span><span id="line-421">  public void testAsyncEcho() throws IOException {</span>
-<span class="source-line-no">422</span><span id="line-422">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">423</span><span id="line-423">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">424</span><span id="line-424">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">425</span><span id="line-425">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">426</span><span id="line-426">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">427</span><span id="line-427">      rpcServer.start();</span>
-<span class="source-line-no">428</span><span id="line-428">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">429</span><span id="line-429">      int num = 10;</span>
-<span class="source-line-no">430</span><span id="line-430">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">431</span><span id="line-431">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">432</span><span id="line-432">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">433</span><span id="line-433">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">434</span><span id="line-434">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">435</span><span id="line-435">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
-<span class="source-line-no">436</span><span id="line-436">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">437</span><span id="line-437">        callbackList.add(done);</span>
-<span class="source-line-no">438</span><span id="line-438">      }</span>
-<span class="source-line-no">439</span><span id="line-439">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">440</span><span id="line-440">        EchoResponseProto resp = callbackList.get(i).get();</span>
-<span class="source-line-no">441</span><span id="line-441">        HBaseRpcController pcrc = pcrcList.get(i);</span>
-<span class="source-line-no">442</span><span id="line-442">        assertEquals("hello-" + i, resp.getMessage());</span>
-<span class="source-line-no">443</span><span id="line-443">        assertFalse(pcrc.failed());</span>
-<span class="source-line-no">444</span><span id="line-444">        assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">445</span><span id="line-445">      }</span>
-<span class="source-line-no">446</span><span id="line-446">    } finally {</span>
-<span class="source-line-no">447</span><span id="line-447">      rpcServer.stop();</span>
-<span class="source-line-no">448</span><span id="line-448">    }</span>
-<span class="source-line-no">449</span><span id="line-449">  }</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">  @Test</span>
-<span class="source-line-no">452</span><span id="line-452">  public void testAsyncRemoteError() throws IOException {</span>
-<span class="source-line-no">453</span><span id="line-453">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">454</span><span id="line-454">    AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf);</span>
-<span class="source-line-no">455</span><span id="line-455">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">456</span><span id="line-456">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">457</span><span id="line-457">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">458</span><span id="line-458">    try {</span>
-<span class="source-line-no">459</span><span id="line-459">      rpcServer.start();</span>
-<span class="source-line-no">460</span><span id="line-460">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">461</span><span id="line-461">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">462</span><span id="line-462">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">463</span><span id="line-463">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
-<span class="source-line-no">464</span><span id="line-464">      assertNull(callback.get());</span>
-<span class="source-line-no">465</span><span id="line-465">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">466</span><span id="line-466">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">467</span><span id="line-467">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">468</span><span id="line-468">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">469</span><span id="line-469">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">470</span><span id="line-470">    } finally {</span>
-<span class="source-line-no">471</span><span id="line-471">      client.close();</span>
-<span class="source-line-no">472</span><span id="line-472">      rpcServer.stop();</span>
-<span class="source-line-no">473</span><span id="line-473">    }</span>
-<span class="source-line-no">474</span><span id="line-474">  }</span>
-<span class="source-line-no">475</span><span id="line-475"></span>
-<span class="source-line-no">476</span><span id="line-476">  @Test</span>
-<span class="source-line-no">477</span><span id="line-477">  public void testAsyncTimeout() throws IOException {</span>
-<span class="source-line-no">478</span><span id="line-478">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">479</span><span id="line-479">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">480</span><span id="line-480">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">481</span><span id="line-481">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">482</span><span id="line-482">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">483</span><span id="line-483">      rpcServer.start();</span>
-<span class="source-line-no">484</span><span id="line-484">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">485</span><span id="line-485">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">486</span><span id="line-486">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">487</span><span id="line-487">      int ms = 1000;</span>
-<span class="source-line-no">488</span><span id="line-488">      int timeout = 100;</span>
-<span class="source-line-no">489</span><span id="line-489">      long startTime = System.nanoTime();</span>
-<span class="source-line-no">490</span><span id="line-490">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">491</span><span id="line-491">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">492</span><span id="line-492">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">493</span><span id="line-493">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">494</span><span id="line-494">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
-<span class="source-line-no">495</span><span id="line-495">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">496</span><span id="line-496">        callbackList.add(callback);</span>
-<span class="source-line-no">497</span><span id="line-497">      }</span>
-<span class="source-line-no">498</span><span id="line-498">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
-<span class="source-line-no">499</span><span id="line-499">        assertNull(callback.get());</span>
-<span class="source-line-no">500</span><span id="line-500">      }</span>
-<span class="source-line-no">501</span><span id="line-501">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">502</span><span id="line-502">      for (HBaseRpcController pcrc : pcrcList) {</span>
-<span class="source-line-no">503</span><span id="line-503">        assertTrue(pcrc.failed());</span>
-<span class="source-line-no">504</span><span id="line-504">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">505</span><span id="line-505">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">506</span><span id="line-506">        assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">507</span><span id="line-507">      }</span>
-<span class="source-line-no">508</span><span id="line-508">      // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">509</span><span id="line-509">      assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">510</span><span id="line-510">    } finally {</span>
-<span class="source-line-no">511</span><span id="line-511">      rpcServer.stop();</span>
-<span class="source-line-no">512</span><span id="line-512">    }</span>
-<span class="source-line-no">513</span><span id="line-513">  }</span>
-<span class="source-line-no">514</span><span id="line-514"></span>
-<span class="source-line-no">515</span><span id="line-515">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
-<span class="source-line-no">516</span><span id="line-516">    Waiter.waitFor(CONF, 1000,</span>
-<span class="source-line-no">517</span><span id="line-517">      new MatcherPredicate&lt;&gt;(() -&gt; traceRule.getSpans(), hasItem(matcher)));</span>
-<span class="source-line-no">518</span><span id="line-518">    return traceRule.getSpans().stream().filter(matcher::matches).findFirst()</span>
-<span class="source-line-no">519</span><span id="line-519">      .orElseThrow(AssertionError::new);</span>
-<span class="source-line-no">520</span><span id="line-520">  }</span>
-<span class="source-line-no">521</span><span id="line-521"></span>
-<span class="source-line-no">522</span><span id="line-522">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">523</span><span id="line-523">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">389</span><span id="line-389">    @Override</span>
+<span class="source-line-no">390</span><span id="line-390">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
+<span class="source-line-no">391</span><span id="line-391">      return new FailingConnection(this, channel, time);</span>
+<span class="source-line-no">392</span><span id="line-392">    }</span>
+<span class="source-line-no">393</span><span id="line-393">  }</span>
+<span class="source-line-no">394</span><span id="line-394"></span>
+<span class="source-line-no">395</span><span id="line-395">  protected RpcServer createTestFailingRpcServer(final String name,</span>
+<span class="source-line-no">396</span><span id="line-396">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
+<span class="source-line-no">397</span><span id="line-397">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">398</span><span id="line-398">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
+<span class="source-line-no">399</span><span id="line-399">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">400</span><span id="line-400">    } else {</span>
+<span class="source-line-no">401</span><span id="line-401">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">402</span><span id="line-402">    }</span>
+<span class="source-line-no">403</span><span id="line-403">  }</span>
+<span class="source-line-no">404</span><span id="line-404"></span>
+<span class="source-line-no">405</span><span id="line-405">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
+<span class="source-line-no">406</span><span id="line-406">  @TestTemplate</span>
+<span class="source-line-no">407</span><span id="line-407">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
+<span class="source-line-no">408</span><span id="line-408">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">409</span><span id="line-409">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
+<span class="source-line-no">410</span><span id="line-410">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">411</span><span id="line-411">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">412</span><span id="line-412">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">413</span><span id="line-413">      rpcServer.start();</span>
+<span class="source-line-no">414</span><span id="line-414">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">415</span><span id="line-415">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">416</span><span id="line-416">      ServiceException se = assertThrows(ServiceException.class, () -&gt; stub.echo(null, param),</span>
+<span class="source-line-no">417</span><span id="line-417">        "RPC should have failed because connection closed");</span>
+<span class="source-line-no">418</span><span id="line-418">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">419</span><span id="line-419">    } finally {</span>
+<span class="source-line-no">420</span><span id="line-420">      rpcServer.stop();</span>
+<span class="source-line-no">421</span><span id="line-421">    }</span>
+<span class="source-line-no">422</span><span id="line-422">  }</span>
+<span class="source-line-no">423</span><span id="line-423"></span>
+<span class="source-line-no">424</span><span id="line-424">  @TestTemplate</span>
+<span class="source-line-no">425</span><span id="line-425">  public void testAsyncEcho() throws IOException {</span>
+<span class="source-line-no">426</span><span id="line-426">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">427</span><span id="line-427">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">428</span><span id="line-428">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">429</span><span id="line-429">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">430</span><span id="line-430">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">431</span><span id="line-431">      rpcServer.start();</span>
+<span class="source-line-no">432</span><span id="line-432">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">433</span><span id="line-433">      int num = 10;</span>
+<span class="source-line-no">434</span><span id="line-434">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">435</span><span id="line-435">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">436</span><span id="line-436">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">437</span><span id="line-437">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">438</span><span id="line-438">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">439</span><span id="line-439">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
+<span class="source-line-no">440</span><span id="line-440">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">441</span><span id="line-441">        callbackList.add(done);</span>
+<span class="source-line-no">442</span><span id="line-442">      }</span>
+<span class="source-line-no">443</span><span id="line-443">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">444</span><span id="line-444">        EchoResponseProto resp = callbackList.get(i).get();</span>
+<span class="source-line-no">445</span><span id="line-445">        HBaseRpcController pcrc = pcrcList.get(i);</span>
+<span class="source-line-no">446</span><span id="line-446">        assertEquals("hello-" + i, resp.getMessage());</span>
+<span class="source-line-no">447</span><span id="line-447">        assertFalse(pcrc.failed());</span>
+<span class="source-line-no">448</span><span id="line-448">        assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">449</span><span id="line-449">      }</span>
+<span class="source-line-no">450</span><span id="line-450">    } finally {</span>
+<span class="source-line-no">451</span><span id="line-451">      rpcServer.stop();</span>
+<span class="source-line-no">452</span><span id="line-452">    }</span>
+<span class="source-line-no">453</span><span id="line-453">  }</span>
+<span class="source-line-no">454</span><span id="line-454"></span>
+<span class="source-line-no">455</span><span id="line-455">  @TestTemplate</span>
+<span class="source-line-no">456</span><span id="line-456">  public void testAsyncRemoteError() throws IOException {</span>
+<span class="source-line-no">457</span><span id="line-457">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">458</span><span id="line-458">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">459</span><span id="line-459">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">460</span><span id="line-460">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">461</span><span id="line-461">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">462</span><span id="line-462">      rpcServer.start();</span>
+<span class="source-line-no">463</span><span id="line-463">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">464</span><span id="line-464">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">465</span><span id="line-465">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">466</span><span id="line-466">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
+<span class="source-line-no">467</span><span id="line-467">      assertNull(callback.get());</span>
+<span class="source-line-no">468</span><span id="line-468">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">469</span><span id="line-469">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">470</span><span id="line-470">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">471</span><span id="line-471">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">472</span><span id="line-472">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">473</span><span id="line-473">    } finally {</span>
+<span class="source-line-no">474</span><span id="line-474">      rpcServer.stop();</span>
+<span class="source-line-no">475</span><span id="line-475">    }</span>
+<span class="source-line-no">476</span><span id="line-476">  }</span>
+<span class="source-line-no">477</span><span id="line-477"></span>
+<span class="source-line-no">478</span><span id="line-478">  @TestTemplate</span>
+<span class="source-line-no">479</span><span id="line-479">  public void testAsyncTimeout() throws IOException {</span>
+<span class="source-line-no">480</span><span id="line-480">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">481</span><span id="line-481">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">482</span><span id="line-482">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">483</span><span id="line-483">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">484</span><span id="line-484">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">485</span><span id="line-485">      rpcServer.start();</span>
+<span class="source-line-no">486</span><span id="line-486">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">487</span><span id="line-487">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">488</span><span id="line-488">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">489</span><span id="line-489">      int ms = 1000;</span>
+<span class="source-line-no">490</span><span id="line-490">      int timeout = 100;</span>
+<span class="source-line-no">491</span><span id="line-491">      long startTime = System.nanoTime();</span>
+<span class="source-line-no">492</span><span id="line-492">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">493</span><span id="line-493">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">494</span><span id="line-494">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">495</span><span id="line-495">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">496</span><span id="line-496">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
+<span class="source-line-no">497</span><span id="line-497">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">498</span><span id="line-498">        callbackList.add(callback);</span>
+<span class="source-line-no">499</span><span id="line-499">      }</span>
+<span class="source-line-no">500</span><span id="line-500">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
+<span class="source-line-no">501</span><span id="line-501">        assertNull(callback.get());</span>
+<span class="source-line-no">502</span><span id="line-502">      }</span>
+<span class="source-line-no">503</span><span id="line-503">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">504</span><span id="line-504">      for (HBaseRpcController pcrc : pcrcList) {</span>
+<span class="source-line-no">505</span><span id="line-505">        assertTrue(pcrc.failed());</span>
+<span class="source-line-no">506</span><span id="line-506">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">507</span><span id="line-507">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">508</span><span id="line-508">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">509</span><span id="line-509">      }</span>
+<span class="source-line-no">510</span><span id="line-510">      // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">511</span><span id="line-511">      assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">512</span><span id="line-512">    } finally {</span>
+<span class="source-line-no">513</span><span id="line-513">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">514</span><span id="line-514">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">515</span><span id="line-515">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">516</span><span id="line-516">      rpcServer.stop();</span>
+<span class="source-line-no">517</span><span id="line-517">    }</span>
+<span class="source-line-no">518</span><span id="line-518">  }</span>
+<span class="source-line-no">519</span><span id="line-519"></span>
+<span class="source-line-no">520</span><span id="line-520">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
+<span class="source-line-no">521</span><span id="line-521">    Waiter.waitFor(CONF, 1000, new MatcherPredicate&lt;&gt;(() -&gt; OTEL_EXT.getSpans(), hasItem(matcher)));</span>
+<span class="source-line-no">522</span><span id="line-522">    return OTEL_EXT.getSpans().stream().filter(matcher::matches).findFirst()</span>
+<span class="source-line-no">523</span><span id="line-523">      .orElseThrow(AssertionError::new);</span>
 <span class="source-line-no">524</span><span id="line-524">  }</span>
 <span class="source-line-no">525</span><span id="line-525"></span>
-<span class="source-line-no">526</span><span id="line-526">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">527</span><span id="line-527">    final String methodName) {</span>
-<span class="source-line-no">528</span><span id="line-528">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">529</span><span id="line-529">      hasKind(SpanKind.CLIENT));</span>
-<span class="source-line-no">530</span><span id="line-530">  }</span>
-<span class="source-line-no">531</span><span id="line-531"></span>
-<span class="source-line-no">532</span><span id="line-532">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">533</span><span id="line-533">    final String methodName) {</span>
-<span class="source-line-no">534</span><span id="line-534">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">535</span><span id="line-535">      hasKind(SpanKind.SERVER));</span>
-<span class="source-line-no">536</span><span id="line-536">  }</span>
-<span class="source-line-no">537</span><span id="line-537"></span>
-<span class="source-line-no">538</span><span id="line-538">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
-<span class="source-line-no">539</span><span id="line-539">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
-<span class="source-line-no">540</span><span id="line-540">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">541</span><span id="line-541">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
-<span class="source-line-no">542</span><span id="line-542">      containsEntry("net.peer.name", isa.getHostName()),</span>
-<span class="source-line-no">543</span><span id="line-543">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
-<span class="source-line-no">544</span><span id="line-544">  }</span>
-<span class="source-line-no">545</span><span id="line-545"></span>
-<span class="source-line-no">546</span><span id="line-546">  private static Matcher&lt;SpanData&gt;</span>
-<span class="source-line-no">547</span><span id="line-547">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">548</span><span id="line-548">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">549</span><span id="line-549">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
-<span class="source-line-no">550</span><span id="line-550">  }</span>
-<span class="source-line-no">551</span><span id="line-551"></span>
-<span class="source-line-no">552</span><span id="line-552">  private void assertRemoteSpan() {</span>
-<span class="source-line-no">553</span><span id="line-553">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
-<span class="source-line-no">554</span><span id="line-554">    assertTrue(data.getParentSpanContext().isRemote());</span>
-<span class="source-line-no">555</span><span id="line-555">    assertEquals(SpanKind.SERVER, data.getKind());</span>
-<span class="source-line-no">556</span><span id="line-556">  }</span>
-<span class="source-line-no">557</span><span id="line-557"></span>
-<span class="source-line-no">558</span><span id="line-558">  @Test</span>
-<span class="source-line-no">559</span><span id="line-559">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
-<span class="source-line-no">560</span><span id="line-560">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">561</span><span id="line-561">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">562</span><span id="line-562">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">563</span><span id="line-563">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">564</span><span id="line-564">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">565</span><span id="line-565">      rpcServer.start();</span>
-<span class="source-line-no">566</span><span id="line-566">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">567</span><span id="line-567">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
-<span class="source-line-no">568</span><span id="line-568">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">569</span><span id="line-569">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">570</span><span id="line-570">      final SpanData pauseClientSpan =</span>
-<span class="source-line-no">571</span><span id="line-571">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">572</span><span id="line-572">      assertThat(pauseClientSpan,</span>
-<span class="source-line-no">573</span><span id="line-573">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
-<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseServerSpan =</span>
-<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseServerSpan,</span>
-<span class="source-line-no">577</span><span id="line-577">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">578</span><span id="line-578">      assertRemoteSpan();</span>
-<span class="source-line-no">579</span><span id="line-579">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">580</span><span id="line-580">      assertThat(traceRule.getSpans(),</span>
-<span class="source-line-no">581</span><span id="line-581">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
-<span class="source-line-no">582</span><span id="line-582">          hasTraceId(traceRule.getSpans().iterator().next().getTraceId()),</span>
-<span class="source-line-no">583</span><span id="line-583">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
-<span class="source-line-no">584</span><span id="line-584">    } finally {</span>
-<span class="source-line-no">585</span><span id="line-585">      rpcServer.stop();</span>
-<span class="source-line-no">586</span><span id="line-586">    }</span>
-<span class="source-line-no">587</span><span id="line-587">  }</span>
-<span class="source-line-no">588</span><span id="line-588"></span>
-<span class="source-line-no">589</span><span id="line-589">  @Test</span>
-<span class="source-line-no">590</span><span id="line-590">  public void testTracingErrorIpc() throws IOException {</span>
-<span class="source-line-no">591</span><span id="line-591">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">592</span><span id="line-592">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">593</span><span id="line-593">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">594</span><span id="line-594">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">595</span><span id="line-595">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">596</span><span id="line-596">      rpcServer.start();</span>
-<span class="source-line-no">597</span><span id="line-597">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">598</span><span id="line-598">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">599</span><span id="line-599">      assertThrows(ServiceException.class,</span>
-<span class="source-line-no">600</span><span id="line-600">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
-<span class="source-line-no">601</span><span id="line-601">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">602</span><span id="line-602">      final SpanData errorClientSpan =</span>
-<span class="source-line-no">603</span><span id="line-603">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">604</span><span id="line-604">      assertThat(errorClientSpan,</span>
-<span class="source-line-no">605</span><span id="line-605">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
-<span class="source-line-no">606</span><span id="line-606">      final SpanData errorServerSpan =</span>
-<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">608</span><span id="line-608">      assertThat(errorServerSpan,</span>
-<span class="source-line-no">609</span><span id="line-609">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">610</span><span id="line-610">      assertRemoteSpan();</span>
-<span class="source-line-no">611</span><span id="line-611">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">612</span><span id="line-612">      assertThat(traceRule.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
-<span class="source-line-no">613</span><span id="line-613">        hasTraceId(traceRule.getSpans().iterator().next().getTraceId()))));</span>
-<span class="source-line-no">614</span><span id="line-614">    } finally {</span>
-<span class="source-line-no">615</span><span id="line-615">      rpcServer.stop();</span>
-<span class="source-line-no">616</span><span id="line-616">    }</span>
-<span class="source-line-no">617</span><span id="line-617">  }</span>
-<span class="source-line-no">618</span><span id="line-618"></span>
-<span class="source-line-no">619</span><span id="line-619">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
-<span class="source-line-no">620</span><span id="line-620"></span>
-<span class="source-line-no">621</span><span id="line-621">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
-<span class="source-line-no">622</span><span id="line-622">    ServiceException se = assertThrows(ServiceException.class,</span>
-<span class="source-line-no">623</span><span id="line-623">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
-<span class="source-line-no">624</span><span id="line-624">    return ProtobufUtil.handleRemoteException(se);</span>
-<span class="source-line-no">625</span><span id="line-625">  }</span>
-<span class="source-line-no">626</span><span id="line-626"></span>
-<span class="source-line-no">627</span><span id="line-627">  @Test</span>
-<span class="source-line-no">628</span><span id="line-628">  public void testBadPreambleHeader() throws Exception {</span>
-<span class="source-line-no">629</span><span id="line-629">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">630</span><span id="line-630">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">631</span><span id="line-631">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">632</span><span id="line-632">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
-<span class="source-line-no">633</span><span id="line-633">      rpcServer.start();</span>
-<span class="source-line-no">634</span><span id="line-634">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">635</span><span id="line-635">      BadAuthException error = null;</span>
-<span class="source-line-no">636</span><span id="line-636">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
-<span class="source-line-no">637</span><span id="line-637">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
-<span class="source-line-no">638</span><span id="line-638">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">639</span><span id="line-639">        IOException ioe = doBadPreableHeaderCall(stub);</span>
-<span class="source-line-no">640</span><span id="line-640">        if (ioe instanceof BadAuthException) {</span>
-<span class="source-line-no">641</span><span id="line-641">          error = (BadAuthException) ioe;</span>
-<span class="source-line-no">642</span><span id="line-642">          break;</span>
-<span class="source-line-no">643</span><span id="line-643">        }</span>
-<span class="source-line-no">644</span><span id="line-644">        Thread.sleep(100);</span>
-<span class="source-line-no">645</span><span id="line-645">      }</span>
-<span class="source-line-no">646</span><span id="line-646">      assertNotNull("Can not get expected BadAuthException", error);</span>
-<span class="source-line-no">647</span><span id="line-647">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
-<span class="source-line-no">648</span><span id="line-648">    } finally {</span>
-<span class="source-line-no">649</span><span id="line-649">      rpcServer.stop();</span>
-<span class="source-line-no">650</span><span id="line-650">    }</span>
-<span class="source-line-no">651</span><span id="line-651">  }</span>
-<span class="source-line-no">652</span><span id="line-652"></span>
-<span class="source-line-no">653</span><span id="line-653">  /**</span>
-<span class="source-line-no">654</span><span id="line-654">   * Testcase for getting connection registry information through connection preamble header, see</span>
-<span class="source-line-no">655</span><span id="line-655">   * HBASE-25051 for more details.</span>
-<span class="source-line-no">656</span><span id="line-656">   */</span>
-<span class="source-line-no">657</span><span id="line-657">  @Test</span>
-<span class="source-line-no">658</span><span id="line-658">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
-<span class="source-line-no">659</span><span id="line-659">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">660</span><span id="line-660">    String clusterId = "test_cluster_id";</span>
-<span class="source-line-no">661</span><span id="line-661">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
-<span class="source-line-no">662</span><span id="line-662">    when(server.getClusterId()).thenReturn(clusterId);</span>
-<span class="source-line-no">663</span><span id="line-663">    // do not need any services</span>
-<span class="source-line-no">664</span><span id="line-664">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">665</span><span id="line-665">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">666</span><span id="line-666">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">667</span><span id="line-667">      rpcServer.start();</span>
-<span class="source-line-no">668</span><span id="line-668">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">669</span><span id="line-669">      BlockingRpcChannel channel =</span>
-<span class="source-line-no">670</span><span id="line-670">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
-<span class="source-line-no">671</span><span id="line-671">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">672</span><span id="line-672">      ConnectionRegistryService.BlockingInterface stub =</span>
-<span class="source-line-no">673</span><span id="line-673">        ConnectionRegistryService.newBlockingStub(channel);</span>
-<span class="source-line-no">674</span><span id="line-674">      GetConnectionRegistryResponse resp =</span>
-<span class="source-line-no">675</span><span id="line-675">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
-<span class="source-line-no">676</span><span id="line-676">      assertEquals(clusterId, resp.getClusterId());</span>
-<span class="source-line-no">677</span><span id="line-677">    } finally {</span>
-<span class="source-line-no">678</span><span id="line-678">      rpcServer.stop();</span>
-<span class="source-line-no">679</span><span id="line-679">    }</span>
-<span class="source-line-no">680</span><span id="line-680">  }</span>
-<span class="source-line-no">681</span><span id="line-681"></span>
-<span class="source-line-no">682</span><span id="line-682">  /**</span>
-<span class="source-line-no">683</span><span id="line-683">   * Test server does not support getting connection registry information through connection</span>
-<span class="source-line-no">684</span><span id="line-684">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
-<span class="source-line-no">685</span><span id="line-685">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
-<span class="source-line-no">686</span><span id="line-686">   */</span>
-<span class="source-line-no">687</span><span id="line-687">  @Test</span>
-<span class="source-line-no">688</span><span id="line-688">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
-<span class="source-line-no">689</span><span id="line-689">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">690</span><span id="line-690">    // do not need any services</span>
-<span class="source-line-no">691</span><span id="line-691">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">692</span><span id="line-692">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">693</span><span id="line-693">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">694</span><span id="line-694">      rpcServer.start();</span>
-<span class="source-line-no">695</span><span id="line-695">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">696</span><span id="line-696">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
-<span class="source-line-no">697</span><span id="line-697">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">698</span><span id="line-698">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
-<span class="source-line-no">699</span><span id="line-699">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">700</span><span id="line-700">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">701</span><span id="line-701">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
-<span class="source-line-no">702</span><span id="line-702">      // should have failed so no response</span>
-<span class="source-line-no">703</span><span id="line-703">      assertNull(done.get());</span>
-<span class="source-line-no">704</span><span id="line-704">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">705</span><span id="line-705">      // should be a FatalConnectionException</span>
-<span class="source-line-no">706</span><span id="line-706">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
-<span class="source-line-no">707</span><span id="line-707">      assertEquals(FatalConnectionException.class.getName(),</span>
-<span class="source-line-no">708</span><span id="line-708">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
-<span class="source-line-no">709</span><span id="line-709">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
-<span class="source-line-no">710</span><span id="line-710">    } finally {</span>
-<span class="source-line-no">711</span><span id="line-711">      rpcServer.stop();</span>
-<span class="source-line-no">712</span><span id="line-712">    }</span>
-<span class="source-line-no">713</span><span id="line-713">  }</span>
-<span class="source-line-no">714</span><span id="line-714">}</span>
+<span class="source-line-no">526</span><span id="line-526">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">527</span><span id="line-527">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">528</span><span id="line-528">  }</span>
+<span class="source-line-no">529</span><span id="line-529"></span>
+<span class="source-line-no">530</span><span id="line-530">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">531</span><span id="line-531">    final String methodName) {</span>
+<span class="source-line-no">532</span><span id="line-532">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">533</span><span id="line-533">      hasKind(SpanKind.CLIENT));</span>
+<span class="source-line-no">534</span><span id="line-534">  }</span>
+<span class="source-line-no">535</span><span id="line-535"></span>
+<span class="source-line-no">536</span><span id="line-536">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">537</span><span id="line-537">    final String methodName) {</span>
+<span class="source-line-no">538</span><span id="line-538">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">539</span><span id="line-539">      hasKind(SpanKind.SERVER));</span>
+<span class="source-line-no">540</span><span id="line-540">  }</span>
+<span class="source-line-no">541</span><span id="line-541"></span>
+<span class="source-line-no">542</span><span id="line-542">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
+<span class="source-line-no">543</span><span id="line-543">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
+<span class="source-line-no">544</span><span id="line-544">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">545</span><span id="line-545">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
+<span class="source-line-no">546</span><span id="line-546">      containsEntry("net.peer.name", isa.getHostName()),</span>
+<span class="source-line-no">547</span><span id="line-547">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
+<span class="source-line-no">548</span><span id="line-548">  }</span>
+<span class="source-line-no">549</span><span id="line-549"></span>
+<span class="source-line-no">550</span><span id="line-550">  private static Matcher&lt;SpanData&gt;</span>
+<span class="source-line-no">551</span><span id="line-551">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">552</span><span id="line-552">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">553</span><span id="line-553">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
+<span class="source-line-no">554</span><span id="line-554">  }</span>
+<span class="source-line-no">555</span><span id="line-555"></span>
+<span class="source-line-no">556</span><span id="line-556">  private void assertRemoteSpan() {</span>
+<span class="source-line-no">557</span><span id="line-557">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
+<span class="source-line-no">558</span><span id="line-558">    assertTrue(data.getParentSpanContext().isRemote());</span>
+<span class="source-line-no">559</span><span id="line-559">    assertEquals(SpanKind.SERVER, data.getKind());</span>
+<span class="source-line-no">560</span><span id="line-560">  }</span>
+<span class="source-line-no">561</span><span id="line-561"></span>
+<span class="source-line-no">562</span><span id="line-562">  @TestTemplate</span>
+<span class="source-line-no">563</span><span id="line-563">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
+<span class="source-line-no">564</span><span id="line-564">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">565</span><span id="line-565">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">566</span><span id="line-566">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">567</span><span id="line-567">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">568</span><span id="line-568">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">569</span><span id="line-569">      rpcServer.start();</span>
+<span class="source-line-no">570</span><span id="line-570">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">571</span><span id="line-571">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
+<span class="source-line-no">572</span><span id="line-572">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">573</span><span id="line-573">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseClientSpan =</span>
+<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseClientSpan,</span>
+<span class="source-line-no">577</span><span id="line-577">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
+<span class="source-line-no">578</span><span id="line-578">      final SpanData pauseServerSpan =</span>
+<span class="source-line-no">579</span><span id="line-579">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">580</span><span id="line-580">      assertThat(pauseServerSpan,</span>
+<span class="source-line-no">581</span><span id="line-581">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">582</span><span id="line-582">      assertRemoteSpan();</span>
+<span class="source-line-no">583</span><span id="line-583">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">584</span><span id="line-584">      assertThat(OTEL_EXT.getSpans(),</span>
+<span class="source-line-no">585</span><span id="line-585">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
+<span class="source-line-no">586</span><span id="line-586">          hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()),</span>
+<span class="source-line-no">587</span><span id="line-587">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
+<span class="source-line-no">588</span><span id="line-588">    } finally {</span>
+<span class="source-line-no">589</span><span id="line-589">      rpcServer.stop();</span>
+<span class="source-line-no">590</span><span id="line-590">    }</span>
+<span class="source-line-no">591</span><span id="line-591">  }</span>
+<span class="source-line-no">592</span><span id="line-592"></span>
+<span class="source-line-no">593</span><span id="line-593">  @TestTemplate</span>
+<span class="source-line-no">594</span><span id="line-594">  public void testTracingErrorIpc() throws IOException {</span>
+<span class="source-line-no">595</span><span id="line-595">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">596</span><span id="line-596">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">597</span><span id="line-597">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">598</span><span id="line-598">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">599</span><span id="line-599">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">600</span><span id="line-600">      rpcServer.start();</span>
+<span class="source-line-no">601</span><span id="line-601">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">602</span><span id="line-602">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">603</span><span id="line-603">      assertThrows(ServiceException.class,</span>
+<span class="source-line-no">604</span><span id="line-604">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">605</span><span id="line-605">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">606</span><span id="line-606">      final SpanData errorClientSpan =</span>
+<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">608</span><span id="line-608">      assertThat(errorClientSpan,</span>
+<span class="source-line-no">609</span><span id="line-609">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
+<span class="source-line-no">610</span><span id="line-610">      final SpanData errorServerSpan =</span>
+<span class="source-line-no">611</span><span id="line-611">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">612</span><span id="line-612">      assertThat(errorServerSpan,</span>
+<span class="source-line-no">613</span><span id="line-613">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">614</span><span id="line-614">      assertRemoteSpan();</span>
+<span class="source-line-no">615</span><span id="line-615">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">616</span><span id="line-616">      assertThat(OTEL_EXT.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
+<span class="source-line-no">617</span><span id="line-617">        hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()))));</span>
+<span class="source-line-no">618</span><span id="line-618">    } finally {</span>
+<span class="source-line-no">619</span><span id="line-619">      rpcServer.stop();</span>
+<span class="source-line-no">620</span><span id="line-620">    }</span>
+<span class="source-line-no">621</span><span id="line-621">  }</span>
+<span class="source-line-no">622</span><span id="line-622"></span>
+<span class="source-line-no">623</span><span id="line-623">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
+<span class="source-line-no">624</span><span id="line-624"></span>
+<span class="source-line-no">625</span><span id="line-625">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
+<span class="source-line-no">626</span><span id="line-626">    ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">627</span><span id="line-627">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
+<span class="source-line-no">628</span><span id="line-628">    return ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">629</span><span id="line-629">  }</span>
+<span class="source-line-no">630</span><span id="line-630"></span>
+<span class="source-line-no">631</span><span id="line-631">  @TestTemplate</span>
+<span class="source-line-no">632</span><span id="line-632">  public void testBadPreambleHeader() throws Exception {</span>
+<span class="source-line-no">633</span><span id="line-633">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">634</span><span id="line-634">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">635</span><span id="line-635">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">636</span><span id="line-636">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
+<span class="source-line-no">637</span><span id="line-637">      rpcServer.start();</span>
+<span class="source-line-no">638</span><span id="line-638">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">639</span><span id="line-639">      BadAuthException error = null;</span>
+<span class="source-line-no">640</span><span id="line-640">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
+<span class="source-line-no">641</span><span id="line-641">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
+<span class="source-line-no">642</span><span id="line-642">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">643</span><span id="line-643">        IOException ioe = doBadPreableHeaderCall(stub);</span>
+<span class="source-line-no">644</span><span id="line-644">        if (ioe instanceof BadAuthException) {</span>
+<span class="source-line-no">645</span><span id="line-645">          error = (BadAuthException) ioe;</span>
+<span class="source-line-no">646</span><span id="line-646">          break;</span>
+<span class="source-line-no">647</span><span id="line-647">        }</span>
+<span class="source-line-no">648</span><span id="line-648">        Thread.sleep(100);</span>
+<span class="source-line-no">649</span><span id="line-649">      }</span>
+<span class="source-line-no">650</span><span id="line-650">      assertNotNull(error, "Can not get expected BadAuthException");</span>
+<span class="source-line-no">651</span><span id="line-651">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
+<span class="source-line-no">652</span><span id="line-652">    } finally {</span>
+<span class="source-line-no">653</span><span id="line-653">      rpcServer.stop();</span>
+<span class="source-line-no">654</span><span id="line-654">    }</span>
+<span class="source-line-no">655</span><span id="line-655">  }</span>
+<span class="source-line-no">656</span><span id="line-656"></span>
+<span class="source-line-no">657</span><span id="line-657">  /**</span>
+<span class="source-line-no">658</span><span id="line-658">   * Testcase for getting connection registry information through connection preamble header, see</span>
+<span class="source-line-no">659</span><span id="line-659">   * HBASE-25051 for more details.</span>
+<span class="source-line-no">660</span><span id="line-660">   */</span>
+<span class="source-line-no">661</span><span id="line-661">  @TestTemplate</span>
+<span class="source-line-no">662</span><span id="line-662">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
+<span class="source-line-no">663</span><span id="line-663">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">664</span><span id="line-664">    String clusterId = "test_cluster_id";</span>
+<span class="source-line-no">665</span><span id="line-665">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
+<span class="source-line-no">666</span><span id="line-666">    when(server.getClusterId()).thenReturn(clusterId);</span>
+<span class="source-line-no">667</span><span id="line-667">    // do not need any services</span>
+<span class="source-line-no">668</span><span id="line-668">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">669</span><span id="line-669">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">670</span><span id="line-670">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">671</span><span id="line-671">      rpcServer.start();</span>
+<span class="source-line-no">672</span><span id="line-672">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">673</span><span id="line-673">      BlockingRpcChannel channel =</span>
+<span class="source-line-no">674</span><span id="line-674">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
+<span class="source-line-no">675</span><span id="line-675">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">676</span><span id="line-676">      ConnectionRegistryService.BlockingInterface stub =</span>
+<span class="source-line-no">677</span><span id="line-677">        ConnectionRegistryService.newBlockingStub(channel);</span>
+<span class="source-line-no">678</span><span id="line-678">      GetConnectionRegistryResponse resp =</span>
+<span class="source-line-no">679</span><span id="line-679">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
+<span class="source-line-no">680</span><span id="line-680">      assertEquals(clusterId, resp.getClusterId());</span>
+<span class="source-line-no">681</span><span id="line-681">    } finally {</span>
+<span class="source-line-no">682</span><span id="line-682">      rpcServer.stop();</span>
+<span class="source-line-no">683</span><span id="line-683">    }</span>
+<span class="source-line-no">684</span><span id="line-684">  }</span>
+<span class="source-line-no">685</span><span id="line-685"></span>
+<span class="source-line-no">686</span><span id="line-686">  /**</span>
+<span class="source-line-no">687</span><span id="line-687">   * Test server does not support getting connection registry information through connection</span>
+<span class="source-line-no">688</span><span id="line-688">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
+<span class="source-line-no">689</span><span id="line-689">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
+<span class="source-line-no">690</span><span id="line-690">   */</span>
+<span class="source-line-no">691</span><span id="line-691">  @TestTemplate</span>
+<span class="source-line-no">692</span><span id="line-692">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
+<span class="source-line-no">693</span><span id="line-693">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">694</span><span id="line-694">    // do not need any services</span>
+<span class="source-line-no">695</span><span id="line-695">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">696</span><span id="line-696">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">697</span><span id="line-697">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">698</span><span id="line-698">      rpcServer.start();</span>
+<span class="source-line-no">699</span><span id="line-699">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">700</span><span id="line-700">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
+<span class="source-line-no">701</span><span id="line-701">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">702</span><span id="line-702">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
+<span class="source-line-no">703</span><span id="line-703">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">704</span><span id="line-704">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">705</span><span id="line-705">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
+<span class="source-line-no">706</span><span id="line-706">      // should have failed so no response</span>
+<span class="source-line-no">707</span><span id="line-707">      assertNull(done.get());</span>
+<span class="source-line-no">708</span><span id="line-708">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">709</span><span id="line-709">      // should be a FatalConnectionException</span>
+<span class="source-line-no">710</span><span id="line-710">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
+<span class="source-line-no">711</span><span id="line-711">      assertEquals(FatalConnectionException.class.getName(),</span>
+<span class="source-line-no">712</span><span id="line-712">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
+<span class="source-line-no">713</span><span id="line-713">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
+<span class="source-line-no">714</span><span id="line-714">    } finally {</span>
+<span class="source-line-no">715</span><span id="line-715">      rpcServer.stop();</span>
+<span class="source-line-no">716</span><span id="line-716">    }</span>
+<span class="source-line-no">717</span><span id="line-717">  }</span>
+<span class="source-line-no">718</span><span id="line-718">}</span>
 
 
 
diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
index a277e239b1c..2bcc4dfa63f 100644
--- a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
+++ b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
@@ -31,79 +31,74 @@
 <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.ipc;</span>
 <span class="source-line-no">019</span><span id="line-19"></span>
 <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
-<span class="source-line-no">021</span><span id="line-21">import java.util.Arrays;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.hbase.HBaseClassTestRule;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.codec.Codec;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.junit.ClassRule;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.junit.experimental.categories.Category;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.junit.runner.RunWith;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.junit.runners.Parameterized;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.junit.runners.Parameterized.Parameters;</span>
-<span class="source-line-no">033</span><span id="line-33"></span>
-<span class="source-line-no">034</span><span id="line-34">@RunWith(Parameterized.class)</span>
-<span class="source-line-no">035</span><span id="line-35">@Category({ RPCTests.class, MediumTests.class })</span>
-<span class="source-line-no">036</span><span id="line-36">public class TestBlockingIPC extends AbstractTestIPC {</span>
-<span class="source-line-no">037</span><span id="line-37"></span>
-<span class="source-line-no">038</span><span id="line-38">  @ClassRule</span>
-<span class="source-line-no">039</span><span id="line-39">  public static final HBaseClassTestRule CLASS_RULE =</span>
-<span class="source-line-no">040</span><span id="line-40">    HBaseClassTestRule.forClass(TestBlockingIPC.class);</span>
-<span class="source-line-no">041</span><span id="line-41"></span>
-<span class="source-line-no">042</span><span id="line-42">  @Parameters(name = "{index}: rpcServerImpl={0}")</span>
-<span class="source-line-no">043</span><span id="line-43">  public static List&lt;Object[]&gt; data() {</span>
-<span class="source-line-no">044</span><span id="line-44">    return Arrays.asList(new Object[] { SimpleRpcServer.class },</span>
-<span class="source-line-no">045</span><span id="line-45">      new Object[] { NettyRpcServer.class });</span>
-<span class="source-line-no">046</span><span id="line-46">  }</span>
-<span class="source-line-no">047</span><span id="line-47"></span>
-<span class="source-line-no">048</span><span id="line-48">  @Override</span>
-<span class="source-line-no">049</span><span id="line-49">  protected BlockingRpcClient createRpcClientNoCodec(Configuration conf) {</span>
-<span class="source-line-no">050</span><span id="line-50">    return new BlockingRpcClient(conf) {</span>
-<span class="source-line-no">051</span><span id="line-51">      @Override</span>
-<span class="source-line-no">052</span><span id="line-52">      protected Codec getCodec() {</span>
-<span class="source-line-no">053</span><span id="line-53">        return null;</span>
-<span class="source-line-no">054</span><span id="line-54">      }</span>
-<span class="source-line-no">055</span><span id="line-55">    };</span>
+<span class="source-line-no">021</span><span id="line-21">import java.util.stream.Stream;</span>
+<span class="source-line-no">022</span><span id="line-22">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">023</span><span id="line-23">import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;</span>
+<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.hbase.codec.Codec;</span>
+<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
+<span class="source-line-no">027</span><span id="line-27">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">028</span><span id="line-28">import org.junit.jupiter.params.provider.Arguments;</span>
+<span class="source-line-no">029</span><span id="line-29"></span>
+<span class="source-line-no">030</span><span id="line-30">@Tag(RPCTests.TAG)</span>
+<span class="source-line-no">031</span><span id="line-31">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">032</span><span id="line-32">@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}")</span>
+<span class="source-line-no">033</span><span id="line-33">public class TestBlockingIPC extends AbstractTestIPC {</span>
+<span class="source-line-no">034</span><span id="line-34"></span>
+<span class="source-line-no">035</span><span id="line-35">  public TestBlockingIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl) {</span>
+<span class="source-line-no">036</span><span id="line-36">    super(rpcServerImpl);</span>
+<span class="source-line-no">037</span><span id="line-37">  }</span>
+<span class="source-line-no">038</span><span id="line-38"></span>
+<span class="source-line-no">039</span><span id="line-39">  public static Stream&lt;Arguments&gt; parameters() {</span>
+<span class="source-line-no">040</span><span id="line-40">    return Stream.of(Arguments.of(SimpleRpcServer.class), Arguments.of(NettyRpcServer.class));</span>
+<span class="source-line-no">041</span><span id="line-41">  }</span>
+<span class="source-line-no">042</span><span id="line-42"></span>
+<span class="source-line-no">043</span><span id="line-43">  @Override</span>
+<span class="source-line-no">044</span><span id="line-44">  protected BlockingRpcClient createRpcClientNoCodec(Configuration conf) {</span>
+<span class="source-line-no">045</span><span id="line-45">    return new BlockingRpcClient(conf) {</span>
+<span class="source-line-no">046</span><span id="line-46">      @Override</span>
+<span class="source-line-no">047</span><span id="line-47">      protected Codec getCodec() {</span>
+<span class="source-line-no">048</span><span id="line-48">        return null;</span>
+<span class="source-line-no">049</span><span id="line-49">      }</span>
+<span class="source-line-no">050</span><span id="line-50">    };</span>
+<span class="source-line-no">051</span><span id="line-51">  }</span>
+<span class="source-line-no">052</span><span id="line-52"></span>
+<span class="source-line-no">053</span><span id="line-53">  @Override</span>
+<span class="source-line-no">054</span><span id="line-54">  protected BlockingRpcClient createRpcClient(Configuration conf) {</span>
+<span class="source-line-no">055</span><span id="line-55">    return new BlockingRpcClient(conf);</span>
 <span class="source-line-no">056</span><span id="line-56">  }</span>
 <span class="source-line-no">057</span><span id="line-57"></span>
 <span class="source-line-no">058</span><span id="line-58">  @Override</span>
-<span class="source-line-no">059</span><span id="line-59">  protected BlockingRpcClient createRpcClient(Configuration conf) {</span>
-<span class="source-line-no">060</span><span id="line-60">    return new BlockingRpcClient(conf);</span>
-<span class="source-line-no">061</span><span id="line-61">  }</span>
+<span class="source-line-no">059</span><span id="line-59">  protected BlockingRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)</span>
+<span class="source-line-no">060</span><span id="line-60">    throws IOException {</span>
+<span class="source-line-no">061</span><span id="line-61">    return new BlockingRpcClient(conf) {</span>
 <span class="source-line-no">062</span><span id="line-62"></span>
-<span class="source-line-no">063</span><span id="line-63">  @Override</span>
-<span class="source-line-no">064</span><span id="line-64">  protected BlockingRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)</span>
-<span class="source-line-no">065</span><span id="line-65">    throws IOException {</span>
-<span class="source-line-no">066</span><span id="line-66">    return new BlockingRpcClient(conf) {</span>
-<span class="source-line-no">067</span><span id="line-67"></span>
-<span class="source-line-no">068</span><span id="line-68">      @Override</span>
-<span class="source-line-no">069</span><span id="line-69">      protected boolean isTcpNoDelay() {</span>
-<span class="source-line-no">070</span><span id="line-70">        throw new RuntimeException("Injected fault");</span>
-<span class="source-line-no">071</span><span id="line-71">      }</span>
-<span class="source-line-no">072</span><span id="line-72">    };</span>
-<span class="source-line-no">073</span><span id="line-73">  }</span>
-<span class="source-line-no">074</span><span id="line-74"></span>
-<span class="source-line-no">075</span><span id="line-75">  @Override</span>
-<span class="source-line-no">076</span><span id="line-76">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
-<span class="source-line-no">077</span><span id="line-77">    return new BlockingRpcClient(conf) {</span>
-<span class="source-line-no">078</span><span id="line-78"></span>
-<span class="source-line-no">079</span><span id="line-79">      @Override</span>
-<span class="source-line-no">080</span><span id="line-80">      protected BlockingRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
-<span class="source-line-no">081</span><span id="line-81">        return new BlockingRpcConnection(this, remoteId) {</span>
-<span class="source-line-no">082</span><span id="line-82">          @Override</span>
-<span class="source-line-no">083</span><span id="line-83">          protected byte[] getConnectionHeaderPreamble() {</span>
-<span class="source-line-no">084</span><span id="line-84">            byte[] header = super.getConnectionHeaderPreamble();</span>
-<span class="source-line-no">085</span><span id="line-85">            // set an invalid auth code</span>
-<span class="source-line-no">086</span><span id="line-86">            header[header.length - 1] = -10;</span>
-<span class="source-line-no">087</span><span id="line-87">            return header;</span>
-<span class="source-line-no">088</span><span id="line-88">          }</span>
-<span class="source-line-no">089</span><span id="line-89">        };</span>
-<span class="source-line-no">090</span><span id="line-90">      }</span>
-<span class="source-line-no">091</span><span id="line-91">    };</span>
-<span class="source-line-no">092</span><span id="line-92">  }</span>
-<span class="source-line-no">093</span><span id="line-93">}</span>
+<span class="source-line-no">063</span><span id="line-63">      @Override</span>
+<span class="source-line-no">064</span><span id="line-64">      protected boolean isTcpNoDelay() {</span>
+<span class="source-line-no">065</span><span id="line-65">        throw new RuntimeException("Injected fault");</span>
+<span class="source-line-no">066</span><span id="line-66">      }</span>
+<span class="source-line-no">067</span><span id="line-67">    };</span>
+<span class="source-line-no">068</span><span id="line-68">  }</span>
+<span class="source-line-no">069</span><span id="line-69"></span>
+<span class="source-line-no">070</span><span id="line-70">  @Override</span>
+<span class="source-line-no">071</span><span id="line-71">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
+<span class="source-line-no">072</span><span id="line-72">    return new BlockingRpcClient(conf) {</span>
+<span class="source-line-no">073</span><span id="line-73"></span>
+<span class="source-line-no">074</span><span id="line-74">      @Override</span>
+<span class="source-line-no">075</span><span id="line-75">      protected BlockingRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
+<span class="source-line-no">076</span><span id="line-76">        return new BlockingRpcConnection(this, remoteId) {</span>
+<span class="source-line-no">077</span><span id="line-77">          @Override</span>
+<span class="source-line-no">078</span><span id="line-78">          protected byte[] getConnectionHeaderPreamble() {</span>
+<span class="source-line-no">079</span><span id="line-79">            byte[] header = super.getConnectionHeaderPreamble();</span>
+<span class="source-line-no">080</span><span id="line-80">            // set an invalid auth code</span>
+<span class="source-line-no">081</span><span id="line-81">            header[header.length - 1] = -10;</span>
+<span class="source-line-no">082</span><span id="line-82">            return header;</span>
+<span class="source-line-no">083</span><span id="line-83">          }</span>
+<span class="source-line-no">084</span><span id="line-84">        };</span>
+<span class="source-line-no">085</span><span id="line-85">      }</span>
+<span class="source-line-no">086</span><span id="line-86">    };</span>
+<span class="source-line-no">087</span><span id="line-87">  }</span>
+<span class="source-line-no">088</span><span id="line-88">}</span>
 
 
 
diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
index 8a884a10565..ee67d77c314 100644
--- a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
+++ b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
@@ -33,137 +33,134 @@
 <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
 <span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
 <span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.hbase.HBaseClassTestRule;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.codec.Codec;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.util.JVM;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.junit.AfterClass;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.junit.BeforeClass;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.junit.ClassRule;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.junit.experimental.categories.Category;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.junit.runner.RunWith;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.junit.runners.Parameterized;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.junit.runners.Parameterized.Parameter;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.junit.runners.Parameterized.Parameters;</span>
-<span class="source-line-no">037</span><span id="line-37"></span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollSocketChannel;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioSocketChannel;</span>
-<span class="source-line-no">042</span><span id="line-42"></span>
-<span class="source-line-no">043</span><span id="line-43">@RunWith(Parameterized.class)</span>
-<span class="source-line-no">044</span><span id="line-44">@Category({ RPCTests.class, MediumTests.class })</span>
-<span class="source-line-no">045</span><span id="line-45">public class TestNettyIPC extends AbstractTestIPC {</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">  @ClassRule</span>
-<span class="source-line-no">048</span><span id="line-48">  public static final HBaseClassTestRule CLASS_RULE =</span>
-<span class="source-line-no">049</span><span id="line-49">    HBaseClassTestRule.forClass(TestNettyIPC.class);</span>
-<span class="source-line-no">050</span><span id="line-50"></span>
-<span class="source-line-no">051</span><span id="line-51">  private static List&lt;String&gt; getEventLoopTypes() {</span>
-<span class="source-line-no">052</span><span id="line-52">    List&lt;String&gt; types = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">053</span><span id="line-53">    types.add("nio");</span>
-<span class="source-line-no">054</span><span id="line-54">    types.add("perClientNio");</span>
-<span class="source-line-no">055</span><span id="line-55">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
-<span class="source-line-no">056</span><span id="line-56">      types.add("epoll");</span>
-<span class="source-line-no">057</span><span id="line-57">    }</span>
-<span class="source-line-no">058</span><span id="line-58">    return types;</span>
-<span class="source-line-no">059</span><span id="line-59">  }</span>
-<span class="source-line-no">060</span><span id="line-60"></span>
-<span class="source-line-no">061</span><span id="line-61">  @Parameters(name = "{index}: rpcServerImpl={0}, EventLoop={1}")</span>
-<span class="source-line-no">062</span><span id="line-62">  public static List&lt;Object[]&gt; parameters() {</span>
-<span class="source-line-no">063</span><span id="line-63">    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">064</span><span id="line-64">    for (String eventLoopType : getEventLoopTypes()) {</span>
-<span class="source-line-no">065</span><span id="line-65">      params.add(new Object[] { SimpleRpcServer.class, eventLoopType });</span>
-<span class="source-line-no">066</span><span id="line-66">      params.add(new Object[] { NettyRpcServer.class, eventLoopType });</span>
-<span class="source-line-no">067</span><span id="line-67">    }</span>
-<span class="source-line-no">068</span><span id="line-68">    return params;</span>
+<span class="source-line-no">023</span><span id="line-23">import java.util.stream.Stream;</span>
+<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;</span>
+<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.codec.Codec;</span>
+<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
+<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.util.JVM;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">032</span><span id="line-32">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.junit.jupiter.params.provider.Arguments;</span>
+<span class="source-line-no">034</span><span id="line-34"></span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollSocketChannel;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioSocketChannel;</span>
+<span class="source-line-no">039</span><span id="line-39"></span>
+<span class="source-line-no">040</span><span id="line-40">@Tag(RPCTests.TAG)</span>
+<span class="source-line-no">041</span><span id="line-41">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">042</span><span id="line-42">@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}, EventLoop={1}")</span>
+<span class="source-line-no">043</span><span id="line-43">public class TestNettyIPC extends AbstractTestIPC {</span>
+<span class="source-line-no">044</span><span id="line-44"></span>
+<span class="source-line-no">045</span><span id="line-45">  private static List&lt;String&gt; getEventLoopTypes() {</span>
+<span class="source-line-no">046</span><span id="line-46">    List&lt;String&gt; types = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">047</span><span id="line-47">    types.add("nio");</span>
+<span class="source-line-no">048</span><span id="line-48">    types.add("perClientNio");</span>
+<span class="source-line-no">049</span><span id="line-49">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
+<span class="source-line-no">050</span><span id="line-50">      types.add("epoll");</span>
+<span class="source-line-no">051</span><span id="line-51">    }</span>
+<span class="source-line-no">052</span><span id="line-52">    return types;</span>
+<span class="source-line-no">053</span><span id="line-53">  }</span>
+<span class="source-line-no">054</span><span id="line-54"></span>
+<span class="source-line-no">055</span><span id="line-55">  public static Stream&lt;Arguments&gt; parameters() {</span>
+<span class="source-line-no">056</span><span id="line-56">    List&lt;Arguments&gt; params = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">057</span><span id="line-57">    for (String eventLoopType : getEventLoopTypes()) {</span>
+<span class="source-line-no">058</span><span id="line-58">      params.add(Arguments.of(SimpleRpcServer.class, eventLoopType));</span>
+<span class="source-line-no">059</span><span id="line-59">      params.add(Arguments.of(NettyRpcServer.class, eventLoopType));</span>
+<span class="source-line-no">060</span><span id="line-60">    }</span>
+<span class="source-line-no">061</span><span id="line-61">    return params.stream();</span>
+<span class="source-line-no">062</span><span id="line-62">  }</span>
+<span class="source-line-no">063</span><span id="line-63"></span>
+<span class="source-line-no">064</span><span id="line-64">  private String eventLoopType;</span>
+<span class="source-line-no">065</span><span id="line-65"></span>
+<span class="source-line-no">066</span><span id="line-66">  public TestNettyIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl, String eventLoopType) {</span>
+<span class="source-line-no">067</span><span id="line-67">    super(rpcServerImpl);</span>
+<span class="source-line-no">068</span><span id="line-68">    this.eventLoopType = eventLoopType;</span>
 <span class="source-line-no">069</span><span id="line-69">  }</span>
 <span class="source-line-no">070</span><span id="line-70"></span>
-<span class="source-line-no">071</span><span id="line-71">  @Parameter(1)</span>
-<span class="source-line-no">072</span><span id="line-72">  public String eventLoopType;</span>
-<span class="source-line-no">073</span><span id="line-73"></span>
-<span class="source-line-no">074</span><span id="line-74">  private static NioEventLoopGroup NIO;</span>
-<span class="source-line-no">075</span><span id="line-75"></span>
-<span class="source-line-no">076</span><span id="line-76">  private static EpollEventLoopGroup EPOLL;</span>
-<span class="source-line-no">077</span><span id="line-77"></span>
-<span class="source-line-no">078</span><span id="line-78">  @BeforeClass</span>
-<span class="source-line-no">079</span><span id="line-79">  public static void setUpBeforeClass() {</span>
-<span class="source-line-no">080</span><span id="line-80">    NIO = new NioEventLoopGroup();</span>
-<span class="source-line-no">081</span><span id="line-81">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
-<span class="source-line-no">082</span><span id="line-82">      EPOLL = new EpollEventLoopGroup();</span>
-<span class="source-line-no">083</span><span id="line-83">    }</span>
-<span class="source-line-no">084</span><span id="line-84">  }</span>
-<span class="source-line-no">085</span><span id="line-85"></span>
-<span class="source-line-no">086</span><span id="line-86">  @AfterClass</span>
-<span class="source-line-no">087</span><span id="line-87">  public static void tearDownAfterClass() {</span>
-<span class="source-line-no">088</span><span id="line-88">    if (NIO != null) {</span>
-<span class="source-line-no">089</span><span id="line-89">      NIO.shutdownGracefully();</span>
+<span class="source-line-no">071</span><span id="line-71">  private static NioEventLoopGroup NIO;</span>
+<span class="source-line-no">072</span><span id="line-72"></span>
+<span class="source-line-no">073</span><span id="line-73">  private static EpollEventLoopGroup EPOLL;</span>
+<span class="source-line-no">074</span><span id="line-74"></span>
+<span class="source-line-no">075</span><span id="line-75">  @BeforeAll</span>
+<span class="source-line-no">076</span><span id="line-76">  public static void setUpBeforeClass() {</span>
+<span class="source-line-no">077</span><span id="line-77">    NIO = new NioEventLoopGroup();</span>
+<span class="source-line-no">078</span><span id="line-78">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
+<span class="source-line-no">079</span><span id="line-79">      EPOLL = new EpollEventLoopGroup();</span>
+<span class="source-line-no">080</span><span id="line-80">    }</span>
+<span class="source-line-no">081</span><span id="line-81">  }</span>
+<span class="source-line-no">082</span><span id="line-82"></span>
+<span class="source-line-no">083</span><span id="line-83">  @AfterAll</span>
+<span class="source-line-no">084</span><span id="line-84">  public static void tearDownAfterClass() {</span>
+<span class="source-line-no">085</span><span id="line-85">    if (NIO != null) {</span>
+<span class="source-line-no">086</span><span id="line-86">      NIO.shutdownGracefully();</span>
+<span class="source-line-no">087</span><span id="line-87">    }</span>
+<span class="source-line-no">088</span><span id="line-88">    if (EPOLL != null) {</span>
+<span class="source-line-no">089</span><span id="line-89">      EPOLL.shutdownGracefully();</span>
 <span class="source-line-no">090</span><span id="line-90">    }</span>
-<span class="source-line-no">091</span><span id="line-91">    if (EPOLL != null) {</span>
-<span class="source-line-no">092</span><span id="line-92">      EPOLL.shutdownGracefully();</span>
-<span class="source-line-no">093</span><span id="line-93">    }</span>
-<span class="source-line-no">094</span><span id="line-94">  }</span>
-<span class="source-line-no">095</span><span id="line-95"></span>
-<span class="source-line-no">096</span><span id="line-96">  private void setConf(Configuration conf) {</span>
-<span class="source-line-no">097</span><span id="line-97">    switch (eventLoopType) {</span>
-<span class="source-line-no">098</span><span id="line-98">      case "nio":</span>
-<span class="source-line-no">099</span><span id="line-99">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, NIO, NioSocketChannel.class);</span>
+<span class="source-line-no">091</span><span id="line-91">  }</span>
+<span class="source-line-no">092</span><span id="line-92"></span>
+<span class="source-line-no">093</span><span id="line-93">  private void setConf(Configuration conf) {</span>
+<span class="source-line-no">094</span><span id="line-94">    switch (eventLoopType) {</span>
+<span class="source-line-no">095</span><span id="line-95">      case "nio":</span>
+<span class="source-line-no">096</span><span id="line-96">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, NIO, NioSocketChannel.class);</span>
+<span class="source-line-no">097</span><span id="line-97">        break;</span>
+<span class="source-line-no">098</span><span id="line-98">      case "epoll":</span>
+<span class="source-line-no">099</span><span id="line-99">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, EPOLL, EpollSocketChannel.class);</span>
 <span class="source-line-no">100</span><span id="line-100">        break;</span>
-<span class="source-line-no">101</span><span id="line-101">      case "epoll":</span>
-<span class="source-line-no">102</span><span id="line-102">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, EPOLL, EpollSocketChannel.class);</span>
+<span class="source-line-no">101</span><span id="line-101">      case "perClientNio":</span>
+<span class="source-line-no">102</span><span id="line-102">        NettyRpcClientConfigHelper.createEventLoopPerClient(conf);</span>
 <span class="source-line-no">103</span><span id="line-103">        break;</span>
-<span class="source-line-no">104</span><span id="line-104">      case "perClientNio":</span>
-<span class="source-line-no">105</span><span id="line-105">        NettyRpcClientConfigHelper.createEventLoopPerClient(conf);</span>
-<span class="source-line-no">106</span><span id="line-106">        break;</span>
-<span class="source-line-no">107</span><span id="line-107">      default:</span>
-<span class="source-line-no">108</span><span id="line-108">        break;</span>
-<span class="source-line-no">109</span><span id="line-109">    }</span>
-<span class="source-line-no">110</span><span id="line-110">  }</span>
-<span class="source-line-no">111</span><span id="line-111"></span>
-<span class="source-line-no">112</span><span id="line-112">  @Override</span>
-<span class="source-line-no">113</span><span id="line-113">  protected NettyRpcClient createRpcClientNoCodec(Configuration conf) {</span>
-<span class="source-line-no">114</span><span id="line-114">    setConf(conf);</span>
-<span class="source-line-no">115</span><span id="line-115">    return new NettyRpcClient(conf) {</span>
-<span class="source-line-no">116</span><span id="line-116"></span>
-<span class="source-line-no">117</span><span id="line-117">      @Override</span>
-<span class="source-line-no">118</span><span id="line-118">      protected Codec getCodec() {</span>
-<span class="source-line-no">119</span><span id="line-119">        return null;</span>
-<span class="source-line-no">120</span><span id="line-120">      }</span>
+<span class="source-line-no">104</span><span id="line-104">      default:</span>
+<span class="source-line-no">105</span><span id="line-105">        break;</span>
+<span class="source-line-no">106</span><span id="line-106">    }</span>
+<span class="source-line-no">107</span><span id="line-107">  }</span>
+<span class="source-line-no">108</span><span id="line-108"></span>
+<span class="source-line-no">109</span><span id="line-109">  @Override</span>
+<span class="source-line-no">110</span><span id="line-110">  protected NettyRpcClient createRpcClientNoCodec(Configuration conf) {</span>
+<span class="source-line-no">111</span><span id="line-111">    setConf(conf);</span>
+<span class="source-line-no">112</span><span id="line-112">    return new NettyRpcClient(conf) {</span>
+<span class="source-line-no">113</span><span id="line-113"></span>
+<span class="source-line-no">114</span><span id="line-114">      @Override</span>
+<span class="source-line-no">115</span><span id="line-115">      protected Codec getCodec() {</span>
+<span class="source-line-no">116</span><span id="line-116">        return null;</span>
+<span class="source-line-no">117</span><span id="line-117">      }</span>
+<span class="source-line-no">118</span><span id="line-118"></span>
+<span class="source-line-no">119</span><span id="line-119">    };</span>
+<span class="source-line-no">120</span><span id="line-120">  }</span>
 <span class="source-line-no">121</span><span id="line-121"></span>
-<span class="source-line-no">122</span><span id="line-122">    };</span>
-<span class="source-line-no">123</span><span id="line-123">  }</span>
-<span class="source-line-no">124</span><span id="line-124"></span>
-<span class="source-line-no">125</span><span id="line-125">  @Override</span>
-<span class="source-line-no">126</span><span id="line-126">  protected NettyRpcClient createRpcClient(Configuration conf) {</span>
-<span class="source-line-no">127</span><span id="line-127">    setConf(conf);</span>
-<span class="source-line-no">128</span><span id="line-128">    return new NettyRpcClient(conf);</span>
-<span class="source-line-no">129</span><span id="line-129">  }</span>
-<span class="source-line-no">130</span><span id="line-130"></span>
-<span class="source-line-no">131</span><span id="line-131">  @Override</span>
-<span class="source-line-no">132</span><span id="line-132">  protected NettyRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf) {</span>
-<span class="source-line-no">133</span><span id="line-133">    setConf(conf);</span>
-<span class="source-line-no">134</span><span id="line-134">    return new NettyRpcClient(conf) {</span>
-<span class="source-line-no">135</span><span id="line-135"></span>
-<span class="source-line-no">136</span><span id="line-136">      @Override</span>
-<span class="source-line-no">137</span><span id="line-137">      protected boolean isTcpNoDelay() {</span>
-<span class="source-line-no">138</span><span id="line-138">        throw new RuntimeException("Injected fault");</span>
-<span class="source-line-no">139</span><span id="line-139">      }</span>
-<span class="source-line-no">140</span><span id="line-140">    };</span>
-<span class="source-line-no">141</span><span id="line-141">  }</span>
-<span class="source-line-no">142</span><span id="line-142"></span>
-<span class="source-line-no">143</span><span id="line-143">  @Override</span>
-<span class="source-line-no">144</span><span id="line-144">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
-<span class="source-line-no">145</span><span id="line-145">    return new NettyRpcClient(conf) {</span>
-<span class="source-line-no">146</span><span id="line-146"></span>
-<span class="source-line-no">147</span><span id="line-147">      @Override</span>
-<span class="source-line-no">148</span><span id="line-148">      protected NettyRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
-<span class="source-line-no">149</span><span id="line-149">        return new BadAuthNettyRpcConnection(this, remoteId);</span>
-<span class="source-line-no">150</span><span id="line-150">      }</span>
-<span class="source-line-no">151</span><span id="line-151">    };</span>
-<span class="source-line-no">152</span><span id="line-152">  }</span>
-<span class="source-line-no">153</span><span id="line-153">}</span>
+<span class="source-line-no">122</span><span id="line-122">  @Override</span>
+<span class="source-line-no">123</span><span id="line-123">  protected NettyRpcClient createRpcClient(Configuration conf) {</span>
+<span class="source-line-no">124</span><span id="line-124">    setConf(conf);</span>
+<span class="source-line-no">125</span><span id="line-125">    return new NettyRpcClient(conf);</span>
+<span class="source-line-no">126</span><span id="line-126">  }</span>
+<span class="source-line-no">127</span><span id="line-127"></span>
+<span class="source-line-no">128</span><span id="line-128">  @Override</span>
+<span class="source-line-no">129</span><span id="line-129">  protected NettyRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf) {</span>
+<span class="source-line-no">130</span><span id="line-130">    setConf(conf);</span>
+<span class="source-line-no">131</span><span id="line-131">    return new NettyRpcClient(conf) {</span>
+<span class="source-line-no">132</span><span id="line-132"></span>
+<span class="source-line-no">133</span><span id="line-133">      @Override</span>
+<span class="source-line-no">134</span><span id="line-134">      protected boolean isTcpNoDelay() {</span>
+<span class="source-line-no">135</span><span id="line-135">        throw new RuntimeException("Injected fault");</span>
+<span class="source-line-no">136</span><span id="line-136">      }</span>
+<span class="source-line-no">137</span><span id="line-137">    };</span>
+<span class="source-line-no">138</span><span id="line-138">  }</span>
+<span class="source-line-no">139</span><span id="line-139"></span>
+<span class="source-line-no">140</span><span id="line-140">  @Override</span>
+<span class="source-line-no">141</span><span id="line-141">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
+<span class="source-line-no">142</span><span id="line-142">    return new NettyRpcClient(conf) {</span>
+<span class="source-line-no">143</span><span id="line-143"></span>
+<span class="source-line-no">144</span><span id="line-144">      @Override</span>
+<span class="source-line-no">145</span><span id="line-145">      protected NettyRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
+<span class="source-line-no">146</span><span id="line-146">        return new BadAuthNettyRpcConnection(this, remoteId);</span>
+<span class="source-line-no">147</span><span id="line-147">      }</span>
+<span class="source-line-no">148</span><span id="line-148">    };</span>
+<span class="source-line-no">149</span><span id="line-149">  }</span>
+<span class="source-line-no">150</span><span id="line-150">}</span>
 
 
 
diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
index 037a0246857..3c6f7a1a981 100644
--- a/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
+++ b/testapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
@@ -39,89 +39,89 @@
 <span class="source-line-no">026</span><span id="line-26">import java.security.Security;</span>
 <span class="source-line-no">027</span><span id="line-27">import java.util.ArrayList;</span>
 <span class="source-line-no">028</span><span id="line-28">import java.util.List;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.apache.commons.io.FileUtils;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.HBaseClassTestRule;</span>
+<span class="source-line-no">029</span><span id="line-29">import java.util.stream.Stream;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.apache.commons.io.FileUtils;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.conf.Configuration;</span>
 <span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.HBaseCommonTestingUtil;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.HBaseServerBase;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.Server;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.client.ConnectionRegistryEndpoint;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.codec.Codec;</span>
-<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.io.crypto.tls.KeyStoreFileType;</span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.io.crypto.tls.X509KeyType;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContext;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContextProvider;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.io.crypto.tls.X509Util;</span>
-<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
-<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
-<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig;</span>
-<span class="source-line-no">046</span><span id="line-46">import org.bouncycastle.jce.provider.BouncyCastleProvider;</span>
-<span class="source-line-no">047</span><span id="line-47">import org.junit.After;</span>
-<span class="source-line-no">048</span><span id="line-48">import org.junit.AfterClass;</span>
-<span class="source-line-no">049</span><span id="line-49">import org.junit.Before;</span>
-<span class="source-line-no">050</span><span id="line-50">import org.junit.BeforeClass;</span>
-<span class="source-line-no">051</span><span id="line-51">import org.junit.ClassRule;</span>
-<span class="source-line-no">052</span><span id="line-52">import org.junit.experimental.categories.Category;</span>
-<span class="source-line-no">053</span><span id="line-53">import org.junit.runner.RunWith;</span>
-<span class="source-line-no">054</span><span id="line-54">import org.junit.runners.Parameterized;</span>
-<span class="source-line-no">055</span><span id="line-55"></span>
-<span class="source-line-no">056</span><span id="line-56">@RunWith(Parameterized.class)</span>
-<span class="source-line-no">057</span><span id="line-57">@Category({ RPCTests.class, MediumTests.class })</span>
-<span class="source-line-no">058</span><span id="line-58">public class TestNettyTlsIPC extends AbstractTestIPC {</span>
-<span class="source-line-no">059</span><span id="line-59"></span>
-<span class="source-line-no">060</span><span id="line-60">  @ClassRule</span>
-<span class="source-line-no">061</span><span id="line-61">  public static final HBaseClassTestRule CLASS_RULE =</span>
-<span class="source-line-no">062</span><span id="line-62">    HBaseClassTestRule.forClass(TestNettyTlsIPC.class);</span>
-<span class="source-line-no">063</span><span id="line-63"></span>
-<span class="source-line-no">064</span><span id="line-64">  private static final HBaseCommonTestingUtil UTIL = new HBaseCommonTestingUtil(CONF);</span>
-<span class="source-line-no">065</span><span id="line-65"></span>
-<span class="source-line-no">066</span><span id="line-66">  private static X509TestContextProvider PROVIDER;</span>
-<span class="source-line-no">067</span><span id="line-67"></span>
-<span class="source-line-no">068</span><span id="line-68">  private static NettyEventLoopGroupConfig EVENT_LOOP_GROUP_CONFIG;</span>
-<span class="source-line-no">069</span><span id="line-69"></span>
-<span class="source-line-no">070</span><span id="line-70">  @Parameterized.Parameter(1)</span>
-<span class="source-line-no">071</span><span id="line-71">  public X509KeyType caKeyType;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;</span>
+<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.HBaseServerBase;</span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.Server;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.client.ConnectionRegistryEndpoint;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.codec.Codec;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.io.crypto.tls.KeyStoreFileType;</span>
+<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.io.crypto.tls.X509KeyType;</span>
+<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContext;</span>
+<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContextProvider;</span>
+<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.io.crypto.tls.X509Util;</span>
+<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
+<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
+<span class="source-line-no">046</span><span id="line-46">import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig;</span>
+<span class="source-line-no">047</span><span id="line-47">import org.bouncycastle.jce.provider.BouncyCastleProvider;</span>
+<span class="source-line-no">048</span><span id="line-48">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">049</span><span id="line-49">import org.junit.jupiter.api.AfterEach;</span>
+<span class="source-line-no">050</span><span id="line-50">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">051</span><span id="line-51">import org.junit.jupiter.api.BeforeEach;</span>
+<span class="source-line-no">052</span><span id="line-52">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">053</span><span id="line-53">import org.junit.jupiter.params.provider.Arguments;</span>
+<span class="source-line-no">054</span><span id="line-54"></span>
+<span class="source-line-no">055</span><span id="line-55">@Tag(RPCTests.TAG)</span>
+<span class="source-line-no">056</span><span id="line-56">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">057</span><span id="line-57">@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}, caKeyType={1},"</span>
+<span class="source-line-no">058</span><span id="line-58">  + " certKeyType={2}, keyPassword={3}, acceptPlainText={4}, clientTlsEnabled={5}")</span>
+<span class="source-line-no">059</span><span id="line-59">public class TestNettyTlsIPC extends AbstractTestIPC {</span>
+<span class="source-line-no">060</span><span id="line-60"></span>
+<span class="source-line-no">061</span><span id="line-61">  private static final HBaseCommonTestingUtil UTIL = new HBaseCommonTestingUtil(CONF);</span>
+<span class="source-line-no">062</span><span id="line-62"></span>
+<span class="source-line-no">063</span><span id="line-63">  private static X509TestContextProvider PROVIDER;</span>
+<span class="source-line-no">064</span><span id="line-64"></span>
+<span class="source-line-no">065</span><span id="line-65">  private static NettyEventLoopGroupConfig EVENT_LOOP_GROUP_CONFIG;</span>
+<span class="source-line-no">066</span><span id="line-66"></span>
+<span class="source-line-no">067</span><span id="line-67">  private X509KeyType caKeyType;</span>
+<span class="source-line-no">068</span><span id="line-68"></span>
+<span class="source-line-no">069</span><span id="line-69">  private X509KeyType certKeyType;</span>
+<span class="source-line-no">070</span><span id="line-70"></span>
+<span class="source-line-no">071</span><span id="line-71">  private char[] keyPassword;</span>
 <span class="source-line-no">072</span><span id="line-72"></span>
-<span class="source-line-no">073</span><span id="line-73">  @Parameterized.Parameter(2)</span>
-<span class="source-line-no">074</span><span id="line-74">  public X509KeyType certKeyType;</span>
-<span class="source-line-no">075</span><span id="line-75"></span>
-<span class="source-line-no">076</span><span id="line-76">  @Parameterized.Parameter(3)</span>
-<span class="source-line-no">077</span><span id="line-77">  public char[] keyPassword;</span>
-<span class="source-line-no">078</span><span id="line-78"></span>
-<span class="source-line-no">079</span><span id="line-79">  @Parameterized.Parameter(4)</span>
-<span class="source-line-no">080</span><span id="line-80">  public boolean acceptPlainText;</span>
-<span class="source-line-no">081</span><span id="line-81"></span>
-<span class="source-line-no">082</span><span id="line-82">  @Parameterized.Parameter(5)</span>
-<span class="source-line-no">083</span><span id="line-83">  public boolean clientTlsEnabled;</span>
-<span class="source-line-no">084</span><span id="line-84"></span>
-<span class="source-line-no">085</span><span id="line-85">  private X509TestContext x509TestContext;</span>
-<span class="source-line-no">086</span><span id="line-86"></span>
-<span class="source-line-no">087</span><span id="line-87">  // only netty rpc server supports TLS, so here we will only test NettyRpcServer</span>
-<span class="source-line-no">088</span><span id="line-88">  @Parameterized.Parameters(</span>
-<span class="source-line-no">089</span><span id="line-89">      name = "{index}: rpcServerImpl={0}, caKeyType={1}, certKeyType={2}, keyPassword={3},"</span>
-<span class="source-line-no">090</span><span id="line-90">        + " acceptPlainText={4}, clientTlsEnabled={5}")</span>
-<span class="source-line-no">091</span><span id="line-91">  public static List&lt;Object[]&gt; data() {</span>
-<span class="source-line-no">092</span><span id="line-92">    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">073</span><span id="line-73">  private boolean acceptPlainText;</span>
+<span class="source-line-no">074</span><span id="line-74"></span>
+<span class="source-line-no">075</span><span id="line-75">  private boolean clientTlsEnabled;</span>
+<span class="source-line-no">076</span><span id="line-76"></span>
+<span class="source-line-no">077</span><span id="line-77">  public TestNettyTlsIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl, X509KeyType caKeyType,</span>
+<span class="source-line-no">078</span><span id="line-78">    X509KeyType certKeyType, char[] keyPassword, boolean acceptPlainText,</span>
+<span class="source-line-no">079</span><span id="line-79">    boolean clientTlsEnabled) {</span>
+<span class="source-line-no">080</span><span id="line-80">    super(rpcServerImpl);</span>
+<span class="source-line-no">081</span><span id="line-81">    this.caKeyType = caKeyType;</span>
+<span class="source-line-no">082</span><span id="line-82">    this.certKeyType = certKeyType;</span>
+<span class="source-line-no">083</span><span id="line-83">    this.keyPassword = keyPassword;</span>
+<span class="source-line-no">084</span><span id="line-84">    this.acceptPlainText = acceptPlainText;</span>
+<span class="source-line-no">085</span><span id="line-85">    this.clientTlsEnabled = clientTlsEnabled;</span>
+<span class="source-line-no">086</span><span id="line-86">  }</span>
+<span class="source-line-no">087</span><span id="line-87"></span>
+<span class="source-line-no">088</span><span id="line-88">  private X509TestContext x509TestContext;</span>
+<span class="source-line-no">089</span><span id="line-89"></span>
+<span class="source-line-no">090</span><span id="line-90">  // only netty rpc server supports TLS, so here we will only test NettyRpcServer</span>
+<span class="source-line-no">091</span><span id="line-91">  public static Stream&lt;Arguments&gt; parameters() {</span>
+<span class="source-line-no">092</span><span id="line-92">    List&lt;Arguments&gt; params = new ArrayList&lt;&gt;();</span>
 <span class="source-line-no">093</span><span id="line-93">    for (X509KeyType caKeyType : X509KeyType.values()) {</span>
 <span class="source-line-no">094</span><span id="line-94">      for (X509KeyType certKeyType : X509KeyType.values()) {</span>
 <span class="source-line-no">095</span><span id="line-95">        for (char[] keyPassword : new char[][] { "".toCharArray(), "pa$$w0rd".toCharArray() }) {</span>
 <span class="source-line-no">096</span><span id="line-96">          // do not accept plain text</span>
-<span class="source-line-no">097</span><span id="line-97">          params.add(new Object[] { NettyRpcServer.class, caKeyType, certKeyType, keyPassword,</span>
-<span class="source-line-no">098</span><span id="line-98">            false, true });</span>
+<span class="source-line-no">097</span><span id="line-97">          params.add(</span>
+<span class="source-line-no">098</span><span id="line-98">            Arguments.of(NettyRpcServer.class, caKeyType, certKeyType, keyPassword, false, true));</span>
 <span class="source-line-no">099</span><span id="line-99">          // support plain text and client enables tls</span>
 <span class="source-line-no">100</span><span id="line-100">          params.add(</span>
-<span class="source-line-no">101</span><span id="line-101">            new Object[] { NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true, true });</span>
+<span class="source-line-no">101</span><span id="line-101">            Arguments.of(NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true, true));</span>
 <span class="source-line-no">102</span><span id="line-102">          // support plain text and client disables tls</span>
-<span class="source-line-no">103</span><span id="line-103">          params.add(new Object[] { NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true,</span>
-<span class="source-line-no">104</span><span id="line-104">            false });</span>
+<span class="source-line-no">103</span><span id="line-103">          params.add(</span>
+<span class="source-line-no">104</span><span id="line-104">            Arguments.of(NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true, false));</span>
 <span class="source-line-no">105</span><span id="line-105">        }</span>
 <span class="source-line-no">106</span><span id="line-106">      }</span>
 <span class="source-line-no">107</span><span id="line-107">    }</span>
-<span class="source-line-no">108</span><span id="line-108">    return params;</span>
+<span class="source-line-no">108</span><span id="line-108">    return params.stream();</span>
 <span class="source-line-no">109</span><span id="line-109">  }</span>
 <span class="source-line-no">110</span><span id="line-110"></span>
-<span class="source-line-no">111</span><span id="line-111">  @BeforeClass</span>
+<span class="source-line-no">111</span><span id="line-111">  @BeforeAll</span>
 <span class="source-line-no">112</span><span id="line-112">  public static void setUpBeforeClass() throws IOException {</span>
 <span class="source-line-no">113</span><span id="line-113">    Security.addProvider(new BouncyCastleProvider());</span>
 <span class="source-line-no">114</span><span id="line-114">    File dir = new File(UTIL.getDataTestDir(TestNettyTlsIPC.class.getSimpleName()).toString())</span>
@@ -134,14 +134,14 @@
 <span class="source-line-no">121</span><span id="line-121">      NettyEventLoopGroupConfig.setup(CONF, TestNettyTlsIPC.class.getSimpleName());</span>
 <span class="source-line-no">122</span><span id="line-122">  }</span>
 <span class="source-line-no">123</span><span id="line-123"></span>
-<span class="source-line-no">124</span><span id="line-124">  @AfterClass</span>
+<span class="source-line-no">124</span><span id="line-124">  @AfterAll</span>
 <span class="source-line-no">125</span><span id="line-125">  public static void tearDownAfterClass() throws InterruptedException {</span>
 <span class="source-line-no">126</span><span id="line-126">    Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);</span>
 <span class="source-line-no">127</span><span id="line-127">    EVENT_LOOP_GROUP_CONFIG.group().shutdownGracefully().sync();</span>
 <span class="source-line-no">128</span><span id="line-128">    UTIL.cleanupTestDir();</span>
 <span class="source-line-no">129</span><span id="line-129">  }</span>
 <span class="source-line-no">130</span><span id="line-130"></span>
-<span class="source-line-no">131</span><span id="line-131">  @Before</span>
+<span class="source-line-no">131</span><span id="line-131">  @BeforeEach</span>
 <span class="source-line-no">132</span><span id="line-132">  public void setUp() throws IOException {</span>
 <span class="source-line-no">133</span><span id="line-133">    x509TestContext = PROVIDER.get(caKeyType, certKeyType, keyPassword);</span>
 <span class="source-line-no">134</span><span id="line-134">    x509TestContext.setConfigurations(KeyStoreFileType.JKS, KeyStoreFileType.JKS);</span>
@@ -149,7 +149,7 @@
 <span class="source-line-no">136</span><span id="line-136">    CONF.setBoolean(X509Util.HBASE_CLIENT_NETTY_TLS_ENABLED, clientTlsEnabled);</span>
 <span class="source-line-no">137</span><span id="line-137">  }</span>
 <span class="source-line-no">138</span><span id="line-138"></span>
-<span class="source-line-no">139</span><span id="line-139">  @After</span>
+<span class="source-line-no">139</span><span id="line-139">  @AfterEach</span>
 <span class="source-line-no">140</span><span id="line-140">  public void tearDown() {</span>
 <span class="source-line-no">141</span><span id="line-141">    x509TestContext.clearConfigurations();</span>
 <span class="source-line-no">142</span><span id="line-142">    x509TestContext.getConf().unset(X509Util.TLS_CONFIG_OCSP);</span>
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 9b81c0238a0..b86f64990ca 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -316,7 +316,7 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Some basic ipc tests.</div>
 </dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#%3Cinit%3E()" class="member-name-link">AbstractTestIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></dt>
+<dt><a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#%3Cinit%3E(java.lang.Class)" class="member-name-link">AbstractTestIPC(Class&lt;? extends RpcServer&gt;)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC.FailingSimpleRpcServer</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
@@ -6869,8 +6869,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/io/util/TestMemorySizeUtil.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.io.util.<a href="org/apache/hadoop/hbase/io/util/TestMemorySizeUtil.html" title="class in org.apache.hadoop.hbase.io.util">TestMemorySizeUtil</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestBufferChain.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBufferChain.html" title="class in org.apache.hadoop.hbase.ipc">TestBufferChain</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestCallRunner.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestCallRunner.html" title="class in org.apache.hadoop.hbase.ipc">TestCallRunner</a></dt>
@@ -6895,16 +6893,12 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyChannelWritability.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyChannelWritability</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPCCloseConnection</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyRpcConnection</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyRpcServer</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html" title="class in org.apache.hadoop.hbase.ipc">TestProtoBufRpc</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.html" title="class in org.apache.hadoop.hbase.ipc">TestRemoteWithExtrasException</a></dt>
@@ -15781,10 +15775,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/io/hfile/TestLazyDataBlockDecompression.html#data()" class="member-name-link">data()</a> - Static method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TestLazyDataBlockDecompression.html" title="class in org.apache.hadoop.hbase.io.hfile">TestLazyDataBlockDecompression</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#data()" class="member-name-link">data()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></dt>
-<dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#data()" class="member-name-link">data()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.html#data()" class="member-name-link">data()</a> - Static method in class org.apache.hadoop.hbase.mob.<a href="org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.html" title="class in org.apache.hadoop.hbase.mob">TestDefaultMobStoreFlusher</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.html#data()" class="member-name-link">data()</a> - Static method in class org.apache.hadoop.hbase.mob.<a href="org/apache/hadoop/hbase/mob/TestMobCompactionWithDefaults.html" title="class in org.apache.hadoop.hbase.mob">TestMobCompactionWithDefaults</a></dt>
@@ -39353,6 +39343,8 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/client/AbstractTestAsyncTableScan.html#OTEL_CLASS_RULE" class="member-name-link">OTEL_CLASS_RULE</a> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AbstractTestAsyncTableScan.html" title="class in org.apache.hadoop.hbase.client">AbstractTestAsyncTableScan</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#OTEL_EXT" class="member-name-link">OTEL_EXT</a> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocator.AbstractBase.html#otelClassRule" class="member-name-link">otelClassRule</a> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocator.AbstractBase.html" title="class in org.apache.hadoop.hbase.client">TestAsyncMetaRegionLocator.AbstractBase</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/master/procedure/TestProcedureTracing.html#otelClassRule" class="member-name-link">otelClassRule</a> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedureTracing.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedureTracing</a></dt>
@@ -39538,10 +39530,14 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/io/hfile/TestSeekTo.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TestSeekTo.html" title="class in org.apache.hadoop.hbase.io.hfile">TestSeekTo</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyRpcServer.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyRpcServer</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestProtoBufRpc.html" title="class in org.apache.hadoop.hbase.ipc">TestProtoBufRpc</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html#parameters()" class="member-name-link">parameters()</a> - Static method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html" title="class in org.apache.hadoop.hbase.ipc">TestRpcHandlerException</a></dt>
@@ -62544,7 +62540,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#%3Cinit%3E()" class="member-name-link">TestBlockingIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></dt>
+<dt><a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#%3Cinit%3E(java.lang.Class)" class="member-name-link">TestBlockingIPC(Class&lt;? extends RpcServer&gt;)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBlockingIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCacheRefCnt.html#testBlockInRAMCache()" class="member-name-link">testBlockInRAMCache()</a> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCacheRefCnt.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">TestBucketCacheRefCnt</a></dt>
 <dd>&nbsp;</dd>
@@ -77107,7 +77103,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html#%3Cinit%3E()" class="member-name-link">TestNettyIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></dt>
+<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html#%3Cinit%3E(java.lang.Class,java.lang.String)" class="member-name-link">TestNettyIPC(Class&lt;? extends RpcServer&gt;, String)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyIPCCloseConnection.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPCCloseConnection</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>
@@ -77133,7 +77129,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a> - Class in <a href="org/apache/hadoop/hbase/ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#%3Cinit%3E()" class="member-name-link">TestNettyTlsIPC()</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></dt>
+<dt><a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#%3Cinit%3E(java.lang.Class,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,char%5B%5D,boolean,boolean)" class="member-name-link">TestNettyTlsIPC(Class&lt;? extends RpcServer&gt;, X509KeyType, X509KeyType, char[], boolean, boolean)</a> - Constructor for class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html" title="class in org.apache.hadoo [...]
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/security/TestNettyTLSIPCFileWatcher.html" class="type-name-link" title="class in org.apache.hadoop.hbase.security">TestNettyTLSIPCFileWatcher</a> - Class in <a href="org/apache/hadoop/hbase/security/package-summary.html">org.apache.hadoop.hbase.security</a></dt>
 <dd>&nbsp;</dd>
@@ -91145,8 +91141,6 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/client/TestAsyncTableTracing.html#traceRule" class="member-name-link">traceRule</a> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncTableTracing.html" title="class in org.apache.hadoop.hbase.client">TestAsyncTableTracing</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#traceRule" class="member-name-link">traceRule</a> - Variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/TestHRegionTracing.html#traceRule" class="member-name-link">traceRule</a> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegionTracing.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegionTracing</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/mttr/IntegrationTestMTTR.TimingResult.html#traces" class="member-name-link">traces</a> - Variable in class org.apache.hadoop.hbase.mttr.<a href="org/apache/hadoop/hbase/mttr/IntegrationTestMTTR.TimingResult.html" title="class in org.apache.hadoop.hbase.mttr">IntegrationTestMTTR.TimingResult</a></dt>
diff --git a/testdevapidocs/member-search-index.js b/testdevapidocs/member-search-index.js
index 85d00e6deaa..38a89d85df9 100644
--- a/testdevapidocs/member-search-index.js
+++ b/testdevapidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_ARI"},{"p":"org.apache.hadoop.hbase.io","c":"TestHalfStoreFileReader","l":"_b(String)","u":"_b(java.lang.String)"},{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_BRI"},{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.regionserver","c":"TestBlocksScanned","l":"_testBlo [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_ARI"},{"p":"org.apache.hadoop.hbase.io","c":"TestHalfStoreFileReader","l":"_b(String)","u":"_b(java.lang.String)"},{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_BRI"},{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.regionserver","c":"TestBlocksScanned","l":"_testBlo [...]
\ No newline at end of file
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index 98632de8cea..e5b19c53351 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -2775,46 +2775,40 @@ loadScripts(document, 'script');</script>
 <div class="table-header col-second">Field</div>
 <div class="table-header col-last">Description</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestBlockingIPC.</span><code><a href="../ipc/TestBlockingIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestBufferChain.</span><code><a href="../ipc/TestBufferChain.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestBufferChain.</span><code><a href="../ipc/TestBufferChain.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestCallRunner.</span><code><a href="../ipc/TestCallRunner.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestCallRunner.</span><code><a href="../ipc/TestCallRunner.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestCellBlockBuilder.</span><code><a href="../ipc/TestCellBlockBuilder.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestCellBlockBuilder.</span><code><a href="../ipc/TestCellBlockBuilder.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestConnectionId.</span><code><a href="../ipc/TestConnectionId.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestConnectionId.</span><code><a href="../ipc/TestConnectionId.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestFailedServersLog.</span><code><a href="../ipc/TestFailedServersLog.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestFailedServersLog.</span><code><a href="../ipc/TestFailedServersLog.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestFifoRpcScheduler.</span><code><a href="../ipc/TestFifoRpcScheduler.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestFifoRpcScheduler.</span><code><a href="../ipc/TestFifoRpcScheduler.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestHBaseClient.</span><code><a href="../ipc/TestHBaseClient.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestHBaseClient.</span><code><a href="../ipc/TestHBaseClient.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestHBaseRpcControllerImpl.</span><code><a href="../ipc/TestHBaseRpcControllerImpl.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestHBaseRpcControllerImpl.</span><code><a href="../ipc/TestHBaseRpcControllerImpl.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestIPCUtil.</span><code><a href="../ipc/TestIPCUtil.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestIPCUtil.</span><code><a href="../ipc/TestIPCUtil.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestMasterFifoRpcScheduler.</span><code><a href="../ipc/TestMasterFifoRpcScheduler.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestMasterFifoRpcScheduler.</span><code><a href="../ipc/TestMasterFifoRpcScheduler.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestMultipleServerPrincipalsIPC.</span><code><a href="../ipc/TestMultipleServerPrincipalsIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestMultipleServerPrincipalsIPC.</span><code><a href="../ipc/TestMultipleServerPrincipalsIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestNettyChannelWritability.</span><code><a href="../ipc/TestNettyChannelWritability.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
-<div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestNettyIPC.</span><code><a href="../ipc/TestNettyIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestNettyChannelWritability.</span><code><a href="../ipc/TestNettyChannelWritability.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
 <div class="col-second even-row-color"><span class="type-name-label">TestNettyIPCCloseConnection.</span><code><a href="../ipc/TestNettyIPCCloseConnection.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
@@ -2826,62 +2820,59 @@ loadScripts(document, 'script');</script>
 <div class="col-second even-row-color"><span class="type-name-label">TestNettyRpcServer.</span><code><a href="../ipc/TestNettyRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestNettyTlsIPC.</span><code><a href="../ipc/TestNettyTlsIPC.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestProtoBufRpc.</span><code><a href="../ipc/TestProtoBufRpc.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestProtoBufRpc.</span><code><a href="../ipc/TestProtoBufRpc.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRemoteWithExtrasException.</span><code><a href="../ipc/TestRemoteWithExtrasException.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRemoteWithExtrasException.</span><code><a href="../ipc/TestRemoteWithExtrasException.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcClientDeprecatedNameMapping.</span><code><a href="../ipc/TestRpcClientDeprecatedNameMapping.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcClientDeprecatedNameMapping.</span><code><a href="../ipc/TestRpcClientDeprecatedNameMapping.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcClientLeaks.</span><code><a href="../ipc/TestRpcClientLeaks.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcClientLeaks.</span><code><a href="../ipc/TestRpcClientLeaks.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcConnectionHeader.</span><code><a href="../ipc/TestRpcConnectionHeader.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcConnectionHeader.</span><code><a href="../ipc/TestRpcConnectionHeader.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcHandlerException.</span><code><a href="../ipc/TestRpcHandlerException.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcHandlerException.</span><code><a href="../ipc/TestRpcHandlerException.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcMetrics.</span><code><a href="../ipc/TestRpcMetrics.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcMetrics.</span><code><a href="../ipc/TestRpcMetrics.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcServerSlowConnectionSetup.</span><code><a href="../ipc/TestRpcServerSlowConnectionSetup.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcServerSlowConnectionSetup.</span><code><a href="../ipc/TestRpcServerSlowConnectionSetup.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRpcServerTraceLogging.</span><code><a href="../ipc/TestRpcServerTraceLogging.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRpcServerTraceLogging.</span><code><a href="../ipc/TestRpcServerTraceLogging.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestRpcSkipInitialSaslHandshake.</span><code><a href="../ipc/TestRpcSkipInitialSaslHandshake.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestRpcSkipInitialSaslHandshake.</span><code><a href="../ipc/TestRpcSkipInitialSaslHandshake.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestRWQueueRpcExecutor.</span><code><a href="../ipc/TestRWQueueRpcExecutor.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestRWQueueRpcExecutor.</span><code><a href="../ipc/TestRWQueueRpcExecutor.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestSecureNettyRpcServer.</span><code><a href="../ipc/TestSecureNettyRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestSecureNettyRpcServer.</span><code><a href="../ipc/TestSecureNettyRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestSecureSimpleRpcServer.</span><code><a href="../ipc/TestSecureSimpleRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestSecureSimpleRpcServer.</span><code><a href="../ipc/TestSecureSimpleRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestSecurityRpcSentBytesMetrics.</span><code><a href="../ipc/TestSecurityRpcSentBytesMetrics.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestSecurityRpcSentBytesMetrics.</span><code><a href="../ipc/TestSecurityRpcSentBytesMetrics.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestServerCall.</span><code><a href="../ipc/TestServerCall.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestServerCall.</span><code><a href="../ipc/TestServerCall.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestSimpleRpcScheduler.</span><code><a href="../ipc/TestSimpleRpcScheduler.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 <div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestSimpleRpcScheduler.</span><code><a href="../ipc/TestSimpleRpcScheduler.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second odd-row-color"><span class="type-name-label">TestSimpleRpcServer.</span><code><a href="../ipc/TestSimpleRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 <div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><span class="type-name-label">TestSimpleRpcServer.</span><code><a href="../ipc/TestSimpleRpcServer.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-second even-row-color"><span class="type-name-label">TestTLSHandshadeFailure.</span><code><a href="../ipc/TestTLSHandshadeFailure.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><span class="type-name-label">TestTLSHandshadeFailure.</span><code><a href="../ipc/TestTLSHandshadeFailure.html#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 </div>
 </section>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html
index 0ec40e4f7eb..2724c20f85e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseParameterizedTestTemplate.html
@@ -57,8 +57,10 @@ loadScripts(document, 'script');</script>
 <div class="table-header col-last">Description</div>
 <div class="col-first even-row-color"><a href="#org.apache.hadoop.hbase.io.asyncfs">org.apache.hadoop.hbase.io.asyncfs</a></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><a href="#org.apache.hadoop.hbase.security">org.apache.hadoop.hbase.security</a></div>
+<div class="col-first odd-row-color"><a href="#org.apache.hadoop.hbase.ipc">org.apache.hadoop.hbase.ipc</a></div>
 <div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><a href="#org.apache.hadoop.hbase.security">org.apache.hadoop.hbase.security</a></div>
+<div class="col-last even-row-color">&nbsp;</div>
 </div>
 <section class="class-uses">
 <ul class="block-list">
@@ -77,6 +79,26 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="org.apache.hadoop.hbase.ipc">
+<h2>Uses of <a href="../HBaseParameterizedTestTemplate.html" title="annotation interface in org.apache.hadoop.hbase">HBaseParameterizedTestTemplate</a> in <a href="../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a></h2>
+<div class="caption"><span>Classes in <a href="../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a> with annotations of type <a href="../HBaseParameterizedTestTemplate.html" title="annotation interface in org.apache.hadoop.hbase">HBaseParameterizedTestTemplate</a></span></div>
+<div class="summary-table three-column-summary">
+<div class="table-header col-first">Modifier and Type</div>
+<div class="table-header col-second">Class</div>
+<div class="table-header col-last">Description</div>
+<div class="col-first even-row-color"><code>class&nbsp;</code></div>
+<div class="col-second even-row-color"><code><a href="../ipc/TestBlockingIPC.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+<div class="col-first odd-row-color"><code>class&nbsp;</code></div>
+<div class="col-second odd-row-color"><code><a href="../ipc/TestNettyIPC.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></code></div>
+<div class="col-last odd-row-color">&nbsp;</div>
+<div class="col-first even-row-color"><code>class&nbsp;</code></div>
+<div class="col-second even-row-color"><code><a href="../ipc/TestNettyTlsIPC.html" class="type-name-link" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+</div>
+</section>
+</li>
+<li>
 <section class="detail" id="org.apache.hadoop.hbase.security">
 <h2>Uses of <a href="../HBaseParameterizedTestTemplate.html" title="annotation interface in org.apache.hadoop.hbase">HBaseParameterizedTestTemplate</a> in <a href="../security/package-summary.html">org.apache.hadoop.hbase.security</a></h2>
 <div class="caption"><span>Classes in <a href="../security/package-summary.html">org.apache.hadoop.hbase.security</a> with annotations of type <a href="../HBaseParameterizedTestTemplate.html" title="annotation interface in org.apache.hadoop.hbase">HBaseParameterizedTestTemplate</a></span></div>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html b/testdevapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html
index aeb65b54132..558ad34c304 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/crypto/tls/class-use/X509KeyType.html
@@ -162,13 +162,27 @@ the order they are declared.</div>
 <div class="table-header col-first">Modifier and Type</div>
 <div class="table-header col-second">Field</div>
 <div class="table-header col-last">Description</div>
-<div class="col-first even-row-color"><code><a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
+<div class="col-first even-row-color"><code>private <a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
 <div class="col-second even-row-color"><span class="type-name-label">TestNettyTlsIPC.</span><code><a href="../../../../ipc/TestNettyTlsIPC.html#caKeyType" class="member-name-link">caKeyType</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code><a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
+<div class="col-first odd-row-color"><code>private <a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
 <div class="col-second odd-row-color"><span class="type-name-label">TestNettyTlsIPC.</span><code><a href="../../../../ipc/TestNettyTlsIPC.html#certKeyType" class="member-name-link">certKeyType</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 </div>
+<div class="caption"><span>Constructors in <a href="../../../../ipc/package-summary.html">org.apache.hadoop.hbase.ipc</a> with parameters of type <a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></span></div>
+<div class="summary-table three-column-summary">
+<div class="table-header col-first">Modifier</div>
+<div class="table-header col-second">Constructor</div>
+<div class="table-header col-last">Description</div>
+<div class="col-first even-row-color"><code>&nbsp;</code></div>
+<div class="col-second even-row-color"><code><a href="../../../../ipc/TestNettyTlsIPC.html#%3Cinit%3E(java.lang.Class,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,char%5B%5D,boolean,boolean)" class="member-name-link">TestNettyTlsIPC</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop. [...]
+ <a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a>&nbsp;caKeyType,
+ <a href="../X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a>&nbsp;certKeyType,
+ char[]&nbsp;keyPassword,
+ boolean&nbsp;acceptPlainText,
+ boolean&nbsp;clientTlsEnabled)</code></div>
+<div class="col-last even-row-color">&nbsp;</div>
+</div>
 </section>
 </li>
 <li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html
index dfc15296aa8..7f75ad78593 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html
@@ -85,7 +85,7 @@ loadScripts(document, 'script');</script>
 <dd><a href="AbstractTestIPC.FailingSimpleRpcServer.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC.FailingSimpleRpcServer</a></dd>
 </dl>
 <hr>
-<div class="type-signature"><span class="modifiers">final class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html#line-369">AbstractTestIPC.FailingSimpleRpcServer.FailingConnection</a></span>
+<div class="type-signature"><span class="modifiers">final class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html#line-375">AbstractTestIPC.FailingSimpleRpcServer.FailingConnection</a></span>
 <span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></span></div>
 </section>
 <section class="summary">
@@ -539,7 +539,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="&lt;init&gt;(org.apache.hadoop.hbase.ipc.AbstractTestIPC.FailingSimpleRpcServer,java.nio.channels.SocketChannel,long)">
 <h3>FailingConnection</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html#line-370">FailingConnection</a></span><wbr><span class="parameters">(<a href="AbstractTestIPC.FailingSimpleRpcServer.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC.FailingSimpleRpcServer</a>&nbsp;rpcServer,
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html#line-376">FailingConnection</a></span><wbr><span class="parameters">(<a href="AbstractTestIPC.FailingSimpleRpcServer.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC.FailingSimpleRpcServer</a>&nbsp;rpcServer,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/channels/SocketChannel.html" title="class or interface in java.nio.channels" class="external-link">SocketChannel</a>&nbsp;channel,
  long&nbsp;lastContact)</span></div>
 </section>
@@ -555,7 +555,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="processRequest(org.apache.hadoop.hbase.nio.ByteBuff)">
 <h3>processRequest</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html#line-375">processRequest</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.nio.ByteBuff&nbsp;buf)</span>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html#line-381">processRequest</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.nio.ByteBuff&nbsp;buf)</span>
                     throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/InterruptedException.html" title="class or interface in java.lang" class="external-link">InterruptedException</a></span></div>
 <dl class="notes">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html
index 2d2e56ca805..5375f0b7d2d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html
@@ -89,7 +89,7 @@ loadScripts(document, 'script');</script>
 <dd><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></dd>
 </dl>
 <hr>
-<div class="type-signature"><span class="modifiers">private static class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-361">AbstractTestIPC.FailingSimpleRpcServer</a></span>
+<div class="type-signature"><span class="modifiers">private static class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-366">AbstractTestIPC.FailingSimpleRpcServer</a></span>
 <span class="extends-implements">extends org.apache.hadoop.hbase.ipc.SimpleRpcServer</span></div>
 </section>
 <section class="summary">
@@ -183,7 +183,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="&lt;init&gt;(org.apache.hadoop.hbase.Server,java.lang.String,java.util.List,java.net.InetSocketAddress,org.apache.hadoop.conf.Configuration,org.apache.hadoop.hbase.ipc.RpcScheduler)">
 <h3>FailingSimpleRpcServer</h3>
-<div class="member-signature"><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html#line-363">FailingSimpleRpcServer</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.Server&nbsp;server,
+<div class="member-signature"><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html#line-369">FailingSimpleRpcServer</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.Server&nbsp;server,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;name,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface&gt;&nbsp;services,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/InetSocketAddress.html" title="class or interface in java.net" class="external-link">InetSocketAddress</a>&nbsp;bindAddress,
@@ -207,7 +207,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="getConnection(java.nio.channels.SocketChannel,long)">
 <h3>getConnection</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.SimpleServerRpcConnection</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html#line-383">getConnection</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/channels/SocketChannel.html" title="class or int [...]
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.SimpleServerRpcConnection</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html#line-389">getConnection</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/channels/SocketChannel.html" title="class or int [...]
  long&nbsp;time)</span></div>
 <dl class="notes">
 <dt>Overrides:</dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
index 18f7291f640..034a87332a7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
@@ -81,7 +81,7 @@ loadScripts(document, 'script');</script>
 <dd><code><a href="TestBlockingIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestBlockingIPC</a></code>, <code><a href="TestNettyIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyIPC</a></code>, <code><a href="TestNettyTlsIPC.html" title="class in org.apache.hadoop.hbase.ipc">TestNettyTlsIPC</a></code></dd>
 </dl>
 <hr>
-<div class="type-signature"><span class="modifiers">public abstract class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-113">AbstractTestIPC</a></span>
+<div class="type-signature"><span class="modifiers">public abstract class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-114">AbstractTestIPC</a></span>
 <span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></span></div>
 <div class="block">Some basic ipc tests.</div>
 </section>
@@ -123,11 +123,11 @@ loadScripts(document, 'script');</script>
 <div class="col-first odd-row-color"><code>private static final org.slf4j.Logger</code></div>
 <div class="col-second odd-row-color"><code><a href="#LOG" class="member-name-link">LOG</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;</code></div>
-<div class="col-second even-row-color"><code><a href="#rpcServerImpl" class="member-name-link">rpcServerImpl</a></code></div>
+<div class="col-first even-row-color"><code>private static final io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension</code></div>
+<div class="col-second even-row-color"><code><a href="#OTEL_EXT" class="member-name-link">OTEL_EXT</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule</code></div>
-<div class="col-second odd-row-color"><code><a href="#traceRule" class="member-name-link">traceRule</a></code></div>
+<div class="col-first odd-row-color"><code>private <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;</code></div>
+<div class="col-second odd-row-color"><code><a href="#rpcServerImpl" class="member-name-link">rpcServerImpl</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
 </div>
 </section>
@@ -137,10 +137,12 @@ loadScripts(document, 'script');</script>
 <section class="constructor-summary" id="constructor-summary">
 <h2>Constructor Summary</h2>
 <div class="caption"><span>Constructors</span></div>
-<div class="summary-table two-column-summary">
-<div class="table-header col-first">Constructor</div>
+<div class="summary-table three-column-summary">
+<div class="table-header col-first">Modifier</div>
+<div class="table-header col-second">Constructor</div>
 <div class="table-header col-last">Description</div>
-<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E()" class="member-name-link">AbstractTestIPC</a>()</code></div>
+<div class="col-first even-row-color"><code>protected </code></div>
+<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(java.lang.Class)" class="member-name-link">AbstractTestIPC</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 </div>
 </section>
@@ -313,37 +315,38 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="LOG">
 <h3>LOG</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.slf4j.Logger</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-115">LOG</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.slf4j.Logger</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-116">LOG</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="CELL_BYTES">
 <h3>CELL_BYTES</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-117">CELL_BYTES</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-118">CELL_BYTES</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="CELL">
 <h3>CELL</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.KeyValue</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-118">CELL</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.KeyValue</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-119">CELL</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="CONF">
 <h3>CONF</h3>
-<div class="member-signature"><span class="modifiers">protected static final</span>&nbsp;<span class="return-type">org.apache.hadoop.conf.Configuration</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-120">CONF</a></span></div>
+<div class="member-signature"><span class="modifiers">protected static final</span>&nbsp;<span class="return-type">org.apache.hadoop.conf.Configuration</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-121">CONF</a></span></div>
 </section>
 </li>
 <li>
-<section class="detail" id="traceRule">
-<h3>traceRule</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-135">traceRule</a></span></div>
+<section class="detail" id="OTEL_EXT">
+<h3>OTEL_EXT</h3>
+<div class="member-signature"><span class="annotations">@RegisterExtension
+</span><span class="modifiers">private static final</span>&nbsp;<span class="return-type">io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-136">OTEL_EXT</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="rpcServerImpl">
 <h3>rpcServerImpl</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-138">rpcServerImpl</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-139">rpcServerImpl</a></span></div>
 </section>
 </li>
 </ul>
@@ -355,9 +358,9 @@ loadScripts(document, 'script');</script>
 <h2>Constructor Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="&lt;init&gt;()">
+<section class="detail" id="&lt;init&gt;(java.lang.Class)">
 <h3>AbstractTestIPC</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-113">AbstractTestIPC</a></span>()</div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-141">AbstractTestIPC</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl)</ [...]
 </section>
 </li>
 </ul>
@@ -371,7 +374,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcServer(org.apache.hadoop.hbase.Server,java.lang.String,java.util.List,java.net.InetSocketAddress,org.apache.hadoop.conf.Configuration,org.apache.hadoop.hbase.ipc.RpcScheduler)">
 <h3>createRpcServer</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.RpcServer</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-122">createRpcServer</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.Server&nbsp;server,
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.RpcServer</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-123">createRpcServer</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.Server&nbsp;server,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;name,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface&gt;&nbsp;services,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/InetSocketAddress.html" title="class or interface in java.net" class="external-link">InetSocketAddress</a>&nbsp;bindAddress,
@@ -387,7 +390,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcServer(java.lang.String,java.util.List,java.net.InetSocketAddress,org.apache.hadoop.conf.Configuration,org.apache.hadoop.hbase.ipc.RpcScheduler)">
 <h3>createRpcServer</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.RpcServer</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-128">createRpcServer</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>& [...]
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.RpcServer</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-129">createRpcServer</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>& [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface&gt;&nbsp;services,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/InetSocketAddress.html" title="class or interface in java.net" class="external-link">InetSocketAddress</a>&nbsp;bindAddress,
  org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -402,19 +405,21 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcClientNoCodec(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClientNoCodec</h3>
-<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-133">createRpcClientNoCodec</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-134">createRpcClientNoCodec</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="setUpBeforeTest()">
 <h3>setUpBeforeTest</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-141">setUpBeforeTest</a></span>()</div>
+<div class="member-signature"><span class="annotations">@BeforeEach
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-145">setUpBeforeTest</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="testNoCodec()">
 <h3>testNoCodec</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-149">testNoCodec</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-153">testNoCodec</a></span>()
                  throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <div class="block">Ensure we do not HAVE TO HAVE a codec.</div>
@@ -428,13 +433,14 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="createRpcClient(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClient</h3>
-<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-168">createRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-172">createRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="testCompressCellBlock()">
 <h3>testCompressCellBlock</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-175">testCompressCellBlock</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-179">testCompressCellBlock</a></span>()
                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <div class="block">It is hard to verify the compression is actually happening under the wraps. Hope that if
@@ -450,7 +456,7 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="createRpcClientRTEDuringConnectionSetup(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClientRTEDuringConnectionSetup</h3>
-<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-209">createRpcClientRTEDuringConnectionSetup</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span>
+<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-213">createRpcClientRTEDuringConnectionSetup</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span>
                                                                                                      throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -461,7 +467,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testRTEDuringConnectionSetup()">
 <h3>testRTEDuringConnectionSetup</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-212">testRTEDuringConnectionSetup</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-216">testRTEDuringConnectionSetup</a></span>()
                                   throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -472,7 +479,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testRpcScheduler()">
 <h3>testRpcScheduler</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-234">testRpcScheduler</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-238">testRpcScheduler</a></span>()
                       throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException,
 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/InterruptedException.html" title="class or interface in java.lang" class="external-link">InterruptedException</a></span></div>
@@ -488,7 +496,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException,
 <li>
 <section class="detail" id="testRpcMaxRequestSize()">
 <h3>testRpcMaxRequestSize</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-258">testRpcMaxRequestSize</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-262">testRpcMaxRequestSize</a></span>()
                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <div class="block">Tests that the rpc scheduler is called when requests arrive.</div>
@@ -502,7 +511,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testRpcServerForNotNullRemoteAddressInCallObject()">
 <h3>testRpcServerForNotNullRemoteAddressInCallObject</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-290">testRpcServerForNotNullRemoteAddressInCallObject</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-294">testRpcServerForNotNullRemoteAddressInCallObject</a></span>()
                                                       throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <div class="block">Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null
@@ -517,7 +527,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testRemoteError()">
 <h3>testRemoteError</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-308">testRemoteError</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-312">testRemoteError</a></span>()
                      throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <dl class="notes">
@@ -530,7 +541,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testTimeout()">
 <h3>testTimeout</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-328">testTimeout</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-332">testTimeout</a></span>()
                  throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -541,7 +553,7 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="createTestFailingRpcServer(java.lang.String,java.util.List,java.net.InetSocketAddress,org.apache.hadoop.conf.Configuration,org.apache.hadoop.hbase.ipc.RpcScheduler)">
 <h3>createTestFailingRpcServer</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.RpcServer</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-389">createTestFailingRpcServer</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link [...]
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.RpcServer</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-395">createTestFailingRpcServer</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface&gt;&nbsp;services,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/InetSocketAddress.html" title="class or interface in java.net" class="external-link">InetSocketAddress</a>&nbsp;bindAddress,
  org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -556,7 +568,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testConnectionCloseWithOutstandingRPCs()">
 <h3>testConnectionCloseWithOutstandingRPCs</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-400">testConnectionCloseWithOutstandingRPCs</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-406">testConnectionCloseWithOutstandingRPCs</a></span>()
                                             throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/InterruptedException.html" title="class or interface in java.lang" class="external-link">InterruptedException</a>,
 <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <div class="block">Tests that the connection closing is handled by the client with outstanding RPC calls</div>
@@ -570,7 +583,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testAsyncEcho()">
 <h3>testAsyncEcho</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-420">testAsyncEcho</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-424">testAsyncEcho</a></span>()
                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -581,7 +595,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testAsyncRemoteError()">
 <h3>testAsyncRemoteError</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-451">testAsyncRemoteError</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-455">testAsyncRemoteError</a></span>()
                           throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -592,7 +607,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testAsyncTimeout()">
 <h3>testAsyncTimeout</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-476">testAsyncTimeout</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-478">testAsyncTimeout</a></span>()
                       throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -603,34 +619,34 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="waitSpan(org.hamcrest.Matcher)">
 <h3>waitSpan</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">io.opentelemetry.sdk.trace.data.SpanData</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-515">waitSpan</a></span><wbr><span class="parameters">(org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;&nbsp;matcher)</span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">io.opentelemetry.sdk.trace.data.SpanData</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-520">waitSpan</a></span><wbr><span class="parameters">(org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;&nbsp;matcher)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="buildIpcSpanName(java.lang.String,java.lang.String)">
 <h3>buildIpcSpanName</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-522">buildIpcSpanName</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.c [...]
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-526">buildIpcSpanName</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.c [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="buildIpcClientSpanMatcher(java.lang.String,java.lang.String)">
 <h3>buildIpcClientSpanMatcher</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-526">buildIpcClientSpanMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface [...]
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-530">buildIpcClientSpanMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="buildIpcServerSpanMatcher(java.lang.String,java.lang.String)">
 <h3>buildIpcServerSpanMatcher</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-532">buildIpcServerSpanMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface [...]
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-536">buildIpcServerSpanMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="buildIpcClientSpanAttributesMatcher(java.lang.String,java.lang.String,java.net.InetSocketAddress)">
 <h3>buildIpcClientSpanAttributesMatcher</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-538">buildIpcClientSpanAttributesMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or [...]
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-542">buildIpcClientSpanAttributesMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName,
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/InetSocketAddress.html" title="class or interface in java.net" class="external-link">InetSocketAddress</a>&nbsp;isa)</span></div>
 </section>
@@ -638,20 +654,21 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="buildIpcServerSpanAttributesMatcher(java.lang.String,java.lang.String)">
 <h3>buildIpcServerSpanAttributesMatcher</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-546">buildIpcServerSpanAttributesMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or [...]
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.hamcrest.Matcher&lt;io.opentelemetry.sdk.trace.data.SpanData&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-550">buildIpcServerSpanAttributesMatcher</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;methodName)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="assertRemoteSpan()">
 <h3>assertRemoteSpan</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-552">assertRemoteSpan</a></span>()</div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-556">assertRemoteSpan</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="testTracingSuccessIpc()">
 <h3>testTracingSuccessIpc</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-558">testTracingSuccessIpc</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-562">testTracingSuccessIpc</a></span>()
                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <dl class="notes">
@@ -664,7 +681,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testTracingErrorIpc()">
 <h3>testTracingErrorIpc</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-589">testTracingErrorIpc</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-593">testTracingErrorIpc</a></span>()
                          throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -675,19 +693,20 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="createBadAuthRpcClient(org.apache.hadoop.conf.Configuration)">
 <h3>createBadAuthRpcClient</h3>
-<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-619">createBadAuthRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected abstract</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-623">createBadAuthRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="doBadPreableHeaderCall(org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface)">
 <h3>doBadPreableHeaderCall</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-621">doBadPreableHeaderCall</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.s [...]
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-625">doBadPreableHeaderCall</a></span><wbr><span class="parameters">(org.apache.hadoop.hbase.s [...]
 </section>
 </li>
 <li>
 <section class="detail" id="testBadPreambleHeader()">
 <h3>testBadPreambleHeader</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-627">testBadPreambleHeader</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-631">testBadPreambleHeader</a></span>()
                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -698,7 +717,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testGetConnectionRegistry()">
 <h3>testGetConnectionRegistry</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-657">testGetConnectionRegistry</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-661">testGetConnectionRegistry</a></span>()
                                throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <div class="block">Testcase for getting connection registry information through connection preamble header, see
@@ -713,7 +733,8 @@ org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <li>
 <section class="detail" id="testGetConnectionRegistryError()">
 <h3>testGetConnectionRegistryError</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-687">testGetConnectionRegistryError</a></span>()
+<div class="member-signature"><span class="annotations">@TestTemplate
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line-691">testGetConnectionRegistryError</a></span>()
                                     throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 org.apache.hbase.thirdparty.com.google.protobuf.ServiceException</span></div>
 <div class="block">Test server does not support getting connection registry information through connection
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
index 783c31eb6cc..304e9c975c4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
@@ -52,7 +52,7 @@ loadScripts(document, 'script');</script>
 </ul>
 <ul class="sub-nav-list">
 <li>Detail:&nbsp;</li>
-<li><a href="#field-detail">Field</a>&nbsp;|&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
 <li><a href="#constructor-detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method-detail">Method</a></li>
 </ul>
@@ -79,7 +79,8 @@ loadScripts(document, 'script');</script>
 </div>
 <section class="class-description" id="class-description">
 <hr>
-<div class="type-signature"><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-34">TestBlockingIPC</a></span>
+<div class="type-signature"><span class="annotations">@Tag("org.apache.hadoop.hbase.testclassification.RPCTests") @Tag("org.apache.hadoop.hbase.testclassification.MediumTests")
+</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-30">TestBlockingIPC</a></span>
 <span class="extends-implements">extends <a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></span></div>
 </section>
 <section class="summary">
@@ -88,18 +89,9 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="field-summary" id="field-summary">
 <h2>Field Summary</h2>
-<div class="caption"><span>Fields</span></div>
-<div class="summary-table three-column-summary">
-<div class="table-header col-first">Modifier and Type</div>
-<div class="table-header col-second">Field</div>
-<div class="table-header col-last">Description</div>
-<div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><code><a href="#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
-<div class="col-last even-row-color">&nbsp;</div>
-</div>
 <div class="inherited-list">
 <h3 id="fields-inherited-from-class-org.apache.hadoop.hbase.ipc.AbstractTestIPC">Fields inherited from class&nbsp;org.apache.hadoop.hbase.ipc.<a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></h3>
-<code><a href="AbstractTestIPC.html#CONF">CONF</a>, <a href="AbstractTestIPC.html#rpcServerImpl">rpcServerImpl</a>, <a href="AbstractTestIPC.html#traceRule">traceRule</a></code></div>
+<code><a href="AbstractTestIPC.html#CONF">CONF</a></code></div>
 </section>
 </li>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
@@ -110,7 +102,7 @@ loadScripts(document, 'script');</script>
 <div class="summary-table two-column-summary">
 <div class="table-header col-first">Constructor</div>
 <div class="table-header col-last">Description</div>
-<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E()" class="member-name-link">TestBlockingIPC</a>()</code></div>
+<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(java.lang.Class)" class="member-name-link">TestBlockingIPC</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 </div>
 </section>
@@ -138,8 +130,8 @@ loadScripts(document, 'script');</script>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected org.apache.hadoop.hbase.ipc.BlockingRpcClient</code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#createRpcClientRTEDuringConnectionSetup(org.apache.hadoop.conf.Configuration)" class="member-name-link">createRpcClientRTEDuringConnectionSetup</a><wbr>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>[]&gt;</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#data()" class="member-name-link">data</a>()</code></div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html" title="class or interface in java.util.stream" class="external-link">Stream</a>&lt;org.junit.jupiter.params.provider.Arguments&gt;</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parameters()" class="member-name-link">parameters</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">&nbsp;</div>
 </div>
 </div>
@@ -156,29 +148,15 @@ loadScripts(document, 'script');</script>
 </section>
 <section class="details">
 <ul class="details-list">
-<!-- ============ FIELD DETAIL =========== -->
-<li>
-<section class="field-details" id="field-detail">
-<h2>Field Details</h2>
-<ul class="member-list">
-<li>
-<section class="detail" id="CLASS_RULE">
-<h3>CLASS_RULE</h3>
-<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-38">CLASS_RULE</a></span></div>
-</section>
-</li>
-</ul>
-</section>
-</li>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
 <li>
 <section class="constructor-details" id="constructor-detail">
 <h2>Constructor Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="&lt;init&gt;()">
+<section class="detail" id="&lt;init&gt;(java.lang.Class)">
 <h3>TestBlockingIPC</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-36">TestBlockingIPC</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-35">TestBlockingIPC</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl)</span></div>
 </section>
 </li>
 </ul>
@@ -190,15 +168,15 @@ loadScripts(document, 'script');</script>
 <h2>Method Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="data()">
-<h3>data</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>[]&gt;</span>&nbsp;<span class="element-name"><a href=". [...]
+<section class="detail" id="parameters()">
+<h3>parameters</h3>
+<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html" title="class or interface in java.util.stream" class="external-link">Stream</a>&lt;org.junit.jupiter.params.provider.Arguments&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-39">parameters</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="createRpcClientNoCodec(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClientNoCodec</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.BlockingRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-48">createRpcClientNoCodec</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.BlockingRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-43">createRpcClientNoCodec</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createRpcClientNoCodec(org.apache.hadoop.conf.Configuration)">createRpcClientNoCodec</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
@@ -208,7 +186,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcClient(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClient</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.BlockingRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-58">createRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.BlockingRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-53">createRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createRpcClient(org.apache.hadoop.conf.Configuration)">createRpcClient</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
@@ -218,7 +196,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcClientRTEDuringConnectionSetup(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClientRTEDuringConnectionSetup</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.BlockingRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-63">createRpcClientRTEDuringConnectionSetup</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.BlockingRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-58">createRpcClientRTEDuringConnectionSetup</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span>
                                                                                          throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
@@ -231,7 +209,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createBadAuthRpcClient(org.apache.hadoop.conf.Configuration)">
 <h3>createBadAuthRpcClient</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-75">createBadAuthRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html#line-70">createBadAuthRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createBadAuthRpcClient(org.apache.hadoop.conf.Configuration)">createBadAuthRpcClient</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
index 0f8202ce6ae..637a1a22afb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
@@ -79,7 +79,8 @@ loadScripts(document, 'script');</script>
 </div>
 <section class="class-description" id="class-description">
 <hr>
-<div class="type-signature"><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-43">TestNettyIPC</a></span>
+<div class="type-signature"><span class="annotations">@Tag("org.apache.hadoop.hbase.testclassification.RPCTests") @Tag("org.apache.hadoop.hbase.testclassification.MediumTests")
+</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-40">TestNettyIPC</a></span>
 <span class="extends-implements">extends <a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></span></div>
 </section>
 <section class="summary">
@@ -93,22 +94,19 @@ loadScripts(document, 'script');</script>
 <div class="table-header col-first">Modifier and Type</div>
 <div class="table-header col-second">Field</div>
 <div class="table-header col-last">Description</div>
-<div class="col-first even-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second even-row-color"><code><a href="#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-first even-row-color"><code>private static org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup</code></div>
+<div class="col-second even-row-color"><code><a href="#EPOLL" class="member-name-link">EPOLL</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private static org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup</code></div>
-<div class="col-second odd-row-color"><code><a href="#EPOLL" class="member-name-link">EPOLL</a></code></div>
+<div class="col-first odd-row-color"><code>private <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
+<div class="col-second odd-row-color"><code><a href="#eventLoopType" class="member-name-link">eventLoopType</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></code></div>
-<div class="col-second even-row-color"><code><a href="#eventLoopType" class="member-name-link">eventLoopType</a></code></div>
+<div class="col-first even-row-color"><code>private static org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup</code></div>
+<div class="col-second even-row-color"><code><a href="#NIO" class="member-name-link">NIO</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private static org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup</code></div>
-<div class="col-second odd-row-color"><code><a href="#NIO" class="member-name-link">NIO</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 </div>
 <div class="inherited-list">
 <h3 id="fields-inherited-from-class-org.apache.hadoop.hbase.ipc.AbstractTestIPC">Fields inherited from class&nbsp;org.apache.hadoop.hbase.ipc.<a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></h3>
-<code><a href="AbstractTestIPC.html#CONF">CONF</a>, <a href="AbstractTestIPC.html#rpcServerImpl">rpcServerImpl</a>, <a href="AbstractTestIPC.html#traceRule">traceRule</a></code></div>
+<code><a href="AbstractTestIPC.html#CONF">CONF</a></code></div>
 </section>
 </li>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
@@ -119,7 +117,8 @@ loadScripts(document, 'script');</script>
 <div class="summary-table two-column-summary">
 <div class="table-header col-first">Constructor</div>
 <div class="table-header col-last">Description</div>
-<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E()" class="member-name-link">TestNettyIPC</a>()</code></div>
+<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(java.lang.Class,java.lang.String)" class="member-name-link">TestNettyIPC</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;eventLoopType)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 </div>
 </section>
@@ -150,7 +149,7 @@ loadScripts(document, 'script');</script>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>private static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;</code></div>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#getEventLoopTypes()" class="member-name-link">getEventLoopTypes</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>[]&gt;</code></div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html" title="class or interface in java.util.stream" class="external-link">Stream</a>&lt;org.junit.jupiter.params.provider.Arguments&gt;</code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parameters()" class="member-name-link">parameters</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>private void</code></div>
@@ -183,27 +182,21 @@ loadScripts(document, 'script');</script>
 <h2>Field Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="CLASS_RULE">
-<h3>CLASS_RULE</h3>
-<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-47">CLASS_RULE</a></span></div>
-</section>
-</li>
-<li>
 <section class="detail" id="eventLoopType">
 <h3>eventLoopType</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-71">eventLoopType</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-64">eventLoopType</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="NIO">
 <h3>NIO</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-74">NIO</a></span></div>
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-71">NIO</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="EPOLL">
 <h3>EPOLL</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-76">EPOLL</a></span></div>
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-73">EPOLL</a></span></div>
 </section>
 </li>
 </ul>
@@ -215,9 +208,10 @@ loadScripts(document, 'script');</script>
 <h2>Constructor Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="&lt;init&gt;()">
+<section class="detail" id="&lt;init&gt;(java.lang.Class,java.lang.String)">
 <h3>TestNettyIPC</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-45">TestNettyIPC</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-66">TestNettyIPC</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl,
+ <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;eventLoopType)</span></div>
 </section>
 </li>
 </ul>
@@ -231,37 +225,39 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="getEventLoopTypes()">
 <h3>getEventLoopTypes</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;</span>&nbsp;<span class="element-name"><a href=".. [...]
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&gt;</span>&nbsp;<span class="element-name"><a href=".. [...]
 </section>
 </li>
 <li>
 <section class="detail" id="parameters()">
 <h3>parameters</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>[]&gt;</span>&nbsp;<span class="element-name"><a href=". [...]
+<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html" title="class or interface in java.util.stream" class="external-link">Stream</a>&lt;org.junit.jupiter.params.provider.Arguments&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-55">parameters</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="setUpBeforeClass()">
 <h3>setUpBeforeClass</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-78">setUpBeforeClass</a></span>()</div>
+<div class="member-signature"><span class="annotations">@BeforeAll
+</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-75">setUpBeforeClass</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="tearDownAfterClass()">
 <h3>tearDownAfterClass</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-86">tearDownAfterClass</a></span>()</div>
+<div class="member-signature"><span class="annotations">@AfterAll
+</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-83">tearDownAfterClass</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="setConf(org.apache.hadoop.conf.Configuration)">
 <h3>setConf</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-96">setConf</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-93">setConf</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="createRpcClientNoCodec(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClientNoCodec</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.NettyRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-112">createRpcClientNoCodec</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.NettyRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-109">createRpcClientNoCodec</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createRpcClientNoCodec(org.apache.hadoop.conf.Configuration)">createRpcClientNoCodec</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
@@ -271,7 +267,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcClient(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClient</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.NettyRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-125">createRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.NettyRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-122">createRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createRpcClient(org.apache.hadoop.conf.Configuration)">createRpcClient</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
@@ -281,7 +277,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createRpcClientRTEDuringConnectionSetup(org.apache.hadoop.conf.Configuration)">
 <h3>createRpcClientRTEDuringConnectionSetup</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.NettyRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-131">createRpcClientRTEDuringConnectionSetup</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.NettyRpcClient</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-128">createRpcClientRTEDuringConnectionSetup</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createRpcClientRTEDuringConnectionSetup(org.apache.hadoop.conf.Configuration)">createRpcClientRTEDuringConnectionSetup</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
@@ -291,7 +287,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="createBadAuthRpcClient(org.apache.hadoop.conf.Configuration)">
 <h3>createBadAuthRpcClient</h3>
-<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-143">createBadAuthRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
+<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.ipc.AbstractRpcClient&lt;?&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html#line-140">createBadAuthRpcClient</a></span><wbr><span class="parameters">(org.apache.hadoop.conf.Configuration&nbsp;conf)</span></div>
 <dl class="notes">
 <dt>Specified by:</dt>
 <dd><code><a href="AbstractTestIPC.html#createBadAuthRpcClient(org.apache.hadoop.conf.Configuration)">createBadAuthRpcClient</a></code>&nbsp;in class&nbsp;<code><a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></code></dd>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
index 2f581957222..7fecd9ea9ff 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
@@ -79,7 +79,8 @@ loadScripts(document, 'script');</script>
 </div>
 <section class="class-description" id="class-description">
 <hr>
-<div class="type-signature"><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-56">TestNettyTlsIPC</a></span>
+<div class="type-signature"><span class="annotations">@Tag("org.apache.hadoop.hbase.testclassification.RPCTests") @Tag("org.apache.hadoop.hbase.testclassification.MediumTests")
+</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-55">TestNettyTlsIPC</a></span>
 <span class="extends-implements">extends <a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></span></div>
 </section>
 <section class="summary">
@@ -93,40 +94,37 @@ loadScripts(document, 'script');</script>
 <div class="table-header col-first">Modifier and Type</div>
 <div class="table-header col-second">Field</div>
 <div class="table-header col-last">Description</div>
-<div class="col-first even-row-color"><code>boolean</code></div>
+<div class="col-first even-row-color"><code>private boolean</code></div>
 <div class="col-second even-row-color"><code><a href="#acceptPlainText" class="member-name-link">acceptPlainText</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code><a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
+<div class="col-first odd-row-color"><code>private <a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
 <div class="col-second odd-row-color"><code><a href="#caKeyType" class="member-name-link">caKeyType</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code><a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
+<div class="col-first even-row-color"><code>private <a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></code></div>
 <div class="col-second even-row-color"><code><a href="#certKeyType" class="member-name-link">certKeyType</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>static final <a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></div>
-<div class="col-second odd-row-color"><code><a href="#CLASS_RULE" class="member-name-link">CLASS_RULE</a></code></div>
+<div class="col-first odd-row-color"><code>private boolean</code></div>
+<div class="col-second odd-row-color"><code><a href="#clientTlsEnabled" class="member-name-link">clientTlsEnabled</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>boolean</code></div>
-<div class="col-second even-row-color"><code><a href="#clientTlsEnabled" class="member-name-link">clientTlsEnabled</a></code></div>
+<div class="col-first even-row-color"><code>private static org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig</code></div>
+<div class="col-second even-row-color"><code><a href="#EVENT_LOOP_GROUP_CONFIG" class="member-name-link">EVENT_LOOP_GROUP_CONFIG</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private static org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig</code></div>
-<div class="col-second odd-row-color"><code><a href="#EVENT_LOOP_GROUP_CONFIG" class="member-name-link">EVENT_LOOP_GROUP_CONFIG</a></code></div>
+<div class="col-first odd-row-color"><code>private char[]</code></div>
+<div class="col-second odd-row-color"><code><a href="#keyPassword" class="member-name-link">keyPassword</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>char[]</code></div>
-<div class="col-second even-row-color"><code><a href="#keyPassword" class="member-name-link">keyPassword</a></code></div>
+<div class="col-first even-row-color"><code>private static <a href="../io/crypto/tls/X509TestContextProvider.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContextProvider</a></code></div>
+<div class="col-second even-row-color"><code><a href="#PROVIDER" class="member-name-link">PROVIDER</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private static <a href="../io/crypto/tls/X509TestContextProvider.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContextProvider</a></code></div>
-<div class="col-second odd-row-color"><code><a href="#PROVIDER" class="member-name-link">PROVIDER</a></code></div>
+<div class="col-first odd-row-color"><code>private static final <a href="../HBaseCommonTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtil</a></code></div>
+<div class="col-second odd-row-color"><code><a href="#UTIL" class="member-name-link">UTIL</a></code></div>
 <div class="col-last odd-row-color">&nbsp;</div>
-<div class="col-first even-row-color"><code>private static final <a href="../HBaseCommonTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtil</a></code></div>
-<div class="col-second even-row-color"><code><a href="#UTIL" class="member-name-link">UTIL</a></code></div>
+<div class="col-first even-row-color"><code>private <a href="../io/crypto/tls/X509TestContext.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContext</a></code></div>
+<div class="col-second even-row-color"><code><a href="#x509TestContext" class="member-name-link">x509TestContext</a></code></div>
 <div class="col-last even-row-color">&nbsp;</div>
-<div class="col-first odd-row-color"><code>private <a href="../io/crypto/tls/X509TestContext.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContext</a></code></div>
-<div class="col-second odd-row-color"><code><a href="#x509TestContext" class="member-name-link">x509TestContext</a></code></div>
-<div class="col-last odd-row-color">&nbsp;</div>
 </div>
 <div class="inherited-list">
 <h3 id="fields-inherited-from-class-org.apache.hadoop.hbase.ipc.AbstractTestIPC">Fields inherited from class&nbsp;org.apache.hadoop.hbase.ipc.<a href="AbstractTestIPC.html" title="class in org.apache.hadoop.hbase.ipc">AbstractTestIPC</a></h3>
-<code><a href="AbstractTestIPC.html#CONF">CONF</a>, <a href="AbstractTestIPC.html#rpcServerImpl">rpcServerImpl</a>, <a href="AbstractTestIPC.html#traceRule">traceRule</a></code></div>
+<code><a href="AbstractTestIPC.html#CONF">CONF</a></code></div>
 </section>
 </li>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
@@ -137,7 +135,12 @@ loadScripts(document, 'script');</script>
 <div class="summary-table two-column-summary">
 <div class="table-header col-first">Constructor</div>
 <div class="table-header col-last">Description</div>
-<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E()" class="member-name-link">TestNettyTlsIPC</a>()</code></div>
+<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(java.lang.Class,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,char%5B%5D,boolean,boolean)" class="member-name-link">TestNettyTlsIPC</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nb [...]
+ <a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a>&nbsp;caKeyType,
+ <a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a>&nbsp;certKeyType,
+ char[]&nbsp;keyPassword,
+ boolean&nbsp;acceptPlainText,
+ boolean&nbsp;clientTlsEnabled)</code></div>
 <div class="col-last even-row-color">&nbsp;</div>
 </div>
 </section>
@@ -180,8 +183,8 @@ loadScripts(document, 'script');</script>
  org.apache.hadoop.conf.Configuration&nbsp;conf,
  org.apache.hadoop.hbase.ipc.RpcScheduler&nbsp;scheduler)</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>[]&gt;</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#data()" class="member-name-link">data</a>()</code></div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html" title="class or interface in java.util.stream" class="external-link">Stream</a>&lt;org.junit.jupiter.params.provider.Arguments&gt;</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#parameters()" class="member-name-link">parameters</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
 <div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#setUp()" class="member-name-link">setUp</a>()</code></div>
@@ -216,63 +219,57 @@ loadScripts(document, 'script');</script>
 <h2>Field Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="CLASS_RULE">
-<h3>CLASS_RULE</h3>
-<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="../HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-60">CLASS_RULE</a></span></div>
-</section>
-</li>
-<li>
 <section class="detail" id="UTIL">
 <h3>UTIL</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type"><a href="../HBaseCommonTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtil</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-64">UTIL</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type"><a href="../HBaseCommonTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtil</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-61">UTIL</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="PROVIDER">
 <h3>PROVIDER</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509TestContextProvider.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContextProvider</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-66">PROVIDER</a></span></div>
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509TestContextProvider.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContextProvider</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-63">PROVIDER</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="EVENT_LOOP_GROUP_CONFIG">
 <h3>EVENT_LOOP_GROUP_CONFIG</h3>
-<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-68">EVENT_LOOP_GROUP_CONFIG</a></span></div>
+<div class="member-signature"><span class="modifiers">private static</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-65">EVENT_LOOP_GROUP_CONFIG</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="caKeyType">
 <h3>caKeyType</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-70">caKeyType</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-67">caKeyType</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="certKeyType">
 <h3>certKeyType</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-73">certKeyType</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-69">certKeyType</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="keyPassword">
 <h3>keyPassword</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">char[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-76">keyPassword</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">char[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-71">keyPassword</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="acceptPlainText">
 <h3>acceptPlainText</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-79">acceptPlainText</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-73">acceptPlainText</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="clientTlsEnabled">
 <h3>clientTlsEnabled</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-82">clientTlsEnabled</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-75">clientTlsEnabled</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="x509TestContext">
 <h3>x509TestContext</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509TestContext.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContext</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-85">x509TestContext</a></span></div>
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type"><a href="../io/crypto/tls/X509TestContext.html" title="class in org.apache.hadoop.hbase.io.crypto.tls">X509TestContext</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-88">x509TestContext</a></span></div>
 </section>
 </li>
 </ul>
@@ -284,9 +281,14 @@ loadScripts(document, 'script');</script>
 <h2>Constructor Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="&lt;init&gt;()">
+<section class="detail" id="&lt;init&gt;(java.lang.Class,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,org.apache.hadoop.hbase.io.crypto.tls.X509KeyType,char[],boolean,boolean)">
 <h3>TestNettyTlsIPC</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-58">TestNettyTlsIPC</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-77">TestNettyTlsIPC</a></span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Class.html" title="class or interface in java.lang" class="external-link">Class</a>&lt;? extends org.apache.hadoop.hbase.ipc.RpcServer&gt;&nbsp;rpcServerImpl,
+ <a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a>&nbsp;caKeyType,
+ <a href="../io/crypto/tls/X509KeyType.html" title="enum class in org.apache.hadoop.hbase.io.crypto.tls">X509KeyType</a>&nbsp;certKeyType,
+ char[]&nbsp;keyPassword,
+ boolean&nbsp;acceptPlainText,
+ boolean&nbsp;clientTlsEnabled)</span></div>
 </section>
 </li>
 </ul>
@@ -298,15 +300,16 @@ loadScripts(document, 'script');</script>
 <h2>Method Details</h2>
 <ul class="member-list">
 <li>
-<section class="detail" id="data()">
-<h3>data</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>[]&gt;</span>&nbsp;<span class="element-name"><a href=". [...]
+<section class="detail" id="parameters()">
+<h3>parameters</h3>
+<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html" title="class or interface in java.util.stream" class="external-link">Stream</a>&lt;org.junit.jupiter.params.provider.Arguments&gt;</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-91">parameters</a></span>()</div>
 </section>
 </li>
 <li>
 <section class="detail" id="setUpBeforeClass()">
 <h3>setUpBeforeClass</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-111">setUpBeforeClass</a></span>()
+<div class="member-signature"><span class="annotations">@BeforeAll
+</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-111">setUpBeforeClass</a></span>()
                              throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -317,7 +320,8 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="tearDownAfterClass()">
 <h3>tearDownAfterClass</h3>
-<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-124">tearDownAfterClass</a></span>()
+<div class="member-signature"><span class="annotations">@AfterAll
+</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-124">tearDownAfterClass</a></span>()
                                throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/InterruptedException.html" title="class or interface in java.lang" class="external-link">InterruptedException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -328,7 +332,8 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="setUp()">
 <h3>setUp</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-131">setUp</a></span>()
+<div class="member-signature"><span class="annotations">@BeforeEach
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-131">setUp</a></span>()
            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -339,7 +344,8 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="tearDown()">
 <h3>tearDown</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-139">tearDown</a></span>()</div>
+<div class="member-signature"><span class="annotations">@AfterEach
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html#line-139">tearDown</a></span>()</div>
 </section>
 </li>
 <li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-use.html b/testdevapidocs/org/apache/hadoop/hbase/package-use.html
index 00b36ee2349..f147ca09214 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-use.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-use.html
@@ -1435,12 +1435,16 @@ loadScripts(document, 'script');</script>
 <div class="col-last odd-row-color">
 <div class="block">Common helpers for testing HBase that do not depend on specific server/etc.</div>
 </div>
-<div class="col-first even-row-color"><a href="class-use/HBaseTestingUtil.html#org.apache.hadoop.hbase.ipc">HBaseTestingUtil</a></div>
+<div class="col-first even-row-color"><a href="class-use/HBaseParameterizedTestTemplate.html#org.apache.hadoop.hbase.ipc">HBaseParameterizedTestTemplate</a></div>
 <div class="col-last even-row-color">
-<div class="block">Facility for testing HBase.</div>
+<div class="block">The annotation for running JUnit4 like parameterized tests with JUnit5.</div>
 </div>
-<div class="col-first odd-row-color"><a href="class-use/TableNameTestRule.html#org.apache.hadoop.hbase.ipc">TableNameTestRule</a></div>
+<div class="col-first odd-row-color"><a href="class-use/HBaseTestingUtil.html#org.apache.hadoop.hbase.ipc">HBaseTestingUtil</a></div>
 <div class="col-last odd-row-color">
+<div class="block">Facility for testing HBase.</div>
+</div>
+<div class="col-first even-row-color"><a href="class-use/TableNameTestRule.html#org.apache.hadoop.hbase.ipc">TableNameTestRule</a></div>
+<div class="col-last even-row-color">
 <div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
 </div>
 </div>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html
index 9b5e4e8eeab..7bfeffa53f4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.FailingConnection.html
@@ -40,691 +40,695 @@
 <span class="source-line-no">027</span><span id="line-27">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;</span>
 <span class="source-line-no">028</span><span id="line-28">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newBlockingStub;</span>
 <span class="source-line-no">029</span><span id="line-29">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newStub;</span>
-<span class="source-line-no">030</span><span id="line-30">import static org.hamcrest.MatcherAssert.assertThat;</span>
-<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.Matchers.allOf;</span>
-<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.containsString;</span>
-<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.everyItem;</span>
-<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
-<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.hasItem;</span>
-<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.instanceOf;</span>
-<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.startsWith;</span>
-<span class="source-line-no">038</span><span id="line-38">import static org.junit.Assert.assertEquals;</span>
-<span class="source-line-no">039</span><span id="line-39">import static org.junit.Assert.assertFalse;</span>
-<span class="source-line-no">040</span><span id="line-40">import static org.junit.Assert.assertNotNull;</span>
-<span class="source-line-no">041</span><span id="line-41">import static org.junit.Assert.assertNull;</span>
-<span class="source-line-no">042</span><span id="line-42">import static org.junit.Assert.assertThrows;</span>
-<span class="source-line-no">043</span><span id="line-43">import static org.junit.Assert.assertTrue;</span>
-<span class="source-line-no">044</span><span id="line-44">import static org.junit.Assert.fail;</span>
-<span class="source-line-no">045</span><span id="line-45">import static org.mockito.ArgumentMatchers.any;</span>
-<span class="source-line-no">046</span><span id="line-46">import static org.mockito.Mockito.mock;</span>
-<span class="source-line-no">047</span><span id="line-47">import static org.mockito.Mockito.spy;</span>
-<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.verify;</span>
-<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.when;</span>
-<span class="source-line-no">050</span><span id="line-50">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
-<span class="source-line-no">051</span><span id="line-51"></span>
-<span class="source-line-no">052</span><span id="line-52">import io.opentelemetry.api.common.AttributeKey;</span>
-<span class="source-line-no">053</span><span id="line-53">import io.opentelemetry.api.trace.SpanKind;</span>
-<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.trace.StatusCode;</span>
-<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;</span>
-<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.sdk.trace.data.SpanData;</span>
-<span class="source-line-no">057</span><span id="line-57">import java.io.IOException;</span>
-<span class="source-line-no">058</span><span id="line-58">import java.net.InetSocketAddress;</span>
-<span class="source-line-no">059</span><span id="line-59">import java.nio.channels.SocketChannel;</span>
-<span class="source-line-no">060</span><span id="line-60">import java.time.Duration;</span>
-<span class="source-line-no">061</span><span id="line-61">import java.util.ArrayList;</span>
-<span class="source-line-no">062</span><span id="line-62">import java.util.Collections;</span>
-<span class="source-line-no">063</span><span id="line-63">import java.util.List;</span>
-<span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.CellScanner;</span>
-<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
-<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.ExtendedCell;</span>
-<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
-<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.HBaseServerBase;</span>
-<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.KeyValue;</span>
-<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.MatcherPredicate;</span>
-<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
-<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.Server;</span>
-<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.ServerName;</span>
-<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Waiter;</span>
-<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
-<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
-<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.io.compress.GzipCodec;</span>
-<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.ipc.RemoteException;</span>
-<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.util.StringUtils;</span>
-<span class="source-line-no">084</span><span id="line-84">import org.hamcrest.Matcher;</span>
-<span class="source-line-no">085</span><span id="line-85">import org.junit.Before;</span>
-<span class="source-line-no">086</span><span id="line-86">import org.junit.Rule;</span>
-<span class="source-line-no">087</span><span id="line-87">import org.junit.Test;</span>
-<span class="source-line-no">088</span><span id="line-88">import org.junit.runners.Parameterized.Parameter;</span>
-<span class="source-line-no">089</span><span id="line-89">import org.slf4j.Logger;</span>
-<span class="source-line-no">090</span><span id="line-90">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">091</span><span id="line-91"></span>
-<span class="source-line-no">092</span><span id="line-92">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
-<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
-<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
-<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
-<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
-<span class="source-line-no">097</span><span id="line-97"></span>
-<span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
-<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
-<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
-<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
-<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
-<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
-<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
-<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
-<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
-<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
-<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
-<span class="source-line-no">109</span><span id="line-109"></span>
-<span class="source-line-no">110</span><span id="line-110">/**</span>
-<span class="source-line-no">111</span><span id="line-111"> * Some basic ipc tests.</span>
-<span class="source-line-no">112</span><span id="line-112"> */</span>
-<span class="source-line-no">113</span><span id="line-113">public abstract class AbstractTestIPC {</span>
-<span class="source-line-no">114</span><span id="line-114"></span>
-<span class="source-line-no">115</span><span id="line-115">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
-<span class="source-line-no">116</span><span id="line-116"></span>
-<span class="source-line-no">117</span><span id="line-117">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
-<span class="source-line-no">118</span><span id="line-118">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
-<span class="source-line-no">119</span><span id="line-119"></span>
-<span class="source-line-no">120</span><span id="line-120">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
-<span class="source-line-no">121</span><span id="line-121"></span>
-<span class="source-line-no">122</span><span id="line-122">  protected RpcServer createRpcServer(Server server, String name,</span>
-<span class="source-line-no">123</span><span id="line-123">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
-<span class="source-line-no">124</span><span id="line-124">    RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">125</span><span id="line-125">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
-<span class="source-line-no">129</span><span id="line-129">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">130</span><span id="line-130">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">131</span><span id="line-131">  }</span>
-<span class="source-line-no">132</span><span id="line-132"></span>
-<span class="source-line-no">133</span><span id="line-133">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
-<span class="source-line-no">134</span><span id="line-134"></span>
-<span class="source-line-no">135</span><span id="line-135">  @Rule</span>
-<span class="source-line-no">136</span><span id="line-136">  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();</span>
-<span class="source-line-no">137</span><span id="line-137"></span>
-<span class="source-line-no">138</span><span id="line-138">  @Parameter(0)</span>
-<span class="source-line-no">139</span><span id="line-139">  public Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
+<span class="source-line-no">030</span><span id="line-30">import static org.awaitility.Awaitility.await;</span>
+<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.MatcherAssert.assertThat;</span>
+<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.allOf;</span>
+<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.containsString;</span>
+<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.everyItem;</span>
+<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
+<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.hasItem;</span>
+<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.instanceOf;</span>
+<span class="source-line-no">038</span><span id="line-38">import static org.hamcrest.Matchers.lessThan;</span>
+<span class="source-line-no">039</span><span id="line-39">import static org.hamcrest.Matchers.startsWith;</span>
+<span class="source-line-no">040</span><span id="line-40">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">041</span><span id="line-41">import static org.junit.jupiter.api.Assertions.assertFalse;</span>
+<span class="source-line-no">042</span><span id="line-42">import static org.junit.jupiter.api.Assertions.assertNotNull;</span>
+<span class="source-line-no">043</span><span id="line-43">import static org.junit.jupiter.api.Assertions.assertNull;</span>
+<span class="source-line-no">044</span><span id="line-44">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">045</span><span id="line-45">import static org.junit.jupiter.api.Assertions.assertTrue;</span>
+<span class="source-line-no">046</span><span id="line-46">import static org.junit.jupiter.api.Assertions.fail;</span>
+<span class="source-line-no">047</span><span id="line-47">import static org.mockito.ArgumentMatchers.any;</span>
+<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.mock;</span>
+<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.spy;</span>
+<span class="source-line-no">050</span><span id="line-50">import static org.mockito.Mockito.verify;</span>
+<span class="source-line-no">051</span><span id="line-51">import static org.mockito.Mockito.when;</span>
+<span class="source-line-no">052</span><span id="line-52">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.common.AttributeKey;</span>
+<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.api.trace.SpanKind;</span>
+<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.api.trace.StatusCode;</span>
+<span class="source-line-no">057</span><span id="line-57">import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;</span>
+<span class="source-line-no">058</span><span id="line-58">import io.opentelemetry.sdk.trace.data.SpanData;</span>
+<span class="source-line-no">059</span><span id="line-59">import java.io.IOException;</span>
+<span class="source-line-no">060</span><span id="line-60">import java.net.InetSocketAddress;</span>
+<span class="source-line-no">061</span><span id="line-61">import java.nio.channels.SocketChannel;</span>
+<span class="source-line-no">062</span><span id="line-62">import java.time.Duration;</span>
+<span class="source-line-no">063</span><span id="line-63">import java.util.ArrayList;</span>
+<span class="source-line-no">064</span><span id="line-64">import java.util.Collections;</span>
+<span class="source-line-no">065</span><span id="line-65">import java.util.List;</span>
+<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.CellScanner;</span>
+<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
+<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.ExtendedCell;</span>
+<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
+<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.HBaseServerBase;</span>
+<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.KeyValue;</span>
+<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.MatcherPredicate;</span>
+<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
+<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Server;</span>
+<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ServerName;</span>
+<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.Waiter;</span>
+<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
+<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
+<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.io.compress.GzipCodec;</span>
+<span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.ipc.RemoteException;</span>
+<span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.util.StringUtils;</span>
+<span class="source-line-no">086</span><span id="line-86">import org.hamcrest.Matcher;</span>
+<span class="source-line-no">087</span><span id="line-87">import org.junit.jupiter.api.BeforeEach;</span>
+<span class="source-line-no">088</span><span id="line-88">import org.junit.jupiter.api.TestTemplate;</span>
+<span class="source-line-no">089</span><span id="line-89">import org.junit.jupiter.api.extension.RegisterExtension;</span>
+<span class="source-line-no">090</span><span id="line-90">import org.slf4j.Logger;</span>
+<span class="source-line-no">091</span><span id="line-91">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">092</span><span id="line-92"></span>
+<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
+<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
+<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
+<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
+<span class="source-line-no">097</span><span id="line-97">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
+<span class="source-line-no">098</span><span id="line-98"></span>
+<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
+<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
+<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
+<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
+<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
+<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
+<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
+<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
+<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
+<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
+<span class="source-line-no">109</span><span id="line-109">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
+<span class="source-line-no">110</span><span id="line-110"></span>
+<span class="source-line-no">111</span><span id="line-111">/**</span>
+<span class="source-line-no">112</span><span id="line-112"> * Some basic ipc tests.</span>
+<span class="source-line-no">113</span><span id="line-113"> */</span>
+<span class="source-line-no">114</span><span id="line-114">public abstract class AbstractTestIPC {</span>
+<span class="source-line-no">115</span><span id="line-115"></span>
+<span class="source-line-no">116</span><span id="line-116">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
+<span class="source-line-no">117</span><span id="line-117"></span>
+<span class="source-line-no">118</span><span id="line-118">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
+<span class="source-line-no">119</span><span id="line-119">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
+<span class="source-line-no">120</span><span id="line-120"></span>
+<span class="source-line-no">121</span><span id="line-121">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
+<span class="source-line-no">122</span><span id="line-122"></span>
+<span class="source-line-no">123</span><span id="line-123">  protected RpcServer createRpcServer(Server server, String name,</span>
+<span class="source-line-no">124</span><span id="line-124">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
+<span class="source-line-no">125</span><span id="line-125">    RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">126</span><span id="line-126">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">127</span><span id="line-127">  }</span>
+<span class="source-line-no">128</span><span id="line-128"></span>
+<span class="source-line-no">129</span><span id="line-129">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
+<span class="source-line-no">130</span><span id="line-130">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">131</span><span id="line-131">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">132</span><span id="line-132">  }</span>
+<span class="source-line-no">133</span><span id="line-133"></span>
+<span class="source-line-no">134</span><span id="line-134">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
+<span class="source-line-no">135</span><span id="line-135"></span>
+<span class="source-line-no">136</span><span id="line-136">  @RegisterExtension</span>
+<span class="source-line-no">137</span><span id="line-137">  private static final OpenTelemetryExtension OTEL_EXT = OpenTelemetryExtension.create();</span>
+<span class="source-line-no">138</span><span id="line-138"></span>
+<span class="source-line-no">139</span><span id="line-139">  private Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
 <span class="source-line-no">140</span><span id="line-140"></span>
-<span class="source-line-no">141</span><span id="line-141">  @Before</span>
-<span class="source-line-no">142</span><span id="line-142">  public void setUpBeforeTest() {</span>
-<span class="source-line-no">143</span><span id="line-143">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
-<span class="source-line-no">144</span><span id="line-144">  }</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">  /**</span>
-<span class="source-line-no">147</span><span id="line-147">   * Ensure we do not HAVE TO HAVE a codec.</span>
-<span class="source-line-no">148</span><span id="line-148">   */</span>
-<span class="source-line-no">149</span><span id="line-149">  @Test</span>
-<span class="source-line-no">150</span><span id="line-150">  public void testNoCodec() throws IOException, ServiceException {</span>
-<span class="source-line-no">151</span><span id="line-151">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">152</span><span id="line-152">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">153</span><span id="line-153">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">154</span><span id="line-154">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">155</span><span id="line-155">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
-<span class="source-line-no">156</span><span id="line-156">      rpcServer.start();</span>
-<span class="source-line-no">157</span><span id="line-157">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">158</span><span id="line-158">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">159</span><span id="line-159">      String message = "hello";</span>
-<span class="source-line-no">160</span><span id="line-160">      assertEquals(message,</span>
-<span class="source-line-no">161</span><span id="line-161">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">162</span><span id="line-162">      assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">163</span><span id="line-163">    } finally {</span>
-<span class="source-line-no">164</span><span id="line-164">      rpcServer.stop();</span>
-<span class="source-line-no">165</span><span id="line-165">    }</span>
-<span class="source-line-no">166</span><span id="line-166">  }</span>
-<span class="source-line-no">167</span><span id="line-167"></span>
-<span class="source-line-no">168</span><span id="line-168">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
-<span class="source-line-no">169</span><span id="line-169"></span>
-<span class="source-line-no">170</span><span id="line-170">  /**</span>
-<span class="source-line-no">171</span><span id="line-171">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
-<span class="source-line-no">172</span><span id="line-172">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
-<span class="source-line-no">173</span><span id="line-173">   * confirm that compression is happening down in the client and server).</span>
-<span class="source-line-no">174</span><span id="line-174">   */</span>
-<span class="source-line-no">175</span><span id="line-175">  @Test</span>
-<span class="source-line-no">176</span><span id="line-176">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
-<span class="source-line-no">177</span><span id="line-177">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">178</span><span id="line-178">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
-<span class="source-line-no">179</span><span id="line-179">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">180</span><span id="line-180">    int count = 3;</span>
-<span class="source-line-no">181</span><span id="line-181">    for (int i = 0; i &lt; count; i++) {</span>
-<span class="source-line-no">182</span><span id="line-182">      cells.add(CELL);</span>
-<span class="source-line-no">183</span><span id="line-183">    }</span>
-<span class="source-line-no">184</span><span id="line-184">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">185</span><span id="line-185">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">186</span><span id="line-186">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">189</span><span id="line-189">      rpcServer.start();</span>
-<span class="source-line-no">190</span><span id="line-190">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">191</span><span id="line-191">      HBaseRpcController pcrc =</span>
-<span class="source-line-no">192</span><span id="line-192">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
-<span class="source-line-no">193</span><span id="line-193">      String message = "hello";</span>
-<span class="source-line-no">194</span><span id="line-194">      assertEquals(message,</span>
-<span class="source-line-no">195</span><span id="line-195">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">196</span><span id="line-196">      int index = 0;</span>
-<span class="source-line-no">197</span><span id="line-197">      CellScanner cellScanner = pcrc.cellScanner();</span>
-<span class="source-line-no">198</span><span id="line-198">      assertNotNull(cellScanner);</span>
-<span class="source-line-no">199</span><span id="line-199">      while (cellScanner.advance()) {</span>
-<span class="source-line-no">200</span><span id="line-200">        assertEquals(CELL, cellScanner.current());</span>
-<span class="source-line-no">201</span><span id="line-201">        index++;</span>
-<span class="source-line-no">202</span><span id="line-202">      }</span>
-<span class="source-line-no">203</span><span id="line-203">      assertEquals(count, index);</span>
-<span class="source-line-no">204</span><span id="line-204">    } finally {</span>
-<span class="source-line-no">205</span><span id="line-205">      rpcServer.stop();</span>
-<span class="source-line-no">206</span><span id="line-206">    }</span>
-<span class="source-line-no">207</span><span id="line-207">  }</span>
-<span class="source-line-no">208</span><span id="line-208"></span>
-<span class="source-line-no">209</span><span id="line-209">  protected abstract AbstractRpcClient&lt;?&gt;</span>
-<span class="source-line-no">210</span><span id="line-210">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
-<span class="source-line-no">211</span><span id="line-211"></span>
-<span class="source-line-no">212</span><span id="line-212">  @Test</span>
-<span class="source-line-no">213</span><span id="line-213">  public void testRTEDuringConnectionSetup() throws Exception {</span>
-<span class="source-line-no">214</span><span id="line-214">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">215</span><span id="line-215">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">216</span><span id="line-216">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">217</span><span id="line-217">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">218</span><span id="line-218">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
-<span class="source-line-no">219</span><span id="line-219">      rpcServer.start();</span>
-<span class="source-line-no">220</span><span id="line-220">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">221</span><span id="line-221">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">222</span><span id="line-222">      fail("Expected an exception to have been thrown!");</span>
-<span class="source-line-no">223</span><span id="line-223">    } catch (Exception e) {</span>
-<span class="source-line-no">224</span><span id="line-224">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">225</span><span id="line-225">      assertTrue(e.toString(), StringUtils.stringifyException(e).contains("Injected fault"));</span>
-<span class="source-line-no">226</span><span id="line-226">    } finally {</span>
-<span class="source-line-no">227</span><span id="line-227">      rpcServer.stop();</span>
-<span class="source-line-no">228</span><span id="line-228">    }</span>
-<span class="source-line-no">229</span><span id="line-229">  }</span>
-<span class="source-line-no">230</span><span id="line-230"></span>
-<span class="source-line-no">231</span><span id="line-231">  /**</span>
-<span class="source-line-no">232</span><span id="line-232">   * Tests that the rpc scheduler is called when requests arrive.</span>
-<span class="source-line-no">233</span><span id="line-233">   */</span>
-<span class="source-line-no">234</span><span id="line-234">  @Test</span>
-<span class="source-line-no">235</span><span id="line-235">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
-<span class="source-line-no">236</span><span id="line-236">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">237</span><span id="line-237">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">238</span><span id="line-238">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">239</span><span id="line-239">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">240</span><span id="line-240">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
-<span class="source-line-no">241</span><span id="line-241">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
-<span class="source-line-no">242</span><span id="line-242">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">243</span><span id="line-243">      rpcServer.start();</span>
-<span class="source-line-no">244</span><span id="line-244">      verify(scheduler).start();</span>
-<span class="source-line-no">245</span><span id="line-245">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">246</span><span id="line-246">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">247</span><span id="line-247">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">248</span><span id="line-248">        stub.echo(null, param);</span>
-<span class="source-line-no">249</span><span id="line-249">      }</span>
-<span class="source-line-no">250</span><span id="line-250">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
-<span class="source-line-no">251</span><span id="line-251">    } finally {</span>
-<span class="source-line-no">252</span><span id="line-252">      rpcServer.stop();</span>
-<span class="source-line-no">253</span><span id="line-253">      verify(scheduler).stop();</span>
-<span class="source-line-no">254</span><span id="line-254">    }</span>
-<span class="source-line-no">255</span><span id="line-255">  }</span>
-<span class="source-line-no">256</span><span id="line-256"></span>
-<span class="source-line-no">257</span><span id="line-257">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
-<span class="source-line-no">258</span><span id="line-258">  @Test</span>
-<span class="source-line-no">259</span><span id="line-259">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
-<span class="source-line-no">260</span><span id="line-260">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">261</span><span id="line-261">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
-<span class="source-line-no">262</span><span id="line-262">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">263</span><span id="line-263">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">264</span><span id="line-264">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
-<span class="source-line-no">265</span><span id="line-265">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">266</span><span id="line-266">      rpcServer.start();</span>
-<span class="source-line-no">267</span><span id="line-267">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">268</span><span id="line-268">      StringBuilder message = new StringBuilder(1200);</span>
-<span class="source-line-no">269</span><span id="line-269">      for (int i = 0; i &lt; 200; i++) {</span>
-<span class="source-line-no">270</span><span id="line-270">        message.append("hello.");</span>
-<span class="source-line-no">271</span><span id="line-271">      }</span>
-<span class="source-line-no">272</span><span id="line-272">      // set total RPC size bigger than 100 bytes</span>
-<span class="source-line-no">273</span><span id="line-273">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
-<span class="source-line-no">274</span><span id="line-274">      stub.echo(new HBaseRpcControllerImpl(</span>
-<span class="source-line-no">275</span><span id="line-275">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
-<span class="source-line-no">276</span><span id="line-276">      fail("RPC should have failed because it exceeds max request size");</span>
-<span class="source-line-no">277</span><span id="line-277">    } catch (ServiceException e) {</span>
-<span class="source-line-no">278</span><span id="line-278">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">279</span><span id="line-279">      assertTrue(e.toString(),</span>
-<span class="source-line-no">280</span><span id="line-280">        StringUtils.stringifyException(e).contains("RequestTooBigException"));</span>
-<span class="source-line-no">281</span><span id="line-281">    } finally {</span>
-<span class="source-line-no">282</span><span id="line-282">      rpcServer.stop();</span>
-<span class="source-line-no">283</span><span id="line-283">    }</span>
-<span class="source-line-no">284</span><span id="line-284">  }</span>
-<span class="source-line-no">285</span><span id="line-285"></span>
-<span class="source-line-no">286</span><span id="line-286">  /**</span>
-<span class="source-line-no">287</span><span id="line-287">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
-<span class="source-line-no">288</span><span id="line-288">   * remoteAddress set to its Call Object</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  @Test</span>
-<span class="source-line-no">291</span><span id="line-291">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
-<span class="source-line-no">292</span><span id="line-292">    throws IOException, ServiceException {</span>
-<span class="source-line-no">293</span><span id="line-293">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">294</span><span id="line-294">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">295</span><span id="line-295">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">296</span><span id="line-296">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">297</span><span id="line-297">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
-<span class="source-line-no">298</span><span id="line-298">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">299</span><span id="line-299">      rpcServer.start();</span>
-<span class="source-line-no">300</span><span id="line-300">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">301</span><span id="line-301">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
-<span class="source-line-no">302</span><span id="line-302">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
-<span class="source-line-no">303</span><span id="line-303">    } finally {</span>
-<span class="source-line-no">304</span><span id="line-304">      rpcServer.stop();</span>
-<span class="source-line-no">305</span><span id="line-305">    }</span>
-<span class="source-line-no">306</span><span id="line-306">  }</span>
-<span class="source-line-no">307</span><span id="line-307"></span>
-<span class="source-line-no">308</span><span id="line-308">  @Test</span>
-<span class="source-line-no">309</span><span id="line-309">  public void testRemoteError() throws IOException, ServiceException {</span>
-<span class="source-line-no">310</span><span id="line-310">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">311</span><span id="line-311">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">312</span><span id="line-312">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">313</span><span id="line-313">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">314</span><span id="line-314">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">315</span><span id="line-315">      rpcServer.start();</span>
-<span class="source-line-no">316</span><span id="line-316">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">317</span><span id="line-317">      stub.error(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">318</span><span id="line-318">    } catch (ServiceException e) {</span>
-<span class="source-line-no">319</span><span id="line-319">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">320</span><span id="line-320">      IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">321</span><span id="line-321">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">322</span><span id="line-322">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">323</span><span id="line-323">    } finally {</span>
-<span class="source-line-no">324</span><span id="line-324">      rpcServer.stop();</span>
-<span class="source-line-no">325</span><span id="line-325">    }</span>
-<span class="source-line-no">326</span><span id="line-326">  }</span>
-<span class="source-line-no">327</span><span id="line-327"></span>
-<span class="source-line-no">328</span><span id="line-328">  @Test</span>
-<span class="source-line-no">329</span><span id="line-329">  public void testTimeout() throws IOException {</span>
-<span class="source-line-no">330</span><span id="line-330">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">331</span><span id="line-331">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">332</span><span id="line-332">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">333</span><span id="line-333">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">334</span><span id="line-334">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">335</span><span id="line-335">      rpcServer.start();</span>
-<span class="source-line-no">336</span><span id="line-336">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">337</span><span id="line-337">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">338</span><span id="line-338">      int ms = 1000;</span>
-<span class="source-line-no">339</span><span id="line-339">      int timeout = 100;</span>
-<span class="source-line-no">340</span><span id="line-340">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">341</span><span id="line-341">        pcrc.reset();</span>
-<span class="source-line-no">342</span><span id="line-342">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">343</span><span id="line-343">        long startTime = System.nanoTime();</span>
-<span class="source-line-no">344</span><span id="line-344">        try {</span>
-<span class="source-line-no">345</span><span id="line-345">          stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build());</span>
-<span class="source-line-no">346</span><span id="line-346">        } catch (ServiceException e) {</span>
-<span class="source-line-no">347</span><span id="line-347">          long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">348</span><span id="line-348">          // expected</span>
-<span class="source-line-no">349</span><span id="line-349">          LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">350</span><span id="line-350">          IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">351</span><span id="line-351">          assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">352</span><span id="line-352">          // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">353</span><span id="line-353">          assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">354</span><span id="line-354">        }</span>
-<span class="source-line-no">355</span><span id="line-355">      }</span>
-<span class="source-line-no">356</span><span id="line-356">    } finally {</span>
-<span class="source-line-no">357</span><span id="line-357">      rpcServer.stop();</span>
-<span class="source-line-no">358</span><span id="line-358">    }</span>
-<span class="source-line-no">359</span><span id="line-359">  }</span>
-<span class="source-line-no">360</span><span id="line-360"></span>
-<span class="source-line-no">361</span><span id="line-361">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
-<span class="source-line-no">362</span><span id="line-362"></span>
-<span class="source-line-no">363</span><span id="line-363">    FailingSimpleRpcServer(Server server, String name,</span>
-<span class="source-line-no">364</span><span id="line-364">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
-<span class="source-line-no">365</span><span id="line-365">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">366</span><span id="line-366">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
-<span class="source-line-no">367</span><span id="line-367">    }</span>
+<span class="source-line-no">141</span><span id="line-141">  protected AbstractTestIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl) {</span>
+<span class="source-line-no">142</span><span id="line-142">    this.rpcServerImpl = rpcServerImpl;</span>
+<span class="source-line-no">143</span><span id="line-143">  }</span>
+<span class="source-line-no">144</span><span id="line-144"></span>
+<span class="source-line-no">145</span><span id="line-145">  @BeforeEach</span>
+<span class="source-line-no">146</span><span id="line-146">  public void setUpBeforeTest() {</span>
+<span class="source-line-no">147</span><span id="line-147">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
+<span class="source-line-no">148</span><span id="line-148">  }</span>
+<span class="source-line-no">149</span><span id="line-149"></span>
+<span class="source-line-no">150</span><span id="line-150">  /**</span>
+<span class="source-line-no">151</span><span id="line-151">   * Ensure we do not HAVE TO HAVE a codec.</span>
+<span class="source-line-no">152</span><span id="line-152">   */</span>
+<span class="source-line-no">153</span><span id="line-153">  @TestTemplate</span>
+<span class="source-line-no">154</span><span id="line-154">  public void testNoCodec() throws IOException, ServiceException {</span>
+<span class="source-line-no">155</span><span id="line-155">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">156</span><span id="line-156">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">157</span><span id="line-157">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">158</span><span id="line-158">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">159</span><span id="line-159">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
+<span class="source-line-no">160</span><span id="line-160">      rpcServer.start();</span>
+<span class="source-line-no">161</span><span id="line-161">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">162</span><span id="line-162">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">163</span><span id="line-163">      String message = "hello";</span>
+<span class="source-line-no">164</span><span id="line-164">      assertEquals(message,</span>
+<span class="source-line-no">165</span><span id="line-165">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">166</span><span id="line-166">      assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">167</span><span id="line-167">    } finally {</span>
+<span class="source-line-no">168</span><span id="line-168">      rpcServer.stop();</span>
+<span class="source-line-no">169</span><span id="line-169">    }</span>
+<span class="source-line-no">170</span><span id="line-170">  }</span>
+<span class="source-line-no">171</span><span id="line-171"></span>
+<span class="source-line-no">172</span><span id="line-172">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
+<span class="source-line-no">173</span><span id="line-173"></span>
+<span class="source-line-no">174</span><span id="line-174">  /**</span>
+<span class="source-line-no">175</span><span id="line-175">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
+<span class="source-line-no">176</span><span id="line-176">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
+<span class="source-line-no">177</span><span id="line-177">   * confirm that compression is happening down in the client and server).</span>
+<span class="source-line-no">178</span><span id="line-178">   */</span>
+<span class="source-line-no">179</span><span id="line-179">  @TestTemplate</span>
+<span class="source-line-no">180</span><span id="line-180">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
+<span class="source-line-no">181</span><span id="line-181">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">182</span><span id="line-182">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
+<span class="source-line-no">183</span><span id="line-183">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">184</span><span id="line-184">    int count = 3;</span>
+<span class="source-line-no">185</span><span id="line-185">    for (int i = 0; i &lt; count; i++) {</span>
+<span class="source-line-no">186</span><span id="line-186">      cells.add(CELL);</span>
+<span class="source-line-no">187</span><span id="line-187">    }</span>
+<span class="source-line-no">188</span><span id="line-188">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">189</span><span id="line-189">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">190</span><span id="line-190">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">191</span><span id="line-191"></span>
+<span class="source-line-no">192</span><span id="line-192">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">193</span><span id="line-193">      rpcServer.start();</span>
+<span class="source-line-no">194</span><span id="line-194">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">195</span><span id="line-195">      HBaseRpcController pcrc =</span>
+<span class="source-line-no">196</span><span id="line-196">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
+<span class="source-line-no">197</span><span id="line-197">      String message = "hello";</span>
+<span class="source-line-no">198</span><span id="line-198">      assertEquals(message,</span>
+<span class="source-line-no">199</span><span id="line-199">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">200</span><span id="line-200">      int index = 0;</span>
+<span class="source-line-no">201</span><span id="line-201">      CellScanner cellScanner = pcrc.cellScanner();</span>
+<span class="source-line-no">202</span><span id="line-202">      assertNotNull(cellScanner);</span>
+<span class="source-line-no">203</span><span id="line-203">      while (cellScanner.advance()) {</span>
+<span class="source-line-no">204</span><span id="line-204">        assertEquals(CELL, cellScanner.current());</span>
+<span class="source-line-no">205</span><span id="line-205">        index++;</span>
+<span class="source-line-no">206</span><span id="line-206">      }</span>
+<span class="source-line-no">207</span><span id="line-207">      assertEquals(count, index);</span>
+<span class="source-line-no">208</span><span id="line-208">    } finally {</span>
+<span class="source-line-no">209</span><span id="line-209">      rpcServer.stop();</span>
+<span class="source-line-no">210</span><span id="line-210">    }</span>
+<span class="source-line-no">211</span><span id="line-211">  }</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">  protected abstract AbstractRpcClient&lt;?&gt;</span>
+<span class="source-line-no">214</span><span id="line-214">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
+<span class="source-line-no">215</span><span id="line-215"></span>
+<span class="source-line-no">216</span><span id="line-216">  @TestTemplate</span>
+<span class="source-line-no">217</span><span id="line-217">  public void testRTEDuringConnectionSetup() throws Exception {</span>
+<span class="source-line-no">218</span><span id="line-218">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">219</span><span id="line-219">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">220</span><span id="line-220">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">221</span><span id="line-221">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">222</span><span id="line-222">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
+<span class="source-line-no">223</span><span id="line-223">      rpcServer.start();</span>
+<span class="source-line-no">224</span><span id="line-224">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">225</span><span id="line-225">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
+<span class="source-line-no">226</span><span id="line-226">      fail("Expected an exception to have been thrown!");</span>
+<span class="source-line-no">227</span><span id="line-227">    } catch (Exception e) {</span>
+<span class="source-line-no">228</span><span id="line-228">      LOG.info("Caught expected exception: " + e.toString());</span>
+<span class="source-line-no">229</span><span id="line-229">      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"), e.toString());</span>
+<span class="source-line-no">230</span><span id="line-230">    } finally {</span>
+<span class="source-line-no">231</span><span id="line-231">      rpcServer.stop();</span>
+<span class="source-line-no">232</span><span id="line-232">    }</span>
+<span class="source-line-no">233</span><span id="line-233">  }</span>
+<span class="source-line-no">234</span><span id="line-234"></span>
+<span class="source-line-no">235</span><span id="line-235">  /**</span>
+<span class="source-line-no">236</span><span id="line-236">   * Tests that the rpc scheduler is called when requests arrive.</span>
+<span class="source-line-no">237</span><span id="line-237">   */</span>
+<span class="source-line-no">238</span><span id="line-238">  @TestTemplate</span>
+<span class="source-line-no">239</span><span id="line-239">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
+<span class="source-line-no">240</span><span id="line-240">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">241</span><span id="line-241">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">242</span><span id="line-242">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">243</span><span id="line-243">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">244</span><span id="line-244">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
+<span class="source-line-no">245</span><span id="line-245">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
+<span class="source-line-no">246</span><span id="line-246">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">247</span><span id="line-247">      rpcServer.start();</span>
+<span class="source-line-no">248</span><span id="line-248">      verify(scheduler).start();</span>
+<span class="source-line-no">249</span><span id="line-249">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">250</span><span id="line-250">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">251</span><span id="line-251">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">252</span><span id="line-252">        stub.echo(null, param);</span>
+<span class="source-line-no">253</span><span id="line-253">      }</span>
+<span class="source-line-no">254</span><span id="line-254">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
+<span class="source-line-no">255</span><span id="line-255">    } finally {</span>
+<span class="source-line-no">256</span><span id="line-256">      rpcServer.stop();</span>
+<span class="source-line-no">257</span><span id="line-257">      verify(scheduler).stop();</span>
+<span class="source-line-no">258</span><span id="line-258">    }</span>
+<span class="source-line-no">259</span><span id="line-259">  }</span>
+<span class="source-line-no">260</span><span id="line-260"></span>
+<span class="source-line-no">261</span><span id="line-261">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
+<span class="source-line-no">262</span><span id="line-262">  @TestTemplate</span>
+<span class="source-line-no">263</span><span id="line-263">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
+<span class="source-line-no">264</span><span id="line-264">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">265</span><span id="line-265">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
+<span class="source-line-no">266</span><span id="line-266">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">267</span><span id="line-267">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">268</span><span id="line-268">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
+<span class="source-line-no">269</span><span id="line-269">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">270</span><span id="line-270">      rpcServer.start();</span>
+<span class="source-line-no">271</span><span id="line-271">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">272</span><span id="line-272">      StringBuilder message = new StringBuilder(1200);</span>
+<span class="source-line-no">273</span><span id="line-273">      for (int i = 0; i &lt; 200; i++) {</span>
+<span class="source-line-no">274</span><span id="line-274">        message.append("hello.");</span>
+<span class="source-line-no">275</span><span id="line-275">      }</span>
+<span class="source-line-no">276</span><span id="line-276">      // set total RPC size bigger than 100 bytes</span>
+<span class="source-line-no">277</span><span id="line-277">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
+<span class="source-line-no">278</span><span id="line-278">      stub.echo(new HBaseRpcControllerImpl(</span>
+<span class="source-line-no">279</span><span id="line-279">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
+<span class="source-line-no">280</span><span id="line-280">      fail("RPC should have failed because it exceeds max request size");</span>
+<span class="source-line-no">281</span><span id="line-281">    } catch (ServiceException e) {</span>
+<span class="source-line-no">282</span><span id="line-282">      LOG.info("Caught expected exception: " + e);</span>
+<span class="source-line-no">283</span><span id="line-283">      assertTrue(StringUtils.stringifyException(e).contains("RequestTooBigException"),</span>
+<span class="source-line-no">284</span><span id="line-284">        e.toString());</span>
+<span class="source-line-no">285</span><span id="line-285">    } finally {</span>
+<span class="source-line-no">286</span><span id="line-286">      rpcServer.stop();</span>
+<span class="source-line-no">287</span><span id="line-287">    }</span>
+<span class="source-line-no">288</span><span id="line-288">  }</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
+<span class="source-line-no">292</span><span id="line-292">   * remoteAddress set to its Call Object</span>
+<span class="source-line-no">293</span><span id="line-293">   */</span>
+<span class="source-line-no">294</span><span id="line-294">  @TestTemplate</span>
+<span class="source-line-no">295</span><span id="line-295">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
+<span class="source-line-no">296</span><span id="line-296">    throws IOException, ServiceException {</span>
+<span class="source-line-no">297</span><span id="line-297">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">298</span><span id="line-298">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">299</span><span id="line-299">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">300</span><span id="line-300">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">301</span><span id="line-301">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
+<span class="source-line-no">302</span><span id="line-302">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">303</span><span id="line-303">      rpcServer.start();</span>
+<span class="source-line-no">304</span><span id="line-304">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">305</span><span id="line-305">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
+<span class="source-line-no">306</span><span id="line-306">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
+<span class="source-line-no">307</span><span id="line-307">    } finally {</span>
+<span class="source-line-no">308</span><span id="line-308">      rpcServer.stop();</span>
+<span class="source-line-no">309</span><span id="line-309">    }</span>
+<span class="source-line-no">310</span><span id="line-310">  }</span>
+<span class="source-line-no">311</span><span id="line-311"></span>
+<span class="source-line-no">312</span><span id="line-312">  @TestTemplate</span>
+<span class="source-line-no">313</span><span id="line-313">  public void testRemoteError() throws IOException, ServiceException {</span>
+<span class="source-line-no">314</span><span id="line-314">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">315</span><span id="line-315">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">316</span><span id="line-316">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">317</span><span id="line-317">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">318</span><span id="line-318">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">319</span><span id="line-319">      rpcServer.start();</span>
+<span class="source-line-no">320</span><span id="line-320">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">321</span><span id="line-321">      ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">322</span><span id="line-322">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">323</span><span id="line-323">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">324</span><span id="line-324">      IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">325</span><span id="line-325">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">326</span><span id="line-326">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">327</span><span id="line-327">    } finally {</span>
+<span class="source-line-no">328</span><span id="line-328">      rpcServer.stop();</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330">  }</span>
+<span class="source-line-no">331</span><span id="line-331"></span>
+<span class="source-line-no">332</span><span id="line-332">  @TestTemplate</span>
+<span class="source-line-no">333</span><span id="line-333">  public void testTimeout() throws IOException {</span>
+<span class="source-line-no">334</span><span id="line-334">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">335</span><span id="line-335">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">336</span><span id="line-336">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">337</span><span id="line-337">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">338</span><span id="line-338">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">339</span><span id="line-339">      rpcServer.start();</span>
+<span class="source-line-no">340</span><span id="line-340">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">341</span><span id="line-341">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">342</span><span id="line-342">      int ms = 1000;</span>
+<span class="source-line-no">343</span><span id="line-343">      int timeout = 100;</span>
+<span class="source-line-no">344</span><span id="line-344">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">345</span><span id="line-345">        pcrc.reset();</span>
+<span class="source-line-no">346</span><span id="line-346">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">347</span><span id="line-347">        long startTime = System.nanoTime();</span>
+<span class="source-line-no">348</span><span id="line-348">        ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">349</span><span id="line-349">          () -&gt; stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build()));</span>
+<span class="source-line-no">350</span><span id="line-350">        long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">351</span><span id="line-351">        // expected</span>
+<span class="source-line-no">352</span><span id="line-352">        LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">353</span><span id="line-353">        IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">354</span><span id="line-354">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">355</span><span id="line-355">        // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">356</span><span id="line-356">        assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">357</span><span id="line-357">      }</span>
+<span class="source-line-no">358</span><span id="line-358">    } finally {</span>
+<span class="source-line-no">359</span><span id="line-359">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">360</span><span id="line-360">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">361</span><span id="line-361">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">362</span><span id="line-362">      rpcServer.stop();</span>
+<span class="source-line-no">363</span><span id="line-363">    }</span>
+<span class="source-line-no">364</span><span id="line-364">  }</span>
+<span class="source-line-no">365</span><span id="line-365"></span>
+<span class="source-line-no">366</span><span id="line-366">  @SuppressWarnings("deprecation")</span>
+<span class="source-line-no">367</span><span id="line-367">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
 <span class="source-line-no">368</span><span id="line-368"></span>
-<span class="source-line-no">369</span><span id="line-369">    final class FailingConnection extends SimpleServerRpcConnection {</span>
-<span class="source-line-no">370</span><span id="line-370">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
-<span class="source-line-no">371</span><span id="line-371">        long lastContact) {</span>
-<span class="source-line-no">372</span><span id="line-372">        super(rpcServer, channel, lastContact);</span>
-<span class="source-line-no">373</span><span id="line-373">      }</span>
+<span class="source-line-no">369</span><span id="line-369">    FailingSimpleRpcServer(Server server, String name,</span>
+<span class="source-line-no">370</span><span id="line-370">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
+<span class="source-line-no">371</span><span id="line-371">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">372</span><span id="line-372">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
+<span class="source-line-no">373</span><span id="line-373">    }</span>
 <span class="source-line-no">374</span><span id="line-374"></span>
-<span class="source-line-no">375</span><span id="line-375">      @Override</span>
-<span class="source-line-no">376</span><span id="line-376">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
-<span class="source-line-no">377</span><span id="line-377">        // this will throw exception after the connection header is read, and an RPC is sent</span>
-<span class="source-line-no">378</span><span id="line-378">        // from client</span>
-<span class="source-line-no">379</span><span id="line-379">        throw new DoNotRetryIOException("Failing for test");</span>
-<span class="source-line-no">380</span><span id="line-380">      }</span>
-<span class="source-line-no">381</span><span id="line-381">    }</span>
-<span class="source-line-no">382</span><span id="line-382"></span>
-<span class="source-line-no">383</span><span id="line-383">    @Override</span>
-<span class="source-line-no">384</span><span id="line-384">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
-<span class="source-line-no">385</span><span id="line-385">      return new FailingConnection(this, channel, time);</span>
-<span class="source-line-no">386</span><span id="line-386">    }</span>
-<span class="source-line-no">387</span><span id="line-387">  }</span>
+<span class="source-line-no">375</span><span id="line-375">    final class FailingConnection extends SimpleServerRpcConnection {</span>
+<span class="source-line-no">376</span><span id="line-376">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
+<span class="source-line-no">377</span><span id="line-377">        long lastContact) {</span>
+<span class="source-line-no">378</span><span id="line-378">        super(rpcServer, channel, lastContact);</span>
+<span class="source-line-no">379</span><span id="line-379">      }</span>
+<span class="source-line-no">380</span><span id="line-380"></span>
+<span class="source-line-no">381</span><span id="line-381">      @Override</span>
+<span class="source-line-no">382</span><span id="line-382">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
+<span class="source-line-no">383</span><span id="line-383">        // this will throw exception after the connection header is read, and an RPC is sent</span>
+<span class="source-line-no">384</span><span id="line-384">        // from client</span>
+<span class="source-line-no">385</span><span id="line-385">        throw new DoNotRetryIOException("Failing for test");</span>
+<span class="source-line-no">386</span><span id="line-386">      }</span>
+<span class="source-line-no">387</span><span id="line-387">    }</span>
 <span class="source-line-no">388</span><span id="line-388"></span>
-<span class="source-line-no">389</span><span id="line-389">  protected RpcServer createTestFailingRpcServer(final String name,</span>
-<span class="source-line-no">390</span><span id="line-390">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
-<span class="source-line-no">391</span><span id="line-391">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">392</span><span id="line-392">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
-<span class="source-line-no">393</span><span id="line-393">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">394</span><span id="line-394">    } else {</span>
-<span class="source-line-no">395</span><span id="line-395">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">396</span><span id="line-396">    }</span>
-<span class="source-line-no">397</span><span id="line-397">  }</span>
-<span class="source-line-no">398</span><span id="line-398"></span>
-<span class="source-line-no">399</span><span id="line-399">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
-<span class="source-line-no">400</span><span id="line-400">  @Test</span>
-<span class="source-line-no">401</span><span id="line-401">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
-<span class="source-line-no">402</span><span id="line-402">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">403</span><span id="line-403">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
-<span class="source-line-no">404</span><span id="line-404">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">405</span><span id="line-405">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">406</span><span id="line-406"></span>
-<span class="source-line-no">407</span><span id="line-407">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">408</span><span id="line-408">      rpcServer.start();</span>
-<span class="source-line-no">409</span><span id="line-409">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">410</span><span id="line-410">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">411</span><span id="line-411">      stub.echo(null, param);</span>
-<span class="source-line-no">412</span><span id="line-412">      fail("RPC should have failed because connection closed");</span>
-<span class="source-line-no">413</span><span id="line-413">    } catch (ServiceException e) {</span>
-<span class="source-line-no">414</span><span id="line-414">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">415</span><span id="line-415">    } finally {</span>
-<span class="source-line-no">416</span><span id="line-416">      rpcServer.stop();</span>
-<span class="source-line-no">417</span><span id="line-417">    }</span>
-<span class="source-line-no">418</span><span id="line-418">  }</span>
-<span class="source-line-no">419</span><span id="line-419"></span>
-<span class="source-line-no">420</span><span id="line-420">  @Test</span>
-<span class="source-line-no">421</span><span id="line-421">  public void testAsyncEcho() throws IOException {</span>
-<span class="source-line-no">422</span><span id="line-422">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">423</span><span id="line-423">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">424</span><span id="line-424">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">425</span><span id="line-425">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">426</span><span id="line-426">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">427</span><span id="line-427">      rpcServer.start();</span>
-<span class="source-line-no">428</span><span id="line-428">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">429</span><span id="line-429">      int num = 10;</span>
-<span class="source-line-no">430</span><span id="line-430">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">431</span><span id="line-431">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">432</span><span id="line-432">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">433</span><span id="line-433">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">434</span><span id="line-434">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">435</span><span id="line-435">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
-<span class="source-line-no">436</span><span id="line-436">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">437</span><span id="line-437">        callbackList.add(done);</span>
-<span class="source-line-no">438</span><span id="line-438">      }</span>
-<span class="source-line-no">439</span><span id="line-439">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">440</span><span id="line-440">        EchoResponseProto resp = callbackList.get(i).get();</span>
-<span class="source-line-no">441</span><span id="line-441">        HBaseRpcController pcrc = pcrcList.get(i);</span>
-<span class="source-line-no">442</span><span id="line-442">        assertEquals("hello-" + i, resp.getMessage());</span>
-<span class="source-line-no">443</span><span id="line-443">        assertFalse(pcrc.failed());</span>
-<span class="source-line-no">444</span><span id="line-444">        assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">445</span><span id="line-445">      }</span>
-<span class="source-line-no">446</span><span id="line-446">    } finally {</span>
-<span class="source-line-no">447</span><span id="line-447">      rpcServer.stop();</span>
-<span class="source-line-no">448</span><span id="line-448">    }</span>
-<span class="source-line-no">449</span><span id="line-449">  }</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">  @Test</span>
-<span class="source-line-no">452</span><span id="line-452">  public void testAsyncRemoteError() throws IOException {</span>
-<span class="source-line-no">453</span><span id="line-453">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">454</span><span id="line-454">    AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf);</span>
-<span class="source-line-no">455</span><span id="line-455">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">456</span><span id="line-456">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">457</span><span id="line-457">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">458</span><span id="line-458">    try {</span>
-<span class="source-line-no">459</span><span id="line-459">      rpcServer.start();</span>
-<span class="source-line-no">460</span><span id="line-460">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">461</span><span id="line-461">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">462</span><span id="line-462">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">463</span><span id="line-463">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
-<span class="source-line-no">464</span><span id="line-464">      assertNull(callback.get());</span>
-<span class="source-line-no">465</span><span id="line-465">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">466</span><span id="line-466">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">467</span><span id="line-467">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">468</span><span id="line-468">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">469</span><span id="line-469">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">470</span><span id="line-470">    } finally {</span>
-<span class="source-line-no">471</span><span id="line-471">      client.close();</span>
-<span class="source-line-no">472</span><span id="line-472">      rpcServer.stop();</span>
-<span class="source-line-no">473</span><span id="line-473">    }</span>
-<span class="source-line-no">474</span><span id="line-474">  }</span>
-<span class="source-line-no">475</span><span id="line-475"></span>
-<span class="source-line-no">476</span><span id="line-476">  @Test</span>
-<span class="source-line-no">477</span><span id="line-477">  public void testAsyncTimeout() throws IOException {</span>
-<span class="source-line-no">478</span><span id="line-478">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">479</span><span id="line-479">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">480</span><span id="line-480">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">481</span><span id="line-481">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">482</span><span id="line-482">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">483</span><span id="line-483">      rpcServer.start();</span>
-<span class="source-line-no">484</span><span id="line-484">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">485</span><span id="line-485">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">486</span><span id="line-486">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">487</span><span id="line-487">      int ms = 1000;</span>
-<span class="source-line-no">488</span><span id="line-488">      int timeout = 100;</span>
-<span class="source-line-no">489</span><span id="line-489">      long startTime = System.nanoTime();</span>
-<span class="source-line-no">490</span><span id="line-490">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">491</span><span id="line-491">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">492</span><span id="line-492">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">493</span><span id="line-493">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">494</span><span id="line-494">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
-<span class="source-line-no">495</span><span id="line-495">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">496</span><span id="line-496">        callbackList.add(callback);</span>
-<span class="source-line-no">497</span><span id="line-497">      }</span>
-<span class="source-line-no">498</span><span id="line-498">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
-<span class="source-line-no">499</span><span id="line-499">        assertNull(callback.get());</span>
-<span class="source-line-no">500</span><span id="line-500">      }</span>
-<span class="source-line-no">501</span><span id="line-501">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">502</span><span id="line-502">      for (HBaseRpcController pcrc : pcrcList) {</span>
-<span class="source-line-no">503</span><span id="line-503">        assertTrue(pcrc.failed());</span>
-<span class="source-line-no">504</span><span id="line-504">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">505</span><span id="line-505">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">506</span><span id="line-506">        assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">507</span><span id="line-507">      }</span>
-<span class="source-line-no">508</span><span id="line-508">      // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">509</span><span id="line-509">      assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">510</span><span id="line-510">    } finally {</span>
-<span class="source-line-no">511</span><span id="line-511">      rpcServer.stop();</span>
-<span class="source-line-no">512</span><span id="line-512">    }</span>
-<span class="source-line-no">513</span><span id="line-513">  }</span>
-<span class="source-line-no">514</span><span id="line-514"></span>
-<span class="source-line-no">515</span><span id="line-515">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
-<span class="source-line-no">516</span><span id="line-516">    Waiter.waitFor(CONF, 1000,</span>
-<span class="source-line-no">517</span><span id="line-517">      new MatcherPredicate&lt;&gt;(() -&gt; traceRule.getSpans(), hasItem(matcher)));</span>
-<span class="source-line-no">518</span><span id="line-518">    return traceRule.getSpans().stream().filter(matcher::matches).findFirst()</span>
-<span class="source-line-no">519</span><span id="line-519">      .orElseThrow(AssertionError::new);</span>
-<span class="source-line-no">520</span><span id="line-520">  }</span>
-<span class="source-line-no">521</span><span id="line-521"></span>
-<span class="source-line-no">522</span><span id="line-522">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">523</span><span id="line-523">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">389</span><span id="line-389">    @Override</span>
+<span class="source-line-no">390</span><span id="line-390">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
+<span class="source-line-no">391</span><span id="line-391">      return new FailingConnection(this, channel, time);</span>
+<span class="source-line-no">392</span><span id="line-392">    }</span>
+<span class="source-line-no">393</span><span id="line-393">  }</span>
+<span class="source-line-no">394</span><span id="line-394"></span>
+<span class="source-line-no">395</span><span id="line-395">  protected RpcServer createTestFailingRpcServer(final String name,</span>
+<span class="source-line-no">396</span><span id="line-396">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
+<span class="source-line-no">397</span><span id="line-397">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">398</span><span id="line-398">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
+<span class="source-line-no">399</span><span id="line-399">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">400</span><span id="line-400">    } else {</span>
+<span class="source-line-no">401</span><span id="line-401">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">402</span><span id="line-402">    }</span>
+<span class="source-line-no">403</span><span id="line-403">  }</span>
+<span class="source-line-no">404</span><span id="line-404"></span>
+<span class="source-line-no">405</span><span id="line-405">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
+<span class="source-line-no">406</span><span id="line-406">  @TestTemplate</span>
+<span class="source-line-no">407</span><span id="line-407">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
+<span class="source-line-no">408</span><span id="line-408">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">409</span><span id="line-409">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
+<span class="source-line-no">410</span><span id="line-410">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">411</span><span id="line-411">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">412</span><span id="line-412">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">413</span><span id="line-413">      rpcServer.start();</span>
+<span class="source-line-no">414</span><span id="line-414">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">415</span><span id="line-415">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">416</span><span id="line-416">      ServiceException se = assertThrows(ServiceException.class, () -&gt; stub.echo(null, param),</span>
+<span class="source-line-no">417</span><span id="line-417">        "RPC should have failed because connection closed");</span>
+<span class="source-line-no">418</span><span id="line-418">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">419</span><span id="line-419">    } finally {</span>
+<span class="source-line-no">420</span><span id="line-420">      rpcServer.stop();</span>
+<span class="source-line-no">421</span><span id="line-421">    }</span>
+<span class="source-line-no">422</span><span id="line-422">  }</span>
+<span class="source-line-no">423</span><span id="line-423"></span>
+<span class="source-line-no">424</span><span id="line-424">  @TestTemplate</span>
+<span class="source-line-no">425</span><span id="line-425">  public void testAsyncEcho() throws IOException {</span>
+<span class="source-line-no">426</span><span id="line-426">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">427</span><span id="line-427">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">428</span><span id="line-428">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">429</span><span id="line-429">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">430</span><span id="line-430">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">431</span><span id="line-431">      rpcServer.start();</span>
+<span class="source-line-no">432</span><span id="line-432">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">433</span><span id="line-433">      int num = 10;</span>
+<span class="source-line-no">434</span><span id="line-434">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">435</span><span id="line-435">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">436</span><span id="line-436">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">437</span><span id="line-437">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">438</span><span id="line-438">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">439</span><span id="line-439">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
+<span class="source-line-no">440</span><span id="line-440">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">441</span><span id="line-441">        callbackList.add(done);</span>
+<span class="source-line-no">442</span><span id="line-442">      }</span>
+<span class="source-line-no">443</span><span id="line-443">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">444</span><span id="line-444">        EchoResponseProto resp = callbackList.get(i).get();</span>
+<span class="source-line-no">445</span><span id="line-445">        HBaseRpcController pcrc = pcrcList.get(i);</span>
+<span class="source-line-no">446</span><span id="line-446">        assertEquals("hello-" + i, resp.getMessage());</span>
+<span class="source-line-no">447</span><span id="line-447">        assertFalse(pcrc.failed());</span>
+<span class="source-line-no">448</span><span id="line-448">        assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">449</span><span id="line-449">      }</span>
+<span class="source-line-no">450</span><span id="line-450">    } finally {</span>
+<span class="source-line-no">451</span><span id="line-451">      rpcServer.stop();</span>
+<span class="source-line-no">452</span><span id="line-452">    }</span>
+<span class="source-line-no">453</span><span id="line-453">  }</span>
+<span class="source-line-no">454</span><span id="line-454"></span>
+<span class="source-line-no">455</span><span id="line-455">  @TestTemplate</span>
+<span class="source-line-no">456</span><span id="line-456">  public void testAsyncRemoteError() throws IOException {</span>
+<span class="source-line-no">457</span><span id="line-457">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">458</span><span id="line-458">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">459</span><span id="line-459">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">460</span><span id="line-460">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">461</span><span id="line-461">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">462</span><span id="line-462">      rpcServer.start();</span>
+<span class="source-line-no">463</span><span id="line-463">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">464</span><span id="line-464">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">465</span><span id="line-465">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">466</span><span id="line-466">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
+<span class="source-line-no">467</span><span id="line-467">      assertNull(callback.get());</span>
+<span class="source-line-no">468</span><span id="line-468">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">469</span><span id="line-469">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">470</span><span id="line-470">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">471</span><span id="line-471">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">472</span><span id="line-472">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">473</span><span id="line-473">    } finally {</span>
+<span class="source-line-no">474</span><span id="line-474">      rpcServer.stop();</span>
+<span class="source-line-no">475</span><span id="line-475">    }</span>
+<span class="source-line-no">476</span><span id="line-476">  }</span>
+<span class="source-line-no">477</span><span id="line-477"></span>
+<span class="source-line-no">478</span><span id="line-478">  @TestTemplate</span>
+<span class="source-line-no">479</span><span id="line-479">  public void testAsyncTimeout() throws IOException {</span>
+<span class="source-line-no">480</span><span id="line-480">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">481</span><span id="line-481">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">482</span><span id="line-482">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">483</span><span id="line-483">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">484</span><span id="line-484">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">485</span><span id="line-485">      rpcServer.start();</span>
+<span class="source-line-no">486</span><span id="line-486">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">487</span><span id="line-487">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">488</span><span id="line-488">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">489</span><span id="line-489">      int ms = 1000;</span>
+<span class="source-line-no">490</span><span id="line-490">      int timeout = 100;</span>
+<span class="source-line-no">491</span><span id="line-491">      long startTime = System.nanoTime();</span>
+<span class="source-line-no">492</span><span id="line-492">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">493</span><span id="line-493">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">494</span><span id="line-494">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">495</span><span id="line-495">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">496</span><span id="line-496">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
+<span class="source-line-no">497</span><span id="line-497">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">498</span><span id="line-498">        callbackList.add(callback);</span>
+<span class="source-line-no">499</span><span id="line-499">      }</span>
+<span class="source-line-no">500</span><span id="line-500">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
+<span class="source-line-no">501</span><span id="line-501">        assertNull(callback.get());</span>
+<span class="source-line-no">502</span><span id="line-502">      }</span>
+<span class="source-line-no">503</span><span id="line-503">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">504</span><span id="line-504">      for (HBaseRpcController pcrc : pcrcList) {</span>
+<span class="source-line-no">505</span><span id="line-505">        assertTrue(pcrc.failed());</span>
+<span class="source-line-no">506</span><span id="line-506">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">507</span><span id="line-507">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">508</span><span id="line-508">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">509</span><span id="line-509">      }</span>
+<span class="source-line-no">510</span><span id="line-510">      // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">511</span><span id="line-511">      assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">512</span><span id="line-512">    } finally {</span>
+<span class="source-line-no">513</span><span id="line-513">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">514</span><span id="line-514">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">515</span><span id="line-515">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">516</span><span id="line-516">      rpcServer.stop();</span>
+<span class="source-line-no">517</span><span id="line-517">    }</span>
+<span class="source-line-no">518</span><span id="line-518">  }</span>
+<span class="source-line-no">519</span><span id="line-519"></span>
+<span class="source-line-no">520</span><span id="line-520">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
+<span class="source-line-no">521</span><span id="line-521">    Waiter.waitFor(CONF, 1000, new MatcherPredicate&lt;&gt;(() -&gt; OTEL_EXT.getSpans(), hasItem(matcher)));</span>
+<span class="source-line-no">522</span><span id="line-522">    return OTEL_EXT.getSpans().stream().filter(matcher::matches).findFirst()</span>
+<span class="source-line-no">523</span><span id="line-523">      .orElseThrow(AssertionError::new);</span>
 <span class="source-line-no">524</span><span id="line-524">  }</span>
 <span class="source-line-no">525</span><span id="line-525"></span>
-<span class="source-line-no">526</span><span id="line-526">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">527</span><span id="line-527">    final String methodName) {</span>
-<span class="source-line-no">528</span><span id="line-528">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">529</span><span id="line-529">      hasKind(SpanKind.CLIENT));</span>
-<span class="source-line-no">530</span><span id="line-530">  }</span>
-<span class="source-line-no">531</span><span id="line-531"></span>
-<span class="source-line-no">532</span><span id="line-532">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">533</span><span id="line-533">    final String methodName) {</span>
-<span class="source-line-no">534</span><span id="line-534">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">535</span><span id="line-535">      hasKind(SpanKind.SERVER));</span>
-<span class="source-line-no">536</span><span id="line-536">  }</span>
-<span class="source-line-no">537</span><span id="line-537"></span>
-<span class="source-line-no">538</span><span id="line-538">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
-<span class="source-line-no">539</span><span id="line-539">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
-<span class="source-line-no">540</span><span id="line-540">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">541</span><span id="line-541">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
-<span class="source-line-no">542</span><span id="line-542">      containsEntry("net.peer.name", isa.getHostName()),</span>
-<span class="source-line-no">543</span><span id="line-543">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
-<span class="source-line-no">544</span><span id="line-544">  }</span>
-<span class="source-line-no">545</span><span id="line-545"></span>
-<span class="source-line-no">546</span><span id="line-546">  private static Matcher&lt;SpanData&gt;</span>
-<span class="source-line-no">547</span><span id="line-547">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">548</span><span id="line-548">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">549</span><span id="line-549">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
-<span class="source-line-no">550</span><span id="line-550">  }</span>
-<span class="source-line-no">551</span><span id="line-551"></span>
-<span class="source-line-no">552</span><span id="line-552">  private void assertRemoteSpan() {</span>
-<span class="source-line-no">553</span><span id="line-553">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
-<span class="source-line-no">554</span><span id="line-554">    assertTrue(data.getParentSpanContext().isRemote());</span>
-<span class="source-line-no">555</span><span id="line-555">    assertEquals(SpanKind.SERVER, data.getKind());</span>
-<span class="source-line-no">556</span><span id="line-556">  }</span>
-<span class="source-line-no">557</span><span id="line-557"></span>
-<span class="source-line-no">558</span><span id="line-558">  @Test</span>
-<span class="source-line-no">559</span><span id="line-559">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
-<span class="source-line-no">560</span><span id="line-560">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">561</span><span id="line-561">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">562</span><span id="line-562">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">563</span><span id="line-563">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">564</span><span id="line-564">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">565</span><span id="line-565">      rpcServer.start();</span>
-<span class="source-line-no">566</span><span id="line-566">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">567</span><span id="line-567">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
-<span class="source-line-no">568</span><span id="line-568">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">569</span><span id="line-569">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">570</span><span id="line-570">      final SpanData pauseClientSpan =</span>
-<span class="source-line-no">571</span><span id="line-571">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">572</span><span id="line-572">      assertThat(pauseClientSpan,</span>
-<span class="source-line-no">573</span><span id="line-573">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
-<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseServerSpan =</span>
-<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseServerSpan,</span>
-<span class="source-line-no">577</span><span id="line-577">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">578</span><span id="line-578">      assertRemoteSpan();</span>
-<span class="source-line-no">579</span><span id="line-579">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">580</span><span id="line-580">      assertThat(traceRule.getSpans(),</span>
-<span class="source-line-no">581</span><span id="line-581">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
-<span class="source-line-no">582</span><span id="line-582">          hasTraceId(traceRule.getSpans().iterator().next().getTraceId()),</span>
-<span class="source-line-no">583</span><span id="line-583">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
-<span class="source-line-no">584</span><span id="line-584">    } finally {</span>
-<span class="source-line-no">585</span><span id="line-585">      rpcServer.stop();</span>
-<span class="source-line-no">586</span><span id="line-586">    }</span>
-<span class="source-line-no">587</span><span id="line-587">  }</span>
-<span class="source-line-no">588</span><span id="line-588"></span>
-<span class="source-line-no">589</span><span id="line-589">  @Test</span>
-<span class="source-line-no">590</span><span id="line-590">  public void testTracingErrorIpc() throws IOException {</span>
-<span class="source-line-no">591</span><span id="line-591">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">592</span><span id="line-592">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">593</span><span id="line-593">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">594</span><span id="line-594">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">595</span><span id="line-595">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">596</span><span id="line-596">      rpcServer.start();</span>
-<span class="source-line-no">597</span><span id="line-597">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">598</span><span id="line-598">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">599</span><span id="line-599">      assertThrows(ServiceException.class,</span>
-<span class="source-line-no">600</span><span id="line-600">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
-<span class="source-line-no">601</span><span id="line-601">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">602</span><span id="line-602">      final SpanData errorClientSpan =</span>
-<span class="source-line-no">603</span><span id="line-603">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">604</span><span id="line-604">      assertThat(errorClientSpan,</span>
-<span class="source-line-no">605</span><span id="line-605">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
-<span class="source-line-no">606</span><span id="line-606">      final SpanData errorServerSpan =</span>
-<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">608</span><span id="line-608">      assertThat(errorServerSpan,</span>
-<span class="source-line-no">609</span><span id="line-609">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">610</span><span id="line-610">      assertRemoteSpan();</span>
-<span class="source-line-no">611</span><span id="line-611">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">612</span><span id="line-612">      assertThat(traceRule.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
-<span class="source-line-no">613</span><span id="line-613">        hasTraceId(traceRule.getSpans().iterator().next().getTraceId()))));</span>
-<span class="source-line-no">614</span><span id="line-614">    } finally {</span>
-<span class="source-line-no">615</span><span id="line-615">      rpcServer.stop();</span>
-<span class="source-line-no">616</span><span id="line-616">    }</span>
-<span class="source-line-no">617</span><span id="line-617">  }</span>
-<span class="source-line-no">618</span><span id="line-618"></span>
-<span class="source-line-no">619</span><span id="line-619">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
-<span class="source-line-no">620</span><span id="line-620"></span>
-<span class="source-line-no">621</span><span id="line-621">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
-<span class="source-line-no">622</span><span id="line-622">    ServiceException se = assertThrows(ServiceException.class,</span>
-<span class="source-line-no">623</span><span id="line-623">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
-<span class="source-line-no">624</span><span id="line-624">    return ProtobufUtil.handleRemoteException(se);</span>
-<span class="source-line-no">625</span><span id="line-625">  }</span>
-<span class="source-line-no">626</span><span id="line-626"></span>
-<span class="source-line-no">627</span><span id="line-627">  @Test</span>
-<span class="source-line-no">628</span><span id="line-628">  public void testBadPreambleHeader() throws Exception {</span>
-<span class="source-line-no">629</span><span id="line-629">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">630</span><span id="line-630">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">631</span><span id="line-631">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">632</span><span id="line-632">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
-<span class="source-line-no">633</span><span id="line-633">      rpcServer.start();</span>
-<span class="source-line-no">634</span><span id="line-634">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">635</span><span id="line-635">      BadAuthException error = null;</span>
-<span class="source-line-no">636</span><span id="line-636">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
-<span class="source-line-no">637</span><span id="line-637">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
-<span class="source-line-no">638</span><span id="line-638">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">639</span><span id="line-639">        IOException ioe = doBadPreableHeaderCall(stub);</span>
-<span class="source-line-no">640</span><span id="line-640">        if (ioe instanceof BadAuthException) {</span>
-<span class="source-line-no">641</span><span id="line-641">          error = (BadAuthException) ioe;</span>
-<span class="source-line-no">642</span><span id="line-642">          break;</span>
-<span class="source-line-no">643</span><span id="line-643">        }</span>
-<span class="source-line-no">644</span><span id="line-644">        Thread.sleep(100);</span>
-<span class="source-line-no">645</span><span id="line-645">      }</span>
-<span class="source-line-no">646</span><span id="line-646">      assertNotNull("Can not get expected BadAuthException", error);</span>
-<span class="source-line-no">647</span><span id="line-647">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
-<span class="source-line-no">648</span><span id="line-648">    } finally {</span>
-<span class="source-line-no">649</span><span id="line-649">      rpcServer.stop();</span>
-<span class="source-line-no">650</span><span id="line-650">    }</span>
-<span class="source-line-no">651</span><span id="line-651">  }</span>
-<span class="source-line-no">652</span><span id="line-652"></span>
-<span class="source-line-no">653</span><span id="line-653">  /**</span>
-<span class="source-line-no">654</span><span id="line-654">   * Testcase for getting connection registry information through connection preamble header, see</span>
-<span class="source-line-no">655</span><span id="line-655">   * HBASE-25051 for more details.</span>
-<span class="source-line-no">656</span><span id="line-656">   */</span>
-<span class="source-line-no">657</span><span id="line-657">  @Test</span>
-<span class="source-line-no">658</span><span id="line-658">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
-<span class="source-line-no">659</span><span id="line-659">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">660</span><span id="line-660">    String clusterId = "test_cluster_id";</span>
-<span class="source-line-no">661</span><span id="line-661">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
-<span class="source-line-no">662</span><span id="line-662">    when(server.getClusterId()).thenReturn(clusterId);</span>
-<span class="source-line-no">663</span><span id="line-663">    // do not need any services</span>
-<span class="source-line-no">664</span><span id="line-664">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">665</span><span id="line-665">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">666</span><span id="line-666">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">667</span><span id="line-667">      rpcServer.start();</span>
-<span class="source-line-no">668</span><span id="line-668">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">669</span><span id="line-669">      BlockingRpcChannel channel =</span>
-<span class="source-line-no">670</span><span id="line-670">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
-<span class="source-line-no">671</span><span id="line-671">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">672</span><span id="line-672">      ConnectionRegistryService.BlockingInterface stub =</span>
-<span class="source-line-no">673</span><span id="line-673">        ConnectionRegistryService.newBlockingStub(channel);</span>
-<span class="source-line-no">674</span><span id="line-674">      GetConnectionRegistryResponse resp =</span>
-<span class="source-line-no">675</span><span id="line-675">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
-<span class="source-line-no">676</span><span id="line-676">      assertEquals(clusterId, resp.getClusterId());</span>
-<span class="source-line-no">677</span><span id="line-677">    } finally {</span>
-<span class="source-line-no">678</span><span id="line-678">      rpcServer.stop();</span>
-<span class="source-line-no">679</span><span id="line-679">    }</span>
-<span class="source-line-no">680</span><span id="line-680">  }</span>
-<span class="source-line-no">681</span><span id="line-681"></span>
-<span class="source-line-no">682</span><span id="line-682">  /**</span>
-<span class="source-line-no">683</span><span id="line-683">   * Test server does not support getting connection registry information through connection</span>
-<span class="source-line-no">684</span><span id="line-684">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
-<span class="source-line-no">685</span><span id="line-685">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
-<span class="source-line-no">686</span><span id="line-686">   */</span>
-<span class="source-line-no">687</span><span id="line-687">  @Test</span>
-<span class="source-line-no">688</span><span id="line-688">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
-<span class="source-line-no">689</span><span id="line-689">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">690</span><span id="line-690">    // do not need any services</span>
-<span class="source-line-no">691</span><span id="line-691">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">692</span><span id="line-692">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">693</span><span id="line-693">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">694</span><span id="line-694">      rpcServer.start();</span>
-<span class="source-line-no">695</span><span id="line-695">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">696</span><span id="line-696">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
-<span class="source-line-no">697</span><span id="line-697">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">698</span><span id="line-698">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
-<span class="source-line-no">699</span><span id="line-699">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">700</span><span id="line-700">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">701</span><span id="line-701">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
-<span class="source-line-no">702</span><span id="line-702">      // should have failed so no response</span>
-<span class="source-line-no">703</span><span id="line-703">      assertNull(done.get());</span>
-<span class="source-line-no">704</span><span id="line-704">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">705</span><span id="line-705">      // should be a FatalConnectionException</span>
-<span class="source-line-no">706</span><span id="line-706">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
-<span class="source-line-no">707</span><span id="line-707">      assertEquals(FatalConnectionException.class.getName(),</span>
-<span class="source-line-no">708</span><span id="line-708">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
-<span class="source-line-no">709</span><span id="line-709">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
-<span class="source-line-no">710</span><span id="line-710">    } finally {</span>
-<span class="source-line-no">711</span><span id="line-711">      rpcServer.stop();</span>
-<span class="source-line-no">712</span><span id="line-712">    }</span>
-<span class="source-line-no">713</span><span id="line-713">  }</span>
-<span class="source-line-no">714</span><span id="line-714">}</span>
+<span class="source-line-no">526</span><span id="line-526">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">527</span><span id="line-527">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">528</span><span id="line-528">  }</span>
+<span class="source-line-no">529</span><span id="line-529"></span>
+<span class="source-line-no">530</span><span id="line-530">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">531</span><span id="line-531">    final String methodName) {</span>
+<span class="source-line-no">532</span><span id="line-532">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">533</span><span id="line-533">      hasKind(SpanKind.CLIENT));</span>
+<span class="source-line-no">534</span><span id="line-534">  }</span>
+<span class="source-line-no">535</span><span id="line-535"></span>
+<span class="source-line-no">536</span><span id="line-536">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">537</span><span id="line-537">    final String methodName) {</span>
+<span class="source-line-no">538</span><span id="line-538">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">539</span><span id="line-539">      hasKind(SpanKind.SERVER));</span>
+<span class="source-line-no">540</span><span id="line-540">  }</span>
+<span class="source-line-no">541</span><span id="line-541"></span>
+<span class="source-line-no">542</span><span id="line-542">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
+<span class="source-line-no">543</span><span id="line-543">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
+<span class="source-line-no">544</span><span id="line-544">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">545</span><span id="line-545">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
+<span class="source-line-no">546</span><span id="line-546">      containsEntry("net.peer.name", isa.getHostName()),</span>
+<span class="source-line-no">547</span><span id="line-547">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
+<span class="source-line-no">548</span><span id="line-548">  }</span>
+<span class="source-line-no">549</span><span id="line-549"></span>
+<span class="source-line-no">550</span><span id="line-550">  private static Matcher&lt;SpanData&gt;</span>
+<span class="source-line-no">551</span><span id="line-551">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">552</span><span id="line-552">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">553</span><span id="line-553">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
+<span class="source-line-no">554</span><span id="line-554">  }</span>
+<span class="source-line-no">555</span><span id="line-555"></span>
+<span class="source-line-no">556</span><span id="line-556">  private void assertRemoteSpan() {</span>
+<span class="source-line-no">557</span><span id="line-557">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
+<span class="source-line-no">558</span><span id="line-558">    assertTrue(data.getParentSpanContext().isRemote());</span>
+<span class="source-line-no">559</span><span id="line-559">    assertEquals(SpanKind.SERVER, data.getKind());</span>
+<span class="source-line-no">560</span><span id="line-560">  }</span>
+<span class="source-line-no">561</span><span id="line-561"></span>
+<span class="source-line-no">562</span><span id="line-562">  @TestTemplate</span>
+<span class="source-line-no">563</span><span id="line-563">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
+<span class="source-line-no">564</span><span id="line-564">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">565</span><span id="line-565">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">566</span><span id="line-566">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">567</span><span id="line-567">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">568</span><span id="line-568">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">569</span><span id="line-569">      rpcServer.start();</span>
+<span class="source-line-no">570</span><span id="line-570">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">571</span><span id="line-571">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
+<span class="source-line-no">572</span><span id="line-572">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">573</span><span id="line-573">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseClientSpan =</span>
+<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseClientSpan,</span>
+<span class="source-line-no">577</span><span id="line-577">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
+<span class="source-line-no">578</span><span id="line-578">      final SpanData pauseServerSpan =</span>
+<span class="source-line-no">579</span><span id="line-579">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">580</span><span id="line-580">      assertThat(pauseServerSpan,</span>
+<span class="source-line-no">581</span><span id="line-581">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">582</span><span id="line-582">      assertRemoteSpan();</span>
+<span class="source-line-no">583</span><span id="line-583">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">584</span><span id="line-584">      assertThat(OTEL_EXT.getSpans(),</span>
+<span class="source-line-no">585</span><span id="line-585">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
+<span class="source-line-no">586</span><span id="line-586">          hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()),</span>
+<span class="source-line-no">587</span><span id="line-587">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
+<span class="source-line-no">588</span><span id="line-588">    } finally {</span>
+<span class="source-line-no">589</span><span id="line-589">      rpcServer.stop();</span>
+<span class="source-line-no">590</span><span id="line-590">    }</span>
+<span class="source-line-no">591</span><span id="line-591">  }</span>
+<span class="source-line-no">592</span><span id="line-592"></span>
+<span class="source-line-no">593</span><span id="line-593">  @TestTemplate</span>
+<span class="source-line-no">594</span><span id="line-594">  public void testTracingErrorIpc() throws IOException {</span>
+<span class="source-line-no">595</span><span id="line-595">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">596</span><span id="line-596">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">597</span><span id="line-597">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">598</span><span id="line-598">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">599</span><span id="line-599">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">600</span><span id="line-600">      rpcServer.start();</span>
+<span class="source-line-no">601</span><span id="line-601">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">602</span><span id="line-602">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">603</span><span id="line-603">      assertThrows(ServiceException.class,</span>
+<span class="source-line-no">604</span><span id="line-604">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">605</span><span id="line-605">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">606</span><span id="line-606">      final SpanData errorClientSpan =</span>
+<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">608</span><span id="line-608">      assertThat(errorClientSpan,</span>
+<span class="source-line-no">609</span><span id="line-609">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
+<span class="source-line-no">610</span><span id="line-610">      final SpanData errorServerSpan =</span>
+<span class="source-line-no">611</span><span id="line-611">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">612</span><span id="line-612">      assertThat(errorServerSpan,</span>
+<span class="source-line-no">613</span><span id="line-613">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">614</span><span id="line-614">      assertRemoteSpan();</span>
+<span class="source-line-no">615</span><span id="line-615">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">616</span><span id="line-616">      assertThat(OTEL_EXT.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
+<span class="source-line-no">617</span><span id="line-617">        hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()))));</span>
+<span class="source-line-no">618</span><span id="line-618">    } finally {</span>
+<span class="source-line-no">619</span><span id="line-619">      rpcServer.stop();</span>
+<span class="source-line-no">620</span><span id="line-620">    }</span>
+<span class="source-line-no">621</span><span id="line-621">  }</span>
+<span class="source-line-no">622</span><span id="line-622"></span>
+<span class="source-line-no">623</span><span id="line-623">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
+<span class="source-line-no">624</span><span id="line-624"></span>
+<span class="source-line-no">625</span><span id="line-625">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
+<span class="source-line-no">626</span><span id="line-626">    ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">627</span><span id="line-627">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
+<span class="source-line-no">628</span><span id="line-628">    return ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">629</span><span id="line-629">  }</span>
+<span class="source-line-no">630</span><span id="line-630"></span>
+<span class="source-line-no">631</span><span id="line-631">  @TestTemplate</span>
+<span class="source-line-no">632</span><span id="line-632">  public void testBadPreambleHeader() throws Exception {</span>
+<span class="source-line-no">633</span><span id="line-633">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">634</span><span id="line-634">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">635</span><span id="line-635">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">636</span><span id="line-636">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
+<span class="source-line-no">637</span><span id="line-637">      rpcServer.start();</span>
+<span class="source-line-no">638</span><span id="line-638">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">639</span><span id="line-639">      BadAuthException error = null;</span>
+<span class="source-line-no">640</span><span id="line-640">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
+<span class="source-line-no">641</span><span id="line-641">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
+<span class="source-line-no">642</span><span id="line-642">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">643</span><span id="line-643">        IOException ioe = doBadPreableHeaderCall(stub);</span>
+<span class="source-line-no">644</span><span id="line-644">        if (ioe instanceof BadAuthException) {</span>
+<span class="source-line-no">645</span><span id="line-645">          error = (BadAuthException) ioe;</span>
+<span class="source-line-no">646</span><span id="line-646">          break;</span>
+<span class="source-line-no">647</span><span id="line-647">        }</span>
+<span class="source-line-no">648</span><span id="line-648">        Thread.sleep(100);</span>
+<span class="source-line-no">649</span><span id="line-649">      }</span>
+<span class="source-line-no">650</span><span id="line-650">      assertNotNull(error, "Can not get expected BadAuthException");</span>
+<span class="source-line-no">651</span><span id="line-651">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
+<span class="source-line-no">652</span><span id="line-652">    } finally {</span>
+<span class="source-line-no">653</span><span id="line-653">      rpcServer.stop();</span>
+<span class="source-line-no">654</span><span id="line-654">    }</span>
+<span class="source-line-no">655</span><span id="line-655">  }</span>
+<span class="source-line-no">656</span><span id="line-656"></span>
+<span class="source-line-no">657</span><span id="line-657">  /**</span>
+<span class="source-line-no">658</span><span id="line-658">   * Testcase for getting connection registry information through connection preamble header, see</span>
+<span class="source-line-no">659</span><span id="line-659">   * HBASE-25051 for more details.</span>
+<span class="source-line-no">660</span><span id="line-660">   */</span>
+<span class="source-line-no">661</span><span id="line-661">  @TestTemplate</span>
+<span class="source-line-no">662</span><span id="line-662">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
+<span class="source-line-no">663</span><span id="line-663">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">664</span><span id="line-664">    String clusterId = "test_cluster_id";</span>
+<span class="source-line-no">665</span><span id="line-665">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
+<span class="source-line-no">666</span><span id="line-666">    when(server.getClusterId()).thenReturn(clusterId);</span>
+<span class="source-line-no">667</span><span id="line-667">    // do not need any services</span>
+<span class="source-line-no">668</span><span id="line-668">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">669</span><span id="line-669">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">670</span><span id="line-670">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">671</span><span id="line-671">      rpcServer.start();</span>
+<span class="source-line-no">672</span><span id="line-672">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">673</span><span id="line-673">      BlockingRpcChannel channel =</span>
+<span class="source-line-no">674</span><span id="line-674">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
+<span class="source-line-no">675</span><span id="line-675">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">676</span><span id="line-676">      ConnectionRegistryService.BlockingInterface stub =</span>
+<span class="source-line-no">677</span><span id="line-677">        ConnectionRegistryService.newBlockingStub(channel);</span>
+<span class="source-line-no">678</span><span id="line-678">      GetConnectionRegistryResponse resp =</span>
+<span class="source-line-no">679</span><span id="line-679">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
+<span class="source-line-no">680</span><span id="line-680">      assertEquals(clusterId, resp.getClusterId());</span>
+<span class="source-line-no">681</span><span id="line-681">    } finally {</span>
+<span class="source-line-no">682</span><span id="line-682">      rpcServer.stop();</span>
+<span class="source-line-no">683</span><span id="line-683">    }</span>
+<span class="source-line-no">684</span><span id="line-684">  }</span>
+<span class="source-line-no">685</span><span id="line-685"></span>
+<span class="source-line-no">686</span><span id="line-686">  /**</span>
+<span class="source-line-no">687</span><span id="line-687">   * Test server does not support getting connection registry information through connection</span>
+<span class="source-line-no">688</span><span id="line-688">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
+<span class="source-line-no">689</span><span id="line-689">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
+<span class="source-line-no">690</span><span id="line-690">   */</span>
+<span class="source-line-no">691</span><span id="line-691">  @TestTemplate</span>
+<span class="source-line-no">692</span><span id="line-692">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
+<span class="source-line-no">693</span><span id="line-693">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">694</span><span id="line-694">    // do not need any services</span>
+<span class="source-line-no">695</span><span id="line-695">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">696</span><span id="line-696">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">697</span><span id="line-697">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">698</span><span id="line-698">      rpcServer.start();</span>
+<span class="source-line-no">699</span><span id="line-699">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">700</span><span id="line-700">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
+<span class="source-line-no">701</span><span id="line-701">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">702</span><span id="line-702">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
+<span class="source-line-no">703</span><span id="line-703">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">704</span><span id="line-704">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">705</span><span id="line-705">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
+<span class="source-line-no">706</span><span id="line-706">      // should have failed so no response</span>
+<span class="source-line-no">707</span><span id="line-707">      assertNull(done.get());</span>
+<span class="source-line-no">708</span><span id="line-708">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">709</span><span id="line-709">      // should be a FatalConnectionException</span>
+<span class="source-line-no">710</span><span id="line-710">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
+<span class="source-line-no">711</span><span id="line-711">      assertEquals(FatalConnectionException.class.getName(),</span>
+<span class="source-line-no">712</span><span id="line-712">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
+<span class="source-line-no">713</span><span id="line-713">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
+<span class="source-line-no">714</span><span id="line-714">    } finally {</span>
+<span class="source-line-no">715</span><span id="line-715">      rpcServer.stop();</span>
+<span class="source-line-no">716</span><span id="line-716">    }</span>
+<span class="source-line-no">717</span><span id="line-717">  }</span>
+<span class="source-line-no">718</span><span id="line-718">}</span>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html
index eadff7f5228..9117f5eb6f7 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.FailingSimpleRpcServer.html
@@ -40,691 +40,695 @@
 <span class="source-line-no">027</span><span id="line-27">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;</span>
 <span class="source-line-no">028</span><span id="line-28">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newBlockingStub;</span>
 <span class="source-line-no">029</span><span id="line-29">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newStub;</span>
-<span class="source-line-no">030</span><span id="line-30">import static org.hamcrest.MatcherAssert.assertThat;</span>
-<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.Matchers.allOf;</span>
-<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.containsString;</span>
-<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.everyItem;</span>
-<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
-<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.hasItem;</span>
-<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.instanceOf;</span>
-<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.startsWith;</span>
-<span class="source-line-no">038</span><span id="line-38">import static org.junit.Assert.assertEquals;</span>
-<span class="source-line-no">039</span><span id="line-39">import static org.junit.Assert.assertFalse;</span>
-<span class="source-line-no">040</span><span id="line-40">import static org.junit.Assert.assertNotNull;</span>
-<span class="source-line-no">041</span><span id="line-41">import static org.junit.Assert.assertNull;</span>
-<span class="source-line-no">042</span><span id="line-42">import static org.junit.Assert.assertThrows;</span>
-<span class="source-line-no">043</span><span id="line-43">import static org.junit.Assert.assertTrue;</span>
-<span class="source-line-no">044</span><span id="line-44">import static org.junit.Assert.fail;</span>
-<span class="source-line-no">045</span><span id="line-45">import static org.mockito.ArgumentMatchers.any;</span>
-<span class="source-line-no">046</span><span id="line-46">import static org.mockito.Mockito.mock;</span>
-<span class="source-line-no">047</span><span id="line-47">import static org.mockito.Mockito.spy;</span>
-<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.verify;</span>
-<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.when;</span>
-<span class="source-line-no">050</span><span id="line-50">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
-<span class="source-line-no">051</span><span id="line-51"></span>
-<span class="source-line-no">052</span><span id="line-52">import io.opentelemetry.api.common.AttributeKey;</span>
-<span class="source-line-no">053</span><span id="line-53">import io.opentelemetry.api.trace.SpanKind;</span>
-<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.trace.StatusCode;</span>
-<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;</span>
-<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.sdk.trace.data.SpanData;</span>
-<span class="source-line-no">057</span><span id="line-57">import java.io.IOException;</span>
-<span class="source-line-no">058</span><span id="line-58">import java.net.InetSocketAddress;</span>
-<span class="source-line-no">059</span><span id="line-59">import java.nio.channels.SocketChannel;</span>
-<span class="source-line-no">060</span><span id="line-60">import java.time.Duration;</span>
-<span class="source-line-no">061</span><span id="line-61">import java.util.ArrayList;</span>
-<span class="source-line-no">062</span><span id="line-62">import java.util.Collections;</span>
-<span class="source-line-no">063</span><span id="line-63">import java.util.List;</span>
-<span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.CellScanner;</span>
-<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
-<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.ExtendedCell;</span>
-<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
-<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.HBaseServerBase;</span>
-<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.KeyValue;</span>
-<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.MatcherPredicate;</span>
-<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
-<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.Server;</span>
-<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.ServerName;</span>
-<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Waiter;</span>
-<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
-<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
-<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.io.compress.GzipCodec;</span>
-<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.ipc.RemoteException;</span>
-<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.util.StringUtils;</span>
-<span class="source-line-no">084</span><span id="line-84">import org.hamcrest.Matcher;</span>
-<span class="source-line-no">085</span><span id="line-85">import org.junit.Before;</span>
-<span class="source-line-no">086</span><span id="line-86">import org.junit.Rule;</span>
-<span class="source-line-no">087</span><span id="line-87">import org.junit.Test;</span>
-<span class="source-line-no">088</span><span id="line-88">import org.junit.runners.Parameterized.Parameter;</span>
-<span class="source-line-no">089</span><span id="line-89">import org.slf4j.Logger;</span>
-<span class="source-line-no">090</span><span id="line-90">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">091</span><span id="line-91"></span>
-<span class="source-line-no">092</span><span id="line-92">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
-<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
-<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
-<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
-<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
-<span class="source-line-no">097</span><span id="line-97"></span>
-<span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
-<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
-<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
-<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
-<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
-<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
-<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
-<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
-<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
-<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
-<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
-<span class="source-line-no">109</span><span id="line-109"></span>
-<span class="source-line-no">110</span><span id="line-110">/**</span>
-<span class="source-line-no">111</span><span id="line-111"> * Some basic ipc tests.</span>
-<span class="source-line-no">112</span><span id="line-112"> */</span>
-<span class="source-line-no">113</span><span id="line-113">public abstract class AbstractTestIPC {</span>
-<span class="source-line-no">114</span><span id="line-114"></span>
-<span class="source-line-no">115</span><span id="line-115">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
-<span class="source-line-no">116</span><span id="line-116"></span>
-<span class="source-line-no">117</span><span id="line-117">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
-<span class="source-line-no">118</span><span id="line-118">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
-<span class="source-line-no">119</span><span id="line-119"></span>
-<span class="source-line-no">120</span><span id="line-120">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
-<span class="source-line-no">121</span><span id="line-121"></span>
-<span class="source-line-no">122</span><span id="line-122">  protected RpcServer createRpcServer(Server server, String name,</span>
-<span class="source-line-no">123</span><span id="line-123">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
-<span class="source-line-no">124</span><span id="line-124">    RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">125</span><span id="line-125">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
-<span class="source-line-no">129</span><span id="line-129">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">130</span><span id="line-130">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">131</span><span id="line-131">  }</span>
-<span class="source-line-no">132</span><span id="line-132"></span>
-<span class="source-line-no">133</span><span id="line-133">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
-<span class="source-line-no">134</span><span id="line-134"></span>
-<span class="source-line-no">135</span><span id="line-135">  @Rule</span>
-<span class="source-line-no">136</span><span id="line-136">  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();</span>
-<span class="source-line-no">137</span><span id="line-137"></span>
-<span class="source-line-no">138</span><span id="line-138">  @Parameter(0)</span>
-<span class="source-line-no">139</span><span id="line-139">  public Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
+<span class="source-line-no">030</span><span id="line-30">import static org.awaitility.Awaitility.await;</span>
+<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.MatcherAssert.assertThat;</span>
+<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.allOf;</span>
+<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.containsString;</span>
+<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.everyItem;</span>
+<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
+<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.hasItem;</span>
+<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.instanceOf;</span>
+<span class="source-line-no">038</span><span id="line-38">import static org.hamcrest.Matchers.lessThan;</span>
+<span class="source-line-no">039</span><span id="line-39">import static org.hamcrest.Matchers.startsWith;</span>
+<span class="source-line-no">040</span><span id="line-40">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">041</span><span id="line-41">import static org.junit.jupiter.api.Assertions.assertFalse;</span>
+<span class="source-line-no">042</span><span id="line-42">import static org.junit.jupiter.api.Assertions.assertNotNull;</span>
+<span class="source-line-no">043</span><span id="line-43">import static org.junit.jupiter.api.Assertions.assertNull;</span>
+<span class="source-line-no">044</span><span id="line-44">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">045</span><span id="line-45">import static org.junit.jupiter.api.Assertions.assertTrue;</span>
+<span class="source-line-no">046</span><span id="line-46">import static org.junit.jupiter.api.Assertions.fail;</span>
+<span class="source-line-no">047</span><span id="line-47">import static org.mockito.ArgumentMatchers.any;</span>
+<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.mock;</span>
+<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.spy;</span>
+<span class="source-line-no">050</span><span id="line-50">import static org.mockito.Mockito.verify;</span>
+<span class="source-line-no">051</span><span id="line-51">import static org.mockito.Mockito.when;</span>
+<span class="source-line-no">052</span><span id="line-52">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.common.AttributeKey;</span>
+<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.api.trace.SpanKind;</span>
+<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.api.trace.StatusCode;</span>
+<span class="source-line-no">057</span><span id="line-57">import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;</span>
+<span class="source-line-no">058</span><span id="line-58">import io.opentelemetry.sdk.trace.data.SpanData;</span>
+<span class="source-line-no">059</span><span id="line-59">import java.io.IOException;</span>
+<span class="source-line-no">060</span><span id="line-60">import java.net.InetSocketAddress;</span>
+<span class="source-line-no">061</span><span id="line-61">import java.nio.channels.SocketChannel;</span>
+<span class="source-line-no">062</span><span id="line-62">import java.time.Duration;</span>
+<span class="source-line-no">063</span><span id="line-63">import java.util.ArrayList;</span>
+<span class="source-line-no">064</span><span id="line-64">import java.util.Collections;</span>
+<span class="source-line-no">065</span><span id="line-65">import java.util.List;</span>
+<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.CellScanner;</span>
+<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
+<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.ExtendedCell;</span>
+<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
+<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.HBaseServerBase;</span>
+<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.KeyValue;</span>
+<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.MatcherPredicate;</span>
+<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
+<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Server;</span>
+<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ServerName;</span>
+<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.Waiter;</span>
+<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
+<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
+<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.io.compress.GzipCodec;</span>
+<span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.ipc.RemoteException;</span>
+<span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.util.StringUtils;</span>
+<span class="source-line-no">086</span><span id="line-86">import org.hamcrest.Matcher;</span>
+<span class="source-line-no">087</span><span id="line-87">import org.junit.jupiter.api.BeforeEach;</span>
+<span class="source-line-no">088</span><span id="line-88">import org.junit.jupiter.api.TestTemplate;</span>
+<span class="source-line-no">089</span><span id="line-89">import org.junit.jupiter.api.extension.RegisterExtension;</span>
+<span class="source-line-no">090</span><span id="line-90">import org.slf4j.Logger;</span>
+<span class="source-line-no">091</span><span id="line-91">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">092</span><span id="line-92"></span>
+<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
+<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
+<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
+<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
+<span class="source-line-no">097</span><span id="line-97">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
+<span class="source-line-no">098</span><span id="line-98"></span>
+<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
+<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
+<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
+<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
+<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
+<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
+<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
+<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
+<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
+<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
+<span class="source-line-no">109</span><span id="line-109">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
+<span class="source-line-no">110</span><span id="line-110"></span>
+<span class="source-line-no">111</span><span id="line-111">/**</span>
+<span class="source-line-no">112</span><span id="line-112"> * Some basic ipc tests.</span>
+<span class="source-line-no">113</span><span id="line-113"> */</span>
+<span class="source-line-no">114</span><span id="line-114">public abstract class AbstractTestIPC {</span>
+<span class="source-line-no">115</span><span id="line-115"></span>
+<span class="source-line-no">116</span><span id="line-116">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
+<span class="source-line-no">117</span><span id="line-117"></span>
+<span class="source-line-no">118</span><span id="line-118">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
+<span class="source-line-no">119</span><span id="line-119">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
+<span class="source-line-no">120</span><span id="line-120"></span>
+<span class="source-line-no">121</span><span id="line-121">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
+<span class="source-line-no">122</span><span id="line-122"></span>
+<span class="source-line-no">123</span><span id="line-123">  protected RpcServer createRpcServer(Server server, String name,</span>
+<span class="source-line-no">124</span><span id="line-124">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
+<span class="source-line-no">125</span><span id="line-125">    RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">126</span><span id="line-126">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">127</span><span id="line-127">  }</span>
+<span class="source-line-no">128</span><span id="line-128"></span>
+<span class="source-line-no">129</span><span id="line-129">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
+<span class="source-line-no">130</span><span id="line-130">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">131</span><span id="line-131">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">132</span><span id="line-132">  }</span>
+<span class="source-line-no">133</span><span id="line-133"></span>
+<span class="source-line-no">134</span><span id="line-134">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
+<span class="source-line-no">135</span><span id="line-135"></span>
+<span class="source-line-no">136</span><span id="line-136">  @RegisterExtension</span>
+<span class="source-line-no">137</span><span id="line-137">  private static final OpenTelemetryExtension OTEL_EXT = OpenTelemetryExtension.create();</span>
+<span class="source-line-no">138</span><span id="line-138"></span>
+<span class="source-line-no">139</span><span id="line-139">  private Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
 <span class="source-line-no">140</span><span id="line-140"></span>
-<span class="source-line-no">141</span><span id="line-141">  @Before</span>
-<span class="source-line-no">142</span><span id="line-142">  public void setUpBeforeTest() {</span>
-<span class="source-line-no">143</span><span id="line-143">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
-<span class="source-line-no">144</span><span id="line-144">  }</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">  /**</span>
-<span class="source-line-no">147</span><span id="line-147">   * Ensure we do not HAVE TO HAVE a codec.</span>
-<span class="source-line-no">148</span><span id="line-148">   */</span>
-<span class="source-line-no">149</span><span id="line-149">  @Test</span>
-<span class="source-line-no">150</span><span id="line-150">  public void testNoCodec() throws IOException, ServiceException {</span>
-<span class="source-line-no">151</span><span id="line-151">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">152</span><span id="line-152">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">153</span><span id="line-153">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">154</span><span id="line-154">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">155</span><span id="line-155">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
-<span class="source-line-no">156</span><span id="line-156">      rpcServer.start();</span>
-<span class="source-line-no">157</span><span id="line-157">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">158</span><span id="line-158">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">159</span><span id="line-159">      String message = "hello";</span>
-<span class="source-line-no">160</span><span id="line-160">      assertEquals(message,</span>
-<span class="source-line-no">161</span><span id="line-161">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">162</span><span id="line-162">      assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">163</span><span id="line-163">    } finally {</span>
-<span class="source-line-no">164</span><span id="line-164">      rpcServer.stop();</span>
-<span class="source-line-no">165</span><span id="line-165">    }</span>
-<span class="source-line-no">166</span><span id="line-166">  }</span>
-<span class="source-line-no">167</span><span id="line-167"></span>
-<span class="source-line-no">168</span><span id="line-168">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
-<span class="source-line-no">169</span><span id="line-169"></span>
-<span class="source-line-no">170</span><span id="line-170">  /**</span>
-<span class="source-line-no">171</span><span id="line-171">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
-<span class="source-line-no">172</span><span id="line-172">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
-<span class="source-line-no">173</span><span id="line-173">   * confirm that compression is happening down in the client and server).</span>
-<span class="source-line-no">174</span><span id="line-174">   */</span>
-<span class="source-line-no">175</span><span id="line-175">  @Test</span>
-<span class="source-line-no">176</span><span id="line-176">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
-<span class="source-line-no">177</span><span id="line-177">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">178</span><span id="line-178">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
-<span class="source-line-no">179</span><span id="line-179">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">180</span><span id="line-180">    int count = 3;</span>
-<span class="source-line-no">181</span><span id="line-181">    for (int i = 0; i &lt; count; i++) {</span>
-<span class="source-line-no">182</span><span id="line-182">      cells.add(CELL);</span>
-<span class="source-line-no">183</span><span id="line-183">    }</span>
-<span class="source-line-no">184</span><span id="line-184">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">185</span><span id="line-185">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">186</span><span id="line-186">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">189</span><span id="line-189">      rpcServer.start();</span>
-<span class="source-line-no">190</span><span id="line-190">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">191</span><span id="line-191">      HBaseRpcController pcrc =</span>
-<span class="source-line-no">192</span><span id="line-192">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
-<span class="source-line-no">193</span><span id="line-193">      String message = "hello";</span>
-<span class="source-line-no">194</span><span id="line-194">      assertEquals(message,</span>
-<span class="source-line-no">195</span><span id="line-195">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">196</span><span id="line-196">      int index = 0;</span>
-<span class="source-line-no">197</span><span id="line-197">      CellScanner cellScanner = pcrc.cellScanner();</span>
-<span class="source-line-no">198</span><span id="line-198">      assertNotNull(cellScanner);</span>
-<span class="source-line-no">199</span><span id="line-199">      while (cellScanner.advance()) {</span>
-<span class="source-line-no">200</span><span id="line-200">        assertEquals(CELL, cellScanner.current());</span>
-<span class="source-line-no">201</span><span id="line-201">        index++;</span>
-<span class="source-line-no">202</span><span id="line-202">      }</span>
-<span class="source-line-no">203</span><span id="line-203">      assertEquals(count, index);</span>
-<span class="source-line-no">204</span><span id="line-204">    } finally {</span>
-<span class="source-line-no">205</span><span id="line-205">      rpcServer.stop();</span>
-<span class="source-line-no">206</span><span id="line-206">    }</span>
-<span class="source-line-no">207</span><span id="line-207">  }</span>
-<span class="source-line-no">208</span><span id="line-208"></span>
-<span class="source-line-no">209</span><span id="line-209">  protected abstract AbstractRpcClient&lt;?&gt;</span>
-<span class="source-line-no">210</span><span id="line-210">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
-<span class="source-line-no">211</span><span id="line-211"></span>
-<span class="source-line-no">212</span><span id="line-212">  @Test</span>
-<span class="source-line-no">213</span><span id="line-213">  public void testRTEDuringConnectionSetup() throws Exception {</span>
-<span class="source-line-no">214</span><span id="line-214">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">215</span><span id="line-215">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">216</span><span id="line-216">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">217</span><span id="line-217">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">218</span><span id="line-218">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
-<span class="source-line-no">219</span><span id="line-219">      rpcServer.start();</span>
-<span class="source-line-no">220</span><span id="line-220">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">221</span><span id="line-221">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">222</span><span id="line-222">      fail("Expected an exception to have been thrown!");</span>
-<span class="source-line-no">223</span><span id="line-223">    } catch (Exception e) {</span>
-<span class="source-line-no">224</span><span id="line-224">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">225</span><span id="line-225">      assertTrue(e.toString(), StringUtils.stringifyException(e).contains("Injected fault"));</span>
-<span class="source-line-no">226</span><span id="line-226">    } finally {</span>
-<span class="source-line-no">227</span><span id="line-227">      rpcServer.stop();</span>
-<span class="source-line-no">228</span><span id="line-228">    }</span>
-<span class="source-line-no">229</span><span id="line-229">  }</span>
-<span class="source-line-no">230</span><span id="line-230"></span>
-<span class="source-line-no">231</span><span id="line-231">  /**</span>
-<span class="source-line-no">232</span><span id="line-232">   * Tests that the rpc scheduler is called when requests arrive.</span>
-<span class="source-line-no">233</span><span id="line-233">   */</span>
-<span class="source-line-no">234</span><span id="line-234">  @Test</span>
-<span class="source-line-no">235</span><span id="line-235">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
-<span class="source-line-no">236</span><span id="line-236">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">237</span><span id="line-237">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">238</span><span id="line-238">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">239</span><span id="line-239">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">240</span><span id="line-240">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
-<span class="source-line-no">241</span><span id="line-241">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
-<span class="source-line-no">242</span><span id="line-242">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">243</span><span id="line-243">      rpcServer.start();</span>
-<span class="source-line-no">244</span><span id="line-244">      verify(scheduler).start();</span>
-<span class="source-line-no">245</span><span id="line-245">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">246</span><span id="line-246">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">247</span><span id="line-247">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">248</span><span id="line-248">        stub.echo(null, param);</span>
-<span class="source-line-no">249</span><span id="line-249">      }</span>
-<span class="source-line-no">250</span><span id="line-250">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
-<span class="source-line-no">251</span><span id="line-251">    } finally {</span>
-<span class="source-line-no">252</span><span id="line-252">      rpcServer.stop();</span>
-<span class="source-line-no">253</span><span id="line-253">      verify(scheduler).stop();</span>
-<span class="source-line-no">254</span><span id="line-254">    }</span>
-<span class="source-line-no">255</span><span id="line-255">  }</span>
-<span class="source-line-no">256</span><span id="line-256"></span>
-<span class="source-line-no">257</span><span id="line-257">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
-<span class="source-line-no">258</span><span id="line-258">  @Test</span>
-<span class="source-line-no">259</span><span id="line-259">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
-<span class="source-line-no">260</span><span id="line-260">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">261</span><span id="line-261">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
-<span class="source-line-no">262</span><span id="line-262">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">263</span><span id="line-263">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">264</span><span id="line-264">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
-<span class="source-line-no">265</span><span id="line-265">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">266</span><span id="line-266">      rpcServer.start();</span>
-<span class="source-line-no">267</span><span id="line-267">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">268</span><span id="line-268">      StringBuilder message = new StringBuilder(1200);</span>
-<span class="source-line-no">269</span><span id="line-269">      for (int i = 0; i &lt; 200; i++) {</span>
-<span class="source-line-no">270</span><span id="line-270">        message.append("hello.");</span>
-<span class="source-line-no">271</span><span id="line-271">      }</span>
-<span class="source-line-no">272</span><span id="line-272">      // set total RPC size bigger than 100 bytes</span>
-<span class="source-line-no">273</span><span id="line-273">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
-<span class="source-line-no">274</span><span id="line-274">      stub.echo(new HBaseRpcControllerImpl(</span>
-<span class="source-line-no">275</span><span id="line-275">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
-<span class="source-line-no">276</span><span id="line-276">      fail("RPC should have failed because it exceeds max request size");</span>
-<span class="source-line-no">277</span><span id="line-277">    } catch (ServiceException e) {</span>
-<span class="source-line-no">278</span><span id="line-278">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">279</span><span id="line-279">      assertTrue(e.toString(),</span>
-<span class="source-line-no">280</span><span id="line-280">        StringUtils.stringifyException(e).contains("RequestTooBigException"));</span>
-<span class="source-line-no">281</span><span id="line-281">    } finally {</span>
-<span class="source-line-no">282</span><span id="line-282">      rpcServer.stop();</span>
-<span class="source-line-no">283</span><span id="line-283">    }</span>
-<span class="source-line-no">284</span><span id="line-284">  }</span>
-<span class="source-line-no">285</span><span id="line-285"></span>
-<span class="source-line-no">286</span><span id="line-286">  /**</span>
-<span class="source-line-no">287</span><span id="line-287">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
-<span class="source-line-no">288</span><span id="line-288">   * remoteAddress set to its Call Object</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  @Test</span>
-<span class="source-line-no">291</span><span id="line-291">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
-<span class="source-line-no">292</span><span id="line-292">    throws IOException, ServiceException {</span>
-<span class="source-line-no">293</span><span id="line-293">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">294</span><span id="line-294">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">295</span><span id="line-295">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">296</span><span id="line-296">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">297</span><span id="line-297">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
-<span class="source-line-no">298</span><span id="line-298">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">299</span><span id="line-299">      rpcServer.start();</span>
-<span class="source-line-no">300</span><span id="line-300">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">301</span><span id="line-301">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
-<span class="source-line-no">302</span><span id="line-302">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
-<span class="source-line-no">303</span><span id="line-303">    } finally {</span>
-<span class="source-line-no">304</span><span id="line-304">      rpcServer.stop();</span>
-<span class="source-line-no">305</span><span id="line-305">    }</span>
-<span class="source-line-no">306</span><span id="line-306">  }</span>
-<span class="source-line-no">307</span><span id="line-307"></span>
-<span class="source-line-no">308</span><span id="line-308">  @Test</span>
-<span class="source-line-no">309</span><span id="line-309">  public void testRemoteError() throws IOException, ServiceException {</span>
-<span class="source-line-no">310</span><span id="line-310">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">311</span><span id="line-311">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">312</span><span id="line-312">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">313</span><span id="line-313">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">314</span><span id="line-314">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">315</span><span id="line-315">      rpcServer.start();</span>
-<span class="source-line-no">316</span><span id="line-316">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">317</span><span id="line-317">      stub.error(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">318</span><span id="line-318">    } catch (ServiceException e) {</span>
-<span class="source-line-no">319</span><span id="line-319">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">320</span><span id="line-320">      IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">321</span><span id="line-321">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">322</span><span id="line-322">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">323</span><span id="line-323">    } finally {</span>
-<span class="source-line-no">324</span><span id="line-324">      rpcServer.stop();</span>
-<span class="source-line-no">325</span><span id="line-325">    }</span>
-<span class="source-line-no">326</span><span id="line-326">  }</span>
-<span class="source-line-no">327</span><span id="line-327"></span>
-<span class="source-line-no">328</span><span id="line-328">  @Test</span>
-<span class="source-line-no">329</span><span id="line-329">  public void testTimeout() throws IOException {</span>
-<span class="source-line-no">330</span><span id="line-330">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">331</span><span id="line-331">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">332</span><span id="line-332">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">333</span><span id="line-333">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">334</span><span id="line-334">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">335</span><span id="line-335">      rpcServer.start();</span>
-<span class="source-line-no">336</span><span id="line-336">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">337</span><span id="line-337">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">338</span><span id="line-338">      int ms = 1000;</span>
-<span class="source-line-no">339</span><span id="line-339">      int timeout = 100;</span>
-<span class="source-line-no">340</span><span id="line-340">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">341</span><span id="line-341">        pcrc.reset();</span>
-<span class="source-line-no">342</span><span id="line-342">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">343</span><span id="line-343">        long startTime = System.nanoTime();</span>
-<span class="source-line-no">344</span><span id="line-344">        try {</span>
-<span class="source-line-no">345</span><span id="line-345">          stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build());</span>
-<span class="source-line-no">346</span><span id="line-346">        } catch (ServiceException e) {</span>
-<span class="source-line-no">347</span><span id="line-347">          long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">348</span><span id="line-348">          // expected</span>
-<span class="source-line-no">349</span><span id="line-349">          LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">350</span><span id="line-350">          IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">351</span><span id="line-351">          assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">352</span><span id="line-352">          // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">353</span><span id="line-353">          assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">354</span><span id="line-354">        }</span>
-<span class="source-line-no">355</span><span id="line-355">      }</span>
-<span class="source-line-no">356</span><span id="line-356">    } finally {</span>
-<span class="source-line-no">357</span><span id="line-357">      rpcServer.stop();</span>
-<span class="source-line-no">358</span><span id="line-358">    }</span>
-<span class="source-line-no">359</span><span id="line-359">  }</span>
-<span class="source-line-no">360</span><span id="line-360"></span>
-<span class="source-line-no">361</span><span id="line-361">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
-<span class="source-line-no">362</span><span id="line-362"></span>
-<span class="source-line-no">363</span><span id="line-363">    FailingSimpleRpcServer(Server server, String name,</span>
-<span class="source-line-no">364</span><span id="line-364">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
-<span class="source-line-no">365</span><span id="line-365">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">366</span><span id="line-366">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
-<span class="source-line-no">367</span><span id="line-367">    }</span>
+<span class="source-line-no">141</span><span id="line-141">  protected AbstractTestIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl) {</span>
+<span class="source-line-no">142</span><span id="line-142">    this.rpcServerImpl = rpcServerImpl;</span>
+<span class="source-line-no">143</span><span id="line-143">  }</span>
+<span class="source-line-no">144</span><span id="line-144"></span>
+<span class="source-line-no">145</span><span id="line-145">  @BeforeEach</span>
+<span class="source-line-no">146</span><span id="line-146">  public void setUpBeforeTest() {</span>
+<span class="source-line-no">147</span><span id="line-147">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
+<span class="source-line-no">148</span><span id="line-148">  }</span>
+<span class="source-line-no">149</span><span id="line-149"></span>
+<span class="source-line-no">150</span><span id="line-150">  /**</span>
+<span class="source-line-no">151</span><span id="line-151">   * Ensure we do not HAVE TO HAVE a codec.</span>
+<span class="source-line-no">152</span><span id="line-152">   */</span>
+<span class="source-line-no">153</span><span id="line-153">  @TestTemplate</span>
+<span class="source-line-no">154</span><span id="line-154">  public void testNoCodec() throws IOException, ServiceException {</span>
+<span class="source-line-no">155</span><span id="line-155">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">156</span><span id="line-156">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">157</span><span id="line-157">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">158</span><span id="line-158">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">159</span><span id="line-159">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
+<span class="source-line-no">160</span><span id="line-160">      rpcServer.start();</span>
+<span class="source-line-no">161</span><span id="line-161">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">162</span><span id="line-162">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">163</span><span id="line-163">      String message = "hello";</span>
+<span class="source-line-no">164</span><span id="line-164">      assertEquals(message,</span>
+<span class="source-line-no">165</span><span id="line-165">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">166</span><span id="line-166">      assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">167</span><span id="line-167">    } finally {</span>
+<span class="source-line-no">168</span><span id="line-168">      rpcServer.stop();</span>
+<span class="source-line-no">169</span><span id="line-169">    }</span>
+<span class="source-line-no">170</span><span id="line-170">  }</span>
+<span class="source-line-no">171</span><span id="line-171"></span>
+<span class="source-line-no">172</span><span id="line-172">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
+<span class="source-line-no">173</span><span id="line-173"></span>
+<span class="source-line-no">174</span><span id="line-174">  /**</span>
+<span class="source-line-no">175</span><span id="line-175">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
+<span class="source-line-no">176</span><span id="line-176">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
+<span class="source-line-no">177</span><span id="line-177">   * confirm that compression is happening down in the client and server).</span>
+<span class="source-line-no">178</span><span id="line-178">   */</span>
+<span class="source-line-no">179</span><span id="line-179">  @TestTemplate</span>
+<span class="source-line-no">180</span><span id="line-180">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
+<span class="source-line-no">181</span><span id="line-181">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">182</span><span id="line-182">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
+<span class="source-line-no">183</span><span id="line-183">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">184</span><span id="line-184">    int count = 3;</span>
+<span class="source-line-no">185</span><span id="line-185">    for (int i = 0; i &lt; count; i++) {</span>
+<span class="source-line-no">186</span><span id="line-186">      cells.add(CELL);</span>
+<span class="source-line-no">187</span><span id="line-187">    }</span>
+<span class="source-line-no">188</span><span id="line-188">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">189</span><span id="line-189">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">190</span><span id="line-190">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">191</span><span id="line-191"></span>
+<span class="source-line-no">192</span><span id="line-192">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">193</span><span id="line-193">      rpcServer.start();</span>
+<span class="source-line-no">194</span><span id="line-194">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">195</span><span id="line-195">      HBaseRpcController pcrc =</span>
+<span class="source-line-no">196</span><span id="line-196">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
+<span class="source-line-no">197</span><span id="line-197">      String message = "hello";</span>
+<span class="source-line-no">198</span><span id="line-198">      assertEquals(message,</span>
+<span class="source-line-no">199</span><span id="line-199">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">200</span><span id="line-200">      int index = 0;</span>
+<span class="source-line-no">201</span><span id="line-201">      CellScanner cellScanner = pcrc.cellScanner();</span>
+<span class="source-line-no">202</span><span id="line-202">      assertNotNull(cellScanner);</span>
+<span class="source-line-no">203</span><span id="line-203">      while (cellScanner.advance()) {</span>
+<span class="source-line-no">204</span><span id="line-204">        assertEquals(CELL, cellScanner.current());</span>
+<span class="source-line-no">205</span><span id="line-205">        index++;</span>
+<span class="source-line-no">206</span><span id="line-206">      }</span>
+<span class="source-line-no">207</span><span id="line-207">      assertEquals(count, index);</span>
+<span class="source-line-no">208</span><span id="line-208">    } finally {</span>
+<span class="source-line-no">209</span><span id="line-209">      rpcServer.stop();</span>
+<span class="source-line-no">210</span><span id="line-210">    }</span>
+<span class="source-line-no">211</span><span id="line-211">  }</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">  protected abstract AbstractRpcClient&lt;?&gt;</span>
+<span class="source-line-no">214</span><span id="line-214">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
+<span class="source-line-no">215</span><span id="line-215"></span>
+<span class="source-line-no">216</span><span id="line-216">  @TestTemplate</span>
+<span class="source-line-no">217</span><span id="line-217">  public void testRTEDuringConnectionSetup() throws Exception {</span>
+<span class="source-line-no">218</span><span id="line-218">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">219</span><span id="line-219">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">220</span><span id="line-220">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">221</span><span id="line-221">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">222</span><span id="line-222">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
+<span class="source-line-no">223</span><span id="line-223">      rpcServer.start();</span>
+<span class="source-line-no">224</span><span id="line-224">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">225</span><span id="line-225">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
+<span class="source-line-no">226</span><span id="line-226">      fail("Expected an exception to have been thrown!");</span>
+<span class="source-line-no">227</span><span id="line-227">    } catch (Exception e) {</span>
+<span class="source-line-no">228</span><span id="line-228">      LOG.info("Caught expected exception: " + e.toString());</span>
+<span class="source-line-no">229</span><span id="line-229">      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"), e.toString());</span>
+<span class="source-line-no">230</span><span id="line-230">    } finally {</span>
+<span class="source-line-no">231</span><span id="line-231">      rpcServer.stop();</span>
+<span class="source-line-no">232</span><span id="line-232">    }</span>
+<span class="source-line-no">233</span><span id="line-233">  }</span>
+<span class="source-line-no">234</span><span id="line-234"></span>
+<span class="source-line-no">235</span><span id="line-235">  /**</span>
+<span class="source-line-no">236</span><span id="line-236">   * Tests that the rpc scheduler is called when requests arrive.</span>
+<span class="source-line-no">237</span><span id="line-237">   */</span>
+<span class="source-line-no">238</span><span id="line-238">  @TestTemplate</span>
+<span class="source-line-no">239</span><span id="line-239">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
+<span class="source-line-no">240</span><span id="line-240">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">241</span><span id="line-241">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">242</span><span id="line-242">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">243</span><span id="line-243">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">244</span><span id="line-244">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
+<span class="source-line-no">245</span><span id="line-245">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
+<span class="source-line-no">246</span><span id="line-246">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">247</span><span id="line-247">      rpcServer.start();</span>
+<span class="source-line-no">248</span><span id="line-248">      verify(scheduler).start();</span>
+<span class="source-line-no">249</span><span id="line-249">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">250</span><span id="line-250">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">251</span><span id="line-251">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">252</span><span id="line-252">        stub.echo(null, param);</span>
+<span class="source-line-no">253</span><span id="line-253">      }</span>
+<span class="source-line-no">254</span><span id="line-254">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
+<span class="source-line-no">255</span><span id="line-255">    } finally {</span>
+<span class="source-line-no">256</span><span id="line-256">      rpcServer.stop();</span>
+<span class="source-line-no">257</span><span id="line-257">      verify(scheduler).stop();</span>
+<span class="source-line-no">258</span><span id="line-258">    }</span>
+<span class="source-line-no">259</span><span id="line-259">  }</span>
+<span class="source-line-no">260</span><span id="line-260"></span>
+<span class="source-line-no">261</span><span id="line-261">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
+<span class="source-line-no">262</span><span id="line-262">  @TestTemplate</span>
+<span class="source-line-no">263</span><span id="line-263">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
+<span class="source-line-no">264</span><span id="line-264">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">265</span><span id="line-265">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
+<span class="source-line-no">266</span><span id="line-266">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">267</span><span id="line-267">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">268</span><span id="line-268">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
+<span class="source-line-no">269</span><span id="line-269">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">270</span><span id="line-270">      rpcServer.start();</span>
+<span class="source-line-no">271</span><span id="line-271">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">272</span><span id="line-272">      StringBuilder message = new StringBuilder(1200);</span>
+<span class="source-line-no">273</span><span id="line-273">      for (int i = 0; i &lt; 200; i++) {</span>
+<span class="source-line-no">274</span><span id="line-274">        message.append("hello.");</span>
+<span class="source-line-no">275</span><span id="line-275">      }</span>
+<span class="source-line-no">276</span><span id="line-276">      // set total RPC size bigger than 100 bytes</span>
+<span class="source-line-no">277</span><span id="line-277">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
+<span class="source-line-no">278</span><span id="line-278">      stub.echo(new HBaseRpcControllerImpl(</span>
+<span class="source-line-no">279</span><span id="line-279">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
+<span class="source-line-no">280</span><span id="line-280">      fail("RPC should have failed because it exceeds max request size");</span>
+<span class="source-line-no">281</span><span id="line-281">    } catch (ServiceException e) {</span>
+<span class="source-line-no">282</span><span id="line-282">      LOG.info("Caught expected exception: " + e);</span>
+<span class="source-line-no">283</span><span id="line-283">      assertTrue(StringUtils.stringifyException(e).contains("RequestTooBigException"),</span>
+<span class="source-line-no">284</span><span id="line-284">        e.toString());</span>
+<span class="source-line-no">285</span><span id="line-285">    } finally {</span>
+<span class="source-line-no">286</span><span id="line-286">      rpcServer.stop();</span>
+<span class="source-line-no">287</span><span id="line-287">    }</span>
+<span class="source-line-no">288</span><span id="line-288">  }</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
+<span class="source-line-no">292</span><span id="line-292">   * remoteAddress set to its Call Object</span>
+<span class="source-line-no">293</span><span id="line-293">   */</span>
+<span class="source-line-no">294</span><span id="line-294">  @TestTemplate</span>
+<span class="source-line-no">295</span><span id="line-295">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
+<span class="source-line-no">296</span><span id="line-296">    throws IOException, ServiceException {</span>
+<span class="source-line-no">297</span><span id="line-297">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">298</span><span id="line-298">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">299</span><span id="line-299">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">300</span><span id="line-300">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">301</span><span id="line-301">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
+<span class="source-line-no">302</span><span id="line-302">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">303</span><span id="line-303">      rpcServer.start();</span>
+<span class="source-line-no">304</span><span id="line-304">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">305</span><span id="line-305">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
+<span class="source-line-no">306</span><span id="line-306">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
+<span class="source-line-no">307</span><span id="line-307">    } finally {</span>
+<span class="source-line-no">308</span><span id="line-308">      rpcServer.stop();</span>
+<span class="source-line-no">309</span><span id="line-309">    }</span>
+<span class="source-line-no">310</span><span id="line-310">  }</span>
+<span class="source-line-no">311</span><span id="line-311"></span>
+<span class="source-line-no">312</span><span id="line-312">  @TestTemplate</span>
+<span class="source-line-no">313</span><span id="line-313">  public void testRemoteError() throws IOException, ServiceException {</span>
+<span class="source-line-no">314</span><span id="line-314">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">315</span><span id="line-315">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">316</span><span id="line-316">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">317</span><span id="line-317">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">318</span><span id="line-318">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">319</span><span id="line-319">      rpcServer.start();</span>
+<span class="source-line-no">320</span><span id="line-320">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">321</span><span id="line-321">      ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">322</span><span id="line-322">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">323</span><span id="line-323">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">324</span><span id="line-324">      IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">325</span><span id="line-325">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">326</span><span id="line-326">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">327</span><span id="line-327">    } finally {</span>
+<span class="source-line-no">328</span><span id="line-328">      rpcServer.stop();</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330">  }</span>
+<span class="source-line-no">331</span><span id="line-331"></span>
+<span class="source-line-no">332</span><span id="line-332">  @TestTemplate</span>
+<span class="source-line-no">333</span><span id="line-333">  public void testTimeout() throws IOException {</span>
+<span class="source-line-no">334</span><span id="line-334">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">335</span><span id="line-335">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">336</span><span id="line-336">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">337</span><span id="line-337">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">338</span><span id="line-338">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">339</span><span id="line-339">      rpcServer.start();</span>
+<span class="source-line-no">340</span><span id="line-340">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">341</span><span id="line-341">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">342</span><span id="line-342">      int ms = 1000;</span>
+<span class="source-line-no">343</span><span id="line-343">      int timeout = 100;</span>
+<span class="source-line-no">344</span><span id="line-344">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">345</span><span id="line-345">        pcrc.reset();</span>
+<span class="source-line-no">346</span><span id="line-346">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">347</span><span id="line-347">        long startTime = System.nanoTime();</span>
+<span class="source-line-no">348</span><span id="line-348">        ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">349</span><span id="line-349">          () -&gt; stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build()));</span>
+<span class="source-line-no">350</span><span id="line-350">        long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">351</span><span id="line-351">        // expected</span>
+<span class="source-line-no">352</span><span id="line-352">        LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">353</span><span id="line-353">        IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">354</span><span id="line-354">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">355</span><span id="line-355">        // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">356</span><span id="line-356">        assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">357</span><span id="line-357">      }</span>
+<span class="source-line-no">358</span><span id="line-358">    } finally {</span>
+<span class="source-line-no">359</span><span id="line-359">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">360</span><span id="line-360">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">361</span><span id="line-361">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">362</span><span id="line-362">      rpcServer.stop();</span>
+<span class="source-line-no">363</span><span id="line-363">    }</span>
+<span class="source-line-no">364</span><span id="line-364">  }</span>
+<span class="source-line-no">365</span><span id="line-365"></span>
+<span class="source-line-no">366</span><span id="line-366">  @SuppressWarnings("deprecation")</span>
+<span class="source-line-no">367</span><span id="line-367">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
 <span class="source-line-no">368</span><span id="line-368"></span>
-<span class="source-line-no">369</span><span id="line-369">    final class FailingConnection extends SimpleServerRpcConnection {</span>
-<span class="source-line-no">370</span><span id="line-370">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
-<span class="source-line-no">371</span><span id="line-371">        long lastContact) {</span>
-<span class="source-line-no">372</span><span id="line-372">        super(rpcServer, channel, lastContact);</span>
-<span class="source-line-no">373</span><span id="line-373">      }</span>
+<span class="source-line-no">369</span><span id="line-369">    FailingSimpleRpcServer(Server server, String name,</span>
+<span class="source-line-no">370</span><span id="line-370">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
+<span class="source-line-no">371</span><span id="line-371">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">372</span><span id="line-372">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
+<span class="source-line-no">373</span><span id="line-373">    }</span>
 <span class="source-line-no">374</span><span id="line-374"></span>
-<span class="source-line-no">375</span><span id="line-375">      @Override</span>
-<span class="source-line-no">376</span><span id="line-376">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
-<span class="source-line-no">377</span><span id="line-377">        // this will throw exception after the connection header is read, and an RPC is sent</span>
-<span class="source-line-no">378</span><span id="line-378">        // from client</span>
-<span class="source-line-no">379</span><span id="line-379">        throw new DoNotRetryIOException("Failing for test");</span>
-<span class="source-line-no">380</span><span id="line-380">      }</span>
-<span class="source-line-no">381</span><span id="line-381">    }</span>
-<span class="source-line-no">382</span><span id="line-382"></span>
-<span class="source-line-no">383</span><span id="line-383">    @Override</span>
-<span class="source-line-no">384</span><span id="line-384">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
-<span class="source-line-no">385</span><span id="line-385">      return new FailingConnection(this, channel, time);</span>
-<span class="source-line-no">386</span><span id="line-386">    }</span>
-<span class="source-line-no">387</span><span id="line-387">  }</span>
+<span class="source-line-no">375</span><span id="line-375">    final class FailingConnection extends SimpleServerRpcConnection {</span>
+<span class="source-line-no">376</span><span id="line-376">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
+<span class="source-line-no">377</span><span id="line-377">        long lastContact) {</span>
+<span class="source-line-no">378</span><span id="line-378">        super(rpcServer, channel, lastContact);</span>
+<span class="source-line-no">379</span><span id="line-379">      }</span>
+<span class="source-line-no">380</span><span id="line-380"></span>
+<span class="source-line-no">381</span><span id="line-381">      @Override</span>
+<span class="source-line-no">382</span><span id="line-382">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
+<span class="source-line-no">383</span><span id="line-383">        // this will throw exception after the connection header is read, and an RPC is sent</span>
+<span class="source-line-no">384</span><span id="line-384">        // from client</span>
+<span class="source-line-no">385</span><span id="line-385">        throw new DoNotRetryIOException("Failing for test");</span>
+<span class="source-line-no">386</span><span id="line-386">      }</span>
+<span class="source-line-no">387</span><span id="line-387">    }</span>
 <span class="source-line-no">388</span><span id="line-388"></span>
-<span class="source-line-no">389</span><span id="line-389">  protected RpcServer createTestFailingRpcServer(final String name,</span>
-<span class="source-line-no">390</span><span id="line-390">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
-<span class="source-line-no">391</span><span id="line-391">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">392</span><span id="line-392">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
-<span class="source-line-no">393</span><span id="line-393">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">394</span><span id="line-394">    } else {</span>
-<span class="source-line-no">395</span><span id="line-395">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">396</span><span id="line-396">    }</span>
-<span class="source-line-no">397</span><span id="line-397">  }</span>
-<span class="source-line-no">398</span><span id="line-398"></span>
-<span class="source-line-no">399</span><span id="line-399">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
-<span class="source-line-no">400</span><span id="line-400">  @Test</span>
-<span class="source-line-no">401</span><span id="line-401">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
-<span class="source-line-no">402</span><span id="line-402">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">403</span><span id="line-403">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
-<span class="source-line-no">404</span><span id="line-404">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">405</span><span id="line-405">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">406</span><span id="line-406"></span>
-<span class="source-line-no">407</span><span id="line-407">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">408</span><span id="line-408">      rpcServer.start();</span>
-<span class="source-line-no">409</span><span id="line-409">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">410</span><span id="line-410">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">411</span><span id="line-411">      stub.echo(null, param);</span>
-<span class="source-line-no">412</span><span id="line-412">      fail("RPC should have failed because connection closed");</span>
-<span class="source-line-no">413</span><span id="line-413">    } catch (ServiceException e) {</span>
-<span class="source-line-no">414</span><span id="line-414">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">415</span><span id="line-415">    } finally {</span>
-<span class="source-line-no">416</span><span id="line-416">      rpcServer.stop();</span>
-<span class="source-line-no">417</span><span id="line-417">    }</span>
-<span class="source-line-no">418</span><span id="line-418">  }</span>
-<span class="source-line-no">419</span><span id="line-419"></span>
-<span class="source-line-no">420</span><span id="line-420">  @Test</span>
-<span class="source-line-no">421</span><span id="line-421">  public void testAsyncEcho() throws IOException {</span>
-<span class="source-line-no">422</span><span id="line-422">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">423</span><span id="line-423">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">424</span><span id="line-424">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">425</span><span id="line-425">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">426</span><span id="line-426">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">427</span><span id="line-427">      rpcServer.start();</span>
-<span class="source-line-no">428</span><span id="line-428">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">429</span><span id="line-429">      int num = 10;</span>
-<span class="source-line-no">430</span><span id="line-430">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">431</span><span id="line-431">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">432</span><span id="line-432">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">433</span><span id="line-433">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">434</span><span id="line-434">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">435</span><span id="line-435">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
-<span class="source-line-no">436</span><span id="line-436">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">437</span><span id="line-437">        callbackList.add(done);</span>
-<span class="source-line-no">438</span><span id="line-438">      }</span>
-<span class="source-line-no">439</span><span id="line-439">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">440</span><span id="line-440">        EchoResponseProto resp = callbackList.get(i).get();</span>
-<span class="source-line-no">441</span><span id="line-441">        HBaseRpcController pcrc = pcrcList.get(i);</span>
-<span class="source-line-no">442</span><span id="line-442">        assertEquals("hello-" + i, resp.getMessage());</span>
-<span class="source-line-no">443</span><span id="line-443">        assertFalse(pcrc.failed());</span>
-<span class="source-line-no">444</span><span id="line-444">        assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">445</span><span id="line-445">      }</span>
-<span class="source-line-no">446</span><span id="line-446">    } finally {</span>
-<span class="source-line-no">447</span><span id="line-447">      rpcServer.stop();</span>
-<span class="source-line-no">448</span><span id="line-448">    }</span>
-<span class="source-line-no">449</span><span id="line-449">  }</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">  @Test</span>
-<span class="source-line-no">452</span><span id="line-452">  public void testAsyncRemoteError() throws IOException {</span>
-<span class="source-line-no">453</span><span id="line-453">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">454</span><span id="line-454">    AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf);</span>
-<span class="source-line-no">455</span><span id="line-455">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">456</span><span id="line-456">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">457</span><span id="line-457">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">458</span><span id="line-458">    try {</span>
-<span class="source-line-no">459</span><span id="line-459">      rpcServer.start();</span>
-<span class="source-line-no">460</span><span id="line-460">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">461</span><span id="line-461">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">462</span><span id="line-462">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">463</span><span id="line-463">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
-<span class="source-line-no">464</span><span id="line-464">      assertNull(callback.get());</span>
-<span class="source-line-no">465</span><span id="line-465">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">466</span><span id="line-466">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">467</span><span id="line-467">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">468</span><span id="line-468">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">469</span><span id="line-469">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">470</span><span id="line-470">    } finally {</span>
-<span class="source-line-no">471</span><span id="line-471">      client.close();</span>
-<span class="source-line-no">472</span><span id="line-472">      rpcServer.stop();</span>
-<span class="source-line-no">473</span><span id="line-473">    }</span>
-<span class="source-line-no">474</span><span id="line-474">  }</span>
-<span class="source-line-no">475</span><span id="line-475"></span>
-<span class="source-line-no">476</span><span id="line-476">  @Test</span>
-<span class="source-line-no">477</span><span id="line-477">  public void testAsyncTimeout() throws IOException {</span>
-<span class="source-line-no">478</span><span id="line-478">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">479</span><span id="line-479">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">480</span><span id="line-480">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">481</span><span id="line-481">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">482</span><span id="line-482">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">483</span><span id="line-483">      rpcServer.start();</span>
-<span class="source-line-no">484</span><span id="line-484">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">485</span><span id="line-485">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">486</span><span id="line-486">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">487</span><span id="line-487">      int ms = 1000;</span>
-<span class="source-line-no">488</span><span id="line-488">      int timeout = 100;</span>
-<span class="source-line-no">489</span><span id="line-489">      long startTime = System.nanoTime();</span>
-<span class="source-line-no">490</span><span id="line-490">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">491</span><span id="line-491">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">492</span><span id="line-492">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">493</span><span id="line-493">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">494</span><span id="line-494">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
-<span class="source-line-no">495</span><span id="line-495">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">496</span><span id="line-496">        callbackList.add(callback);</span>
-<span class="source-line-no">497</span><span id="line-497">      }</span>
-<span class="source-line-no">498</span><span id="line-498">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
-<span class="source-line-no">499</span><span id="line-499">        assertNull(callback.get());</span>
-<span class="source-line-no">500</span><span id="line-500">      }</span>
-<span class="source-line-no">501</span><span id="line-501">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">502</span><span id="line-502">      for (HBaseRpcController pcrc : pcrcList) {</span>
-<span class="source-line-no">503</span><span id="line-503">        assertTrue(pcrc.failed());</span>
-<span class="source-line-no">504</span><span id="line-504">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">505</span><span id="line-505">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">506</span><span id="line-506">        assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">507</span><span id="line-507">      }</span>
-<span class="source-line-no">508</span><span id="line-508">      // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">509</span><span id="line-509">      assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">510</span><span id="line-510">    } finally {</span>
-<span class="source-line-no">511</span><span id="line-511">      rpcServer.stop();</span>
-<span class="source-line-no">512</span><span id="line-512">    }</span>
-<span class="source-line-no">513</span><span id="line-513">  }</span>
-<span class="source-line-no">514</span><span id="line-514"></span>
-<span class="source-line-no">515</span><span id="line-515">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
-<span class="source-line-no">516</span><span id="line-516">    Waiter.waitFor(CONF, 1000,</span>
-<span class="source-line-no">517</span><span id="line-517">      new MatcherPredicate&lt;&gt;(() -&gt; traceRule.getSpans(), hasItem(matcher)));</span>
-<span class="source-line-no">518</span><span id="line-518">    return traceRule.getSpans().stream().filter(matcher::matches).findFirst()</span>
-<span class="source-line-no">519</span><span id="line-519">      .orElseThrow(AssertionError::new);</span>
-<span class="source-line-no">520</span><span id="line-520">  }</span>
-<span class="source-line-no">521</span><span id="line-521"></span>
-<span class="source-line-no">522</span><span id="line-522">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">523</span><span id="line-523">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">389</span><span id="line-389">    @Override</span>
+<span class="source-line-no">390</span><span id="line-390">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
+<span class="source-line-no">391</span><span id="line-391">      return new FailingConnection(this, channel, time);</span>
+<span class="source-line-no">392</span><span id="line-392">    }</span>
+<span class="source-line-no">393</span><span id="line-393">  }</span>
+<span class="source-line-no">394</span><span id="line-394"></span>
+<span class="source-line-no">395</span><span id="line-395">  protected RpcServer createTestFailingRpcServer(final String name,</span>
+<span class="source-line-no">396</span><span id="line-396">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
+<span class="source-line-no">397</span><span id="line-397">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">398</span><span id="line-398">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
+<span class="source-line-no">399</span><span id="line-399">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">400</span><span id="line-400">    } else {</span>
+<span class="source-line-no">401</span><span id="line-401">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">402</span><span id="line-402">    }</span>
+<span class="source-line-no">403</span><span id="line-403">  }</span>
+<span class="source-line-no">404</span><span id="line-404"></span>
+<span class="source-line-no">405</span><span id="line-405">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
+<span class="source-line-no">406</span><span id="line-406">  @TestTemplate</span>
+<span class="source-line-no">407</span><span id="line-407">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
+<span class="source-line-no">408</span><span id="line-408">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">409</span><span id="line-409">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
+<span class="source-line-no">410</span><span id="line-410">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">411</span><span id="line-411">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">412</span><span id="line-412">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">413</span><span id="line-413">      rpcServer.start();</span>
+<span class="source-line-no">414</span><span id="line-414">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">415</span><span id="line-415">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">416</span><span id="line-416">      ServiceException se = assertThrows(ServiceException.class, () -&gt; stub.echo(null, param),</span>
+<span class="source-line-no">417</span><span id="line-417">        "RPC should have failed because connection closed");</span>
+<span class="source-line-no">418</span><span id="line-418">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">419</span><span id="line-419">    } finally {</span>
+<span class="source-line-no">420</span><span id="line-420">      rpcServer.stop();</span>
+<span class="source-line-no">421</span><span id="line-421">    }</span>
+<span class="source-line-no">422</span><span id="line-422">  }</span>
+<span class="source-line-no">423</span><span id="line-423"></span>
+<span class="source-line-no">424</span><span id="line-424">  @TestTemplate</span>
+<span class="source-line-no">425</span><span id="line-425">  public void testAsyncEcho() throws IOException {</span>
+<span class="source-line-no">426</span><span id="line-426">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">427</span><span id="line-427">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">428</span><span id="line-428">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">429</span><span id="line-429">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">430</span><span id="line-430">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">431</span><span id="line-431">      rpcServer.start();</span>
+<span class="source-line-no">432</span><span id="line-432">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">433</span><span id="line-433">      int num = 10;</span>
+<span class="source-line-no">434</span><span id="line-434">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">435</span><span id="line-435">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">436</span><span id="line-436">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">437</span><span id="line-437">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">438</span><span id="line-438">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">439</span><span id="line-439">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
+<span class="source-line-no">440</span><span id="line-440">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">441</span><span id="line-441">        callbackList.add(done);</span>
+<span class="source-line-no">442</span><span id="line-442">      }</span>
+<span class="source-line-no">443</span><span id="line-443">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">444</span><span id="line-444">        EchoResponseProto resp = callbackList.get(i).get();</span>
+<span class="source-line-no">445</span><span id="line-445">        HBaseRpcController pcrc = pcrcList.get(i);</span>
+<span class="source-line-no">446</span><span id="line-446">        assertEquals("hello-" + i, resp.getMessage());</span>
+<span class="source-line-no">447</span><span id="line-447">        assertFalse(pcrc.failed());</span>
+<span class="source-line-no">448</span><span id="line-448">        assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">449</span><span id="line-449">      }</span>
+<span class="source-line-no">450</span><span id="line-450">    } finally {</span>
+<span class="source-line-no">451</span><span id="line-451">      rpcServer.stop();</span>
+<span class="source-line-no">452</span><span id="line-452">    }</span>
+<span class="source-line-no">453</span><span id="line-453">  }</span>
+<span class="source-line-no">454</span><span id="line-454"></span>
+<span class="source-line-no">455</span><span id="line-455">  @TestTemplate</span>
+<span class="source-line-no">456</span><span id="line-456">  public void testAsyncRemoteError() throws IOException {</span>
+<span class="source-line-no">457</span><span id="line-457">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">458</span><span id="line-458">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">459</span><span id="line-459">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">460</span><span id="line-460">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">461</span><span id="line-461">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">462</span><span id="line-462">      rpcServer.start();</span>
+<span class="source-line-no">463</span><span id="line-463">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">464</span><span id="line-464">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">465</span><span id="line-465">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">466</span><span id="line-466">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
+<span class="source-line-no">467</span><span id="line-467">      assertNull(callback.get());</span>
+<span class="source-line-no">468</span><span id="line-468">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">469</span><span id="line-469">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">470</span><span id="line-470">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">471</span><span id="line-471">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">472</span><span id="line-472">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">473</span><span id="line-473">    } finally {</span>
+<span class="source-line-no">474</span><span id="line-474">      rpcServer.stop();</span>
+<span class="source-line-no">475</span><span id="line-475">    }</span>
+<span class="source-line-no">476</span><span id="line-476">  }</span>
+<span class="source-line-no">477</span><span id="line-477"></span>
+<span class="source-line-no">478</span><span id="line-478">  @TestTemplate</span>
+<span class="source-line-no">479</span><span id="line-479">  public void testAsyncTimeout() throws IOException {</span>
+<span class="source-line-no">480</span><span id="line-480">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">481</span><span id="line-481">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">482</span><span id="line-482">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">483</span><span id="line-483">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">484</span><span id="line-484">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">485</span><span id="line-485">      rpcServer.start();</span>
+<span class="source-line-no">486</span><span id="line-486">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">487</span><span id="line-487">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">488</span><span id="line-488">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">489</span><span id="line-489">      int ms = 1000;</span>
+<span class="source-line-no">490</span><span id="line-490">      int timeout = 100;</span>
+<span class="source-line-no">491</span><span id="line-491">      long startTime = System.nanoTime();</span>
+<span class="source-line-no">492</span><span id="line-492">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">493</span><span id="line-493">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">494</span><span id="line-494">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">495</span><span id="line-495">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">496</span><span id="line-496">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
+<span class="source-line-no">497</span><span id="line-497">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">498</span><span id="line-498">        callbackList.add(callback);</span>
+<span class="source-line-no">499</span><span id="line-499">      }</span>
+<span class="source-line-no">500</span><span id="line-500">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
+<span class="source-line-no">501</span><span id="line-501">        assertNull(callback.get());</span>
+<span class="source-line-no">502</span><span id="line-502">      }</span>
+<span class="source-line-no">503</span><span id="line-503">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">504</span><span id="line-504">      for (HBaseRpcController pcrc : pcrcList) {</span>
+<span class="source-line-no">505</span><span id="line-505">        assertTrue(pcrc.failed());</span>
+<span class="source-line-no">506</span><span id="line-506">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">507</span><span id="line-507">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">508</span><span id="line-508">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">509</span><span id="line-509">      }</span>
+<span class="source-line-no">510</span><span id="line-510">      // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">511</span><span id="line-511">      assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">512</span><span id="line-512">    } finally {</span>
+<span class="source-line-no">513</span><span id="line-513">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">514</span><span id="line-514">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">515</span><span id="line-515">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">516</span><span id="line-516">      rpcServer.stop();</span>
+<span class="source-line-no">517</span><span id="line-517">    }</span>
+<span class="source-line-no">518</span><span id="line-518">  }</span>
+<span class="source-line-no">519</span><span id="line-519"></span>
+<span class="source-line-no">520</span><span id="line-520">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
+<span class="source-line-no">521</span><span id="line-521">    Waiter.waitFor(CONF, 1000, new MatcherPredicate&lt;&gt;(() -&gt; OTEL_EXT.getSpans(), hasItem(matcher)));</span>
+<span class="source-line-no">522</span><span id="line-522">    return OTEL_EXT.getSpans().stream().filter(matcher::matches).findFirst()</span>
+<span class="source-line-no">523</span><span id="line-523">      .orElseThrow(AssertionError::new);</span>
 <span class="source-line-no">524</span><span id="line-524">  }</span>
 <span class="source-line-no">525</span><span id="line-525"></span>
-<span class="source-line-no">526</span><span id="line-526">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">527</span><span id="line-527">    final String methodName) {</span>
-<span class="source-line-no">528</span><span id="line-528">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">529</span><span id="line-529">      hasKind(SpanKind.CLIENT));</span>
-<span class="source-line-no">530</span><span id="line-530">  }</span>
-<span class="source-line-no">531</span><span id="line-531"></span>
-<span class="source-line-no">532</span><span id="line-532">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">533</span><span id="line-533">    final String methodName) {</span>
-<span class="source-line-no">534</span><span id="line-534">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">535</span><span id="line-535">      hasKind(SpanKind.SERVER));</span>
-<span class="source-line-no">536</span><span id="line-536">  }</span>
-<span class="source-line-no">537</span><span id="line-537"></span>
-<span class="source-line-no">538</span><span id="line-538">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
-<span class="source-line-no">539</span><span id="line-539">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
-<span class="source-line-no">540</span><span id="line-540">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">541</span><span id="line-541">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
-<span class="source-line-no">542</span><span id="line-542">      containsEntry("net.peer.name", isa.getHostName()),</span>
-<span class="source-line-no">543</span><span id="line-543">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
-<span class="source-line-no">544</span><span id="line-544">  }</span>
-<span class="source-line-no">545</span><span id="line-545"></span>
-<span class="source-line-no">546</span><span id="line-546">  private static Matcher&lt;SpanData&gt;</span>
-<span class="source-line-no">547</span><span id="line-547">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">548</span><span id="line-548">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">549</span><span id="line-549">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
-<span class="source-line-no">550</span><span id="line-550">  }</span>
-<span class="source-line-no">551</span><span id="line-551"></span>
-<span class="source-line-no">552</span><span id="line-552">  private void assertRemoteSpan() {</span>
-<span class="source-line-no">553</span><span id="line-553">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
-<span class="source-line-no">554</span><span id="line-554">    assertTrue(data.getParentSpanContext().isRemote());</span>
-<span class="source-line-no">555</span><span id="line-555">    assertEquals(SpanKind.SERVER, data.getKind());</span>
-<span class="source-line-no">556</span><span id="line-556">  }</span>
-<span class="source-line-no">557</span><span id="line-557"></span>
-<span class="source-line-no">558</span><span id="line-558">  @Test</span>
-<span class="source-line-no">559</span><span id="line-559">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
-<span class="source-line-no">560</span><span id="line-560">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">561</span><span id="line-561">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">562</span><span id="line-562">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">563</span><span id="line-563">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">564</span><span id="line-564">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">565</span><span id="line-565">      rpcServer.start();</span>
-<span class="source-line-no">566</span><span id="line-566">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">567</span><span id="line-567">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
-<span class="source-line-no">568</span><span id="line-568">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">569</span><span id="line-569">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">570</span><span id="line-570">      final SpanData pauseClientSpan =</span>
-<span class="source-line-no">571</span><span id="line-571">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">572</span><span id="line-572">      assertThat(pauseClientSpan,</span>
-<span class="source-line-no">573</span><span id="line-573">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
-<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseServerSpan =</span>
-<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseServerSpan,</span>
-<span class="source-line-no">577</span><span id="line-577">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">578</span><span id="line-578">      assertRemoteSpan();</span>
-<span class="source-line-no">579</span><span id="line-579">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">580</span><span id="line-580">      assertThat(traceRule.getSpans(),</span>
-<span class="source-line-no">581</span><span id="line-581">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
-<span class="source-line-no">582</span><span id="line-582">          hasTraceId(traceRule.getSpans().iterator().next().getTraceId()),</span>
-<span class="source-line-no">583</span><span id="line-583">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
-<span class="source-line-no">584</span><span id="line-584">    } finally {</span>
-<span class="source-line-no">585</span><span id="line-585">      rpcServer.stop();</span>
-<span class="source-line-no">586</span><span id="line-586">    }</span>
-<span class="source-line-no">587</span><span id="line-587">  }</span>
-<span class="source-line-no">588</span><span id="line-588"></span>
-<span class="source-line-no">589</span><span id="line-589">  @Test</span>
-<span class="source-line-no">590</span><span id="line-590">  public void testTracingErrorIpc() throws IOException {</span>
-<span class="source-line-no">591</span><span id="line-591">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">592</span><span id="line-592">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">593</span><span id="line-593">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">594</span><span id="line-594">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">595</span><span id="line-595">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">596</span><span id="line-596">      rpcServer.start();</span>
-<span class="source-line-no">597</span><span id="line-597">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">598</span><span id="line-598">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">599</span><span id="line-599">      assertThrows(ServiceException.class,</span>
-<span class="source-line-no">600</span><span id="line-600">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
-<span class="source-line-no">601</span><span id="line-601">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">602</span><span id="line-602">      final SpanData errorClientSpan =</span>
-<span class="source-line-no">603</span><span id="line-603">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">604</span><span id="line-604">      assertThat(errorClientSpan,</span>
-<span class="source-line-no">605</span><span id="line-605">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
-<span class="source-line-no">606</span><span id="line-606">      final SpanData errorServerSpan =</span>
-<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">608</span><span id="line-608">      assertThat(errorServerSpan,</span>
-<span class="source-line-no">609</span><span id="line-609">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">610</span><span id="line-610">      assertRemoteSpan();</span>
-<span class="source-line-no">611</span><span id="line-611">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">612</span><span id="line-612">      assertThat(traceRule.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
-<span class="source-line-no">613</span><span id="line-613">        hasTraceId(traceRule.getSpans().iterator().next().getTraceId()))));</span>
-<span class="source-line-no">614</span><span id="line-614">    } finally {</span>
-<span class="source-line-no">615</span><span id="line-615">      rpcServer.stop();</span>
-<span class="source-line-no">616</span><span id="line-616">    }</span>
-<span class="source-line-no">617</span><span id="line-617">  }</span>
-<span class="source-line-no">618</span><span id="line-618"></span>
-<span class="source-line-no">619</span><span id="line-619">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
-<span class="source-line-no">620</span><span id="line-620"></span>
-<span class="source-line-no">621</span><span id="line-621">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
-<span class="source-line-no">622</span><span id="line-622">    ServiceException se = assertThrows(ServiceException.class,</span>
-<span class="source-line-no">623</span><span id="line-623">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
-<span class="source-line-no">624</span><span id="line-624">    return ProtobufUtil.handleRemoteException(se);</span>
-<span class="source-line-no">625</span><span id="line-625">  }</span>
-<span class="source-line-no">626</span><span id="line-626"></span>
-<span class="source-line-no">627</span><span id="line-627">  @Test</span>
-<span class="source-line-no">628</span><span id="line-628">  public void testBadPreambleHeader() throws Exception {</span>
-<span class="source-line-no">629</span><span id="line-629">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">630</span><span id="line-630">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">631</span><span id="line-631">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">632</span><span id="line-632">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
-<span class="source-line-no">633</span><span id="line-633">      rpcServer.start();</span>
-<span class="source-line-no">634</span><span id="line-634">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">635</span><span id="line-635">      BadAuthException error = null;</span>
-<span class="source-line-no">636</span><span id="line-636">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
-<span class="source-line-no">637</span><span id="line-637">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
-<span class="source-line-no">638</span><span id="line-638">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">639</span><span id="line-639">        IOException ioe = doBadPreableHeaderCall(stub);</span>
-<span class="source-line-no">640</span><span id="line-640">        if (ioe instanceof BadAuthException) {</span>
-<span class="source-line-no">641</span><span id="line-641">          error = (BadAuthException) ioe;</span>
-<span class="source-line-no">642</span><span id="line-642">          break;</span>
-<span class="source-line-no">643</span><span id="line-643">        }</span>
-<span class="source-line-no">644</span><span id="line-644">        Thread.sleep(100);</span>
-<span class="source-line-no">645</span><span id="line-645">      }</span>
-<span class="source-line-no">646</span><span id="line-646">      assertNotNull("Can not get expected BadAuthException", error);</span>
-<span class="source-line-no">647</span><span id="line-647">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
-<span class="source-line-no">648</span><span id="line-648">    } finally {</span>
-<span class="source-line-no">649</span><span id="line-649">      rpcServer.stop();</span>
-<span class="source-line-no">650</span><span id="line-650">    }</span>
-<span class="source-line-no">651</span><span id="line-651">  }</span>
-<span class="source-line-no">652</span><span id="line-652"></span>
-<span class="source-line-no">653</span><span id="line-653">  /**</span>
-<span class="source-line-no">654</span><span id="line-654">   * Testcase for getting connection registry information through connection preamble header, see</span>
-<span class="source-line-no">655</span><span id="line-655">   * HBASE-25051 for more details.</span>
-<span class="source-line-no">656</span><span id="line-656">   */</span>
-<span class="source-line-no">657</span><span id="line-657">  @Test</span>
-<span class="source-line-no">658</span><span id="line-658">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
-<span class="source-line-no">659</span><span id="line-659">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">660</span><span id="line-660">    String clusterId = "test_cluster_id";</span>
-<span class="source-line-no">661</span><span id="line-661">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
-<span class="source-line-no">662</span><span id="line-662">    when(server.getClusterId()).thenReturn(clusterId);</span>
-<span class="source-line-no">663</span><span id="line-663">    // do not need any services</span>
-<span class="source-line-no">664</span><span id="line-664">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">665</span><span id="line-665">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">666</span><span id="line-666">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">667</span><span id="line-667">      rpcServer.start();</span>
-<span class="source-line-no">668</span><span id="line-668">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">669</span><span id="line-669">      BlockingRpcChannel channel =</span>
-<span class="source-line-no">670</span><span id="line-670">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
-<span class="source-line-no">671</span><span id="line-671">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">672</span><span id="line-672">      ConnectionRegistryService.BlockingInterface stub =</span>
-<span class="source-line-no">673</span><span id="line-673">        ConnectionRegistryService.newBlockingStub(channel);</span>
-<span class="source-line-no">674</span><span id="line-674">      GetConnectionRegistryResponse resp =</span>
-<span class="source-line-no">675</span><span id="line-675">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
-<span class="source-line-no">676</span><span id="line-676">      assertEquals(clusterId, resp.getClusterId());</span>
-<span class="source-line-no">677</span><span id="line-677">    } finally {</span>
-<span class="source-line-no">678</span><span id="line-678">      rpcServer.stop();</span>
-<span class="source-line-no">679</span><span id="line-679">    }</span>
-<span class="source-line-no">680</span><span id="line-680">  }</span>
-<span class="source-line-no">681</span><span id="line-681"></span>
-<span class="source-line-no">682</span><span id="line-682">  /**</span>
-<span class="source-line-no">683</span><span id="line-683">   * Test server does not support getting connection registry information through connection</span>
-<span class="source-line-no">684</span><span id="line-684">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
-<span class="source-line-no">685</span><span id="line-685">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
-<span class="source-line-no">686</span><span id="line-686">   */</span>
-<span class="source-line-no">687</span><span id="line-687">  @Test</span>
-<span class="source-line-no">688</span><span id="line-688">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
-<span class="source-line-no">689</span><span id="line-689">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">690</span><span id="line-690">    // do not need any services</span>
-<span class="source-line-no">691</span><span id="line-691">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">692</span><span id="line-692">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">693</span><span id="line-693">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">694</span><span id="line-694">      rpcServer.start();</span>
-<span class="source-line-no">695</span><span id="line-695">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">696</span><span id="line-696">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
-<span class="source-line-no">697</span><span id="line-697">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">698</span><span id="line-698">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
-<span class="source-line-no">699</span><span id="line-699">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">700</span><span id="line-700">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">701</span><span id="line-701">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
-<span class="source-line-no">702</span><span id="line-702">      // should have failed so no response</span>
-<span class="source-line-no">703</span><span id="line-703">      assertNull(done.get());</span>
-<span class="source-line-no">704</span><span id="line-704">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">705</span><span id="line-705">      // should be a FatalConnectionException</span>
-<span class="source-line-no">706</span><span id="line-706">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
-<span class="source-line-no">707</span><span id="line-707">      assertEquals(FatalConnectionException.class.getName(),</span>
-<span class="source-line-no">708</span><span id="line-708">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
-<span class="source-line-no">709</span><span id="line-709">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
-<span class="source-line-no">710</span><span id="line-710">    } finally {</span>
-<span class="source-line-no">711</span><span id="line-711">      rpcServer.stop();</span>
-<span class="source-line-no">712</span><span id="line-712">    }</span>
-<span class="source-line-no">713</span><span id="line-713">  }</span>
-<span class="source-line-no">714</span><span id="line-714">}</span>
+<span class="source-line-no">526</span><span id="line-526">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">527</span><span id="line-527">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">528</span><span id="line-528">  }</span>
+<span class="source-line-no">529</span><span id="line-529"></span>
+<span class="source-line-no">530</span><span id="line-530">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">531</span><span id="line-531">    final String methodName) {</span>
+<span class="source-line-no">532</span><span id="line-532">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">533</span><span id="line-533">      hasKind(SpanKind.CLIENT));</span>
+<span class="source-line-no">534</span><span id="line-534">  }</span>
+<span class="source-line-no">535</span><span id="line-535"></span>
+<span class="source-line-no">536</span><span id="line-536">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">537</span><span id="line-537">    final String methodName) {</span>
+<span class="source-line-no">538</span><span id="line-538">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">539</span><span id="line-539">      hasKind(SpanKind.SERVER));</span>
+<span class="source-line-no">540</span><span id="line-540">  }</span>
+<span class="source-line-no">541</span><span id="line-541"></span>
+<span class="source-line-no">542</span><span id="line-542">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
+<span class="source-line-no">543</span><span id="line-543">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
+<span class="source-line-no">544</span><span id="line-544">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">545</span><span id="line-545">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
+<span class="source-line-no">546</span><span id="line-546">      containsEntry("net.peer.name", isa.getHostName()),</span>
+<span class="source-line-no">547</span><span id="line-547">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
+<span class="source-line-no">548</span><span id="line-548">  }</span>
+<span class="source-line-no">549</span><span id="line-549"></span>
+<span class="source-line-no">550</span><span id="line-550">  private static Matcher&lt;SpanData&gt;</span>
+<span class="source-line-no">551</span><span id="line-551">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">552</span><span id="line-552">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">553</span><span id="line-553">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
+<span class="source-line-no">554</span><span id="line-554">  }</span>
+<span class="source-line-no">555</span><span id="line-555"></span>
+<span class="source-line-no">556</span><span id="line-556">  private void assertRemoteSpan() {</span>
+<span class="source-line-no">557</span><span id="line-557">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
+<span class="source-line-no">558</span><span id="line-558">    assertTrue(data.getParentSpanContext().isRemote());</span>
+<span class="source-line-no">559</span><span id="line-559">    assertEquals(SpanKind.SERVER, data.getKind());</span>
+<span class="source-line-no">560</span><span id="line-560">  }</span>
+<span class="source-line-no">561</span><span id="line-561"></span>
+<span class="source-line-no">562</span><span id="line-562">  @TestTemplate</span>
+<span class="source-line-no">563</span><span id="line-563">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
+<span class="source-line-no">564</span><span id="line-564">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">565</span><span id="line-565">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">566</span><span id="line-566">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">567</span><span id="line-567">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">568</span><span id="line-568">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">569</span><span id="line-569">      rpcServer.start();</span>
+<span class="source-line-no">570</span><span id="line-570">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">571</span><span id="line-571">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
+<span class="source-line-no">572</span><span id="line-572">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">573</span><span id="line-573">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseClientSpan =</span>
+<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseClientSpan,</span>
+<span class="source-line-no">577</span><span id="line-577">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
+<span class="source-line-no">578</span><span id="line-578">      final SpanData pauseServerSpan =</span>
+<span class="source-line-no">579</span><span id="line-579">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">580</span><span id="line-580">      assertThat(pauseServerSpan,</span>
+<span class="source-line-no">581</span><span id="line-581">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">582</span><span id="line-582">      assertRemoteSpan();</span>
+<span class="source-line-no">583</span><span id="line-583">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">584</span><span id="line-584">      assertThat(OTEL_EXT.getSpans(),</span>
+<span class="source-line-no">585</span><span id="line-585">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
+<span class="source-line-no">586</span><span id="line-586">          hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()),</span>
+<span class="source-line-no">587</span><span id="line-587">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
+<span class="source-line-no">588</span><span id="line-588">    } finally {</span>
+<span class="source-line-no">589</span><span id="line-589">      rpcServer.stop();</span>
+<span class="source-line-no">590</span><span id="line-590">    }</span>
+<span class="source-line-no">591</span><span id="line-591">  }</span>
+<span class="source-line-no">592</span><span id="line-592"></span>
+<span class="source-line-no">593</span><span id="line-593">  @TestTemplate</span>
+<span class="source-line-no">594</span><span id="line-594">  public void testTracingErrorIpc() throws IOException {</span>
+<span class="source-line-no">595</span><span id="line-595">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">596</span><span id="line-596">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">597</span><span id="line-597">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">598</span><span id="line-598">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">599</span><span id="line-599">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">600</span><span id="line-600">      rpcServer.start();</span>
+<span class="source-line-no">601</span><span id="line-601">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">602</span><span id="line-602">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">603</span><span id="line-603">      assertThrows(ServiceException.class,</span>
+<span class="source-line-no">604</span><span id="line-604">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">605</span><span id="line-605">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">606</span><span id="line-606">      final SpanData errorClientSpan =</span>
+<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">608</span><span id="line-608">      assertThat(errorClientSpan,</span>
+<span class="source-line-no">609</span><span id="line-609">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
+<span class="source-line-no">610</span><span id="line-610">      final SpanData errorServerSpan =</span>
+<span class="source-line-no">611</span><span id="line-611">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">612</span><span id="line-612">      assertThat(errorServerSpan,</span>
+<span class="source-line-no">613</span><span id="line-613">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">614</span><span id="line-614">      assertRemoteSpan();</span>
+<span class="source-line-no">615</span><span id="line-615">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">616</span><span id="line-616">      assertThat(OTEL_EXT.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
+<span class="source-line-no">617</span><span id="line-617">        hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()))));</span>
+<span class="source-line-no">618</span><span id="line-618">    } finally {</span>
+<span class="source-line-no">619</span><span id="line-619">      rpcServer.stop();</span>
+<span class="source-line-no">620</span><span id="line-620">    }</span>
+<span class="source-line-no">621</span><span id="line-621">  }</span>
+<span class="source-line-no">622</span><span id="line-622"></span>
+<span class="source-line-no">623</span><span id="line-623">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
+<span class="source-line-no">624</span><span id="line-624"></span>
+<span class="source-line-no">625</span><span id="line-625">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
+<span class="source-line-no">626</span><span id="line-626">    ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">627</span><span id="line-627">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
+<span class="source-line-no">628</span><span id="line-628">    return ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">629</span><span id="line-629">  }</span>
+<span class="source-line-no">630</span><span id="line-630"></span>
+<span class="source-line-no">631</span><span id="line-631">  @TestTemplate</span>
+<span class="source-line-no">632</span><span id="line-632">  public void testBadPreambleHeader() throws Exception {</span>
+<span class="source-line-no">633</span><span id="line-633">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">634</span><span id="line-634">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">635</span><span id="line-635">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">636</span><span id="line-636">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
+<span class="source-line-no">637</span><span id="line-637">      rpcServer.start();</span>
+<span class="source-line-no">638</span><span id="line-638">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">639</span><span id="line-639">      BadAuthException error = null;</span>
+<span class="source-line-no">640</span><span id="line-640">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
+<span class="source-line-no">641</span><span id="line-641">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
+<span class="source-line-no">642</span><span id="line-642">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">643</span><span id="line-643">        IOException ioe = doBadPreableHeaderCall(stub);</span>
+<span class="source-line-no">644</span><span id="line-644">        if (ioe instanceof BadAuthException) {</span>
+<span class="source-line-no">645</span><span id="line-645">          error = (BadAuthException) ioe;</span>
+<span class="source-line-no">646</span><span id="line-646">          break;</span>
+<span class="source-line-no">647</span><span id="line-647">        }</span>
+<span class="source-line-no">648</span><span id="line-648">        Thread.sleep(100);</span>
+<span class="source-line-no">649</span><span id="line-649">      }</span>
+<span class="source-line-no">650</span><span id="line-650">      assertNotNull(error, "Can not get expected BadAuthException");</span>
+<span class="source-line-no">651</span><span id="line-651">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
+<span class="source-line-no">652</span><span id="line-652">    } finally {</span>
+<span class="source-line-no">653</span><span id="line-653">      rpcServer.stop();</span>
+<span class="source-line-no">654</span><span id="line-654">    }</span>
+<span class="source-line-no">655</span><span id="line-655">  }</span>
+<span class="source-line-no">656</span><span id="line-656"></span>
+<span class="source-line-no">657</span><span id="line-657">  /**</span>
+<span class="source-line-no">658</span><span id="line-658">   * Testcase for getting connection registry information through connection preamble header, see</span>
+<span class="source-line-no">659</span><span id="line-659">   * HBASE-25051 for more details.</span>
+<span class="source-line-no">660</span><span id="line-660">   */</span>
+<span class="source-line-no">661</span><span id="line-661">  @TestTemplate</span>
+<span class="source-line-no">662</span><span id="line-662">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
+<span class="source-line-no">663</span><span id="line-663">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">664</span><span id="line-664">    String clusterId = "test_cluster_id";</span>
+<span class="source-line-no">665</span><span id="line-665">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
+<span class="source-line-no">666</span><span id="line-666">    when(server.getClusterId()).thenReturn(clusterId);</span>
+<span class="source-line-no">667</span><span id="line-667">    // do not need any services</span>
+<span class="source-line-no">668</span><span id="line-668">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">669</span><span id="line-669">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">670</span><span id="line-670">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">671</span><span id="line-671">      rpcServer.start();</span>
+<span class="source-line-no">672</span><span id="line-672">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">673</span><span id="line-673">      BlockingRpcChannel channel =</span>
+<span class="source-line-no">674</span><span id="line-674">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
+<span class="source-line-no">675</span><span id="line-675">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">676</span><span id="line-676">      ConnectionRegistryService.BlockingInterface stub =</span>
+<span class="source-line-no">677</span><span id="line-677">        ConnectionRegistryService.newBlockingStub(channel);</span>
+<span class="source-line-no">678</span><span id="line-678">      GetConnectionRegistryResponse resp =</span>
+<span class="source-line-no">679</span><span id="line-679">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
+<span class="source-line-no">680</span><span id="line-680">      assertEquals(clusterId, resp.getClusterId());</span>
+<span class="source-line-no">681</span><span id="line-681">    } finally {</span>
+<span class="source-line-no">682</span><span id="line-682">      rpcServer.stop();</span>
+<span class="source-line-no">683</span><span id="line-683">    }</span>
+<span class="source-line-no">684</span><span id="line-684">  }</span>
+<span class="source-line-no">685</span><span id="line-685"></span>
+<span class="source-line-no">686</span><span id="line-686">  /**</span>
+<span class="source-line-no">687</span><span id="line-687">   * Test server does not support getting connection registry information through connection</span>
+<span class="source-line-no">688</span><span id="line-688">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
+<span class="source-line-no">689</span><span id="line-689">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
+<span class="source-line-no">690</span><span id="line-690">   */</span>
+<span class="source-line-no">691</span><span id="line-691">  @TestTemplate</span>
+<span class="source-line-no">692</span><span id="line-692">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
+<span class="source-line-no">693</span><span id="line-693">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">694</span><span id="line-694">    // do not need any services</span>
+<span class="source-line-no">695</span><span id="line-695">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">696</span><span id="line-696">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">697</span><span id="line-697">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">698</span><span id="line-698">      rpcServer.start();</span>
+<span class="source-line-no">699</span><span id="line-699">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">700</span><span id="line-700">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
+<span class="source-line-no">701</span><span id="line-701">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">702</span><span id="line-702">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
+<span class="source-line-no">703</span><span id="line-703">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">704</span><span id="line-704">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">705</span><span id="line-705">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
+<span class="source-line-no">706</span><span id="line-706">      // should have failed so no response</span>
+<span class="source-line-no">707</span><span id="line-707">      assertNull(done.get());</span>
+<span class="source-line-no">708</span><span id="line-708">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">709</span><span id="line-709">      // should be a FatalConnectionException</span>
+<span class="source-line-no">710</span><span id="line-710">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
+<span class="source-line-no">711</span><span id="line-711">      assertEquals(FatalConnectionException.class.getName(),</span>
+<span class="source-line-no">712</span><span id="line-712">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
+<span class="source-line-no">713</span><span id="line-713">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
+<span class="source-line-no">714</span><span id="line-714">    } finally {</span>
+<span class="source-line-no">715</span><span id="line-715">      rpcServer.stop();</span>
+<span class="source-line-no">716</span><span id="line-716">    }</span>
+<span class="source-line-no">717</span><span id="line-717">  }</span>
+<span class="source-line-no">718</span><span id="line-718">}</span>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
index 6e454396038..1cdaeb4e72d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
@@ -40,691 +40,695 @@
 <span class="source-line-no">027</span><span id="line-27">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.SERVICE;</span>
 <span class="source-line-no">028</span><span id="line-28">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newBlockingStub;</span>
 <span class="source-line-no">029</span><span id="line-29">import static org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.newStub;</span>
-<span class="source-line-no">030</span><span id="line-30">import static org.hamcrest.MatcherAssert.assertThat;</span>
-<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.Matchers.allOf;</span>
-<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.containsString;</span>
-<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.everyItem;</span>
-<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
-<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.hasItem;</span>
-<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.instanceOf;</span>
-<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.startsWith;</span>
-<span class="source-line-no">038</span><span id="line-38">import static org.junit.Assert.assertEquals;</span>
-<span class="source-line-no">039</span><span id="line-39">import static org.junit.Assert.assertFalse;</span>
-<span class="source-line-no">040</span><span id="line-40">import static org.junit.Assert.assertNotNull;</span>
-<span class="source-line-no">041</span><span id="line-41">import static org.junit.Assert.assertNull;</span>
-<span class="source-line-no">042</span><span id="line-42">import static org.junit.Assert.assertThrows;</span>
-<span class="source-line-no">043</span><span id="line-43">import static org.junit.Assert.assertTrue;</span>
-<span class="source-line-no">044</span><span id="line-44">import static org.junit.Assert.fail;</span>
-<span class="source-line-no">045</span><span id="line-45">import static org.mockito.ArgumentMatchers.any;</span>
-<span class="source-line-no">046</span><span id="line-46">import static org.mockito.Mockito.mock;</span>
-<span class="source-line-no">047</span><span id="line-47">import static org.mockito.Mockito.spy;</span>
-<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.verify;</span>
-<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.when;</span>
-<span class="source-line-no">050</span><span id="line-50">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
-<span class="source-line-no">051</span><span id="line-51"></span>
-<span class="source-line-no">052</span><span id="line-52">import io.opentelemetry.api.common.AttributeKey;</span>
-<span class="source-line-no">053</span><span id="line-53">import io.opentelemetry.api.trace.SpanKind;</span>
-<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.trace.StatusCode;</span>
-<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;</span>
-<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.sdk.trace.data.SpanData;</span>
-<span class="source-line-no">057</span><span id="line-57">import java.io.IOException;</span>
-<span class="source-line-no">058</span><span id="line-58">import java.net.InetSocketAddress;</span>
-<span class="source-line-no">059</span><span id="line-59">import java.nio.channels.SocketChannel;</span>
-<span class="source-line-no">060</span><span id="line-60">import java.time.Duration;</span>
-<span class="source-line-no">061</span><span id="line-61">import java.util.ArrayList;</span>
-<span class="source-line-no">062</span><span id="line-62">import java.util.Collections;</span>
-<span class="source-line-no">063</span><span id="line-63">import java.util.List;</span>
-<span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.CellScanner;</span>
-<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
-<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.ExtendedCell;</span>
-<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
-<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.HBaseServerBase;</span>
-<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.KeyValue;</span>
-<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.MatcherPredicate;</span>
-<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
-<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.Server;</span>
-<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.ServerName;</span>
-<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Waiter;</span>
-<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
-<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
-<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.io.compress.GzipCodec;</span>
-<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.ipc.RemoteException;</span>
-<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.util.StringUtils;</span>
-<span class="source-line-no">084</span><span id="line-84">import org.hamcrest.Matcher;</span>
-<span class="source-line-no">085</span><span id="line-85">import org.junit.Before;</span>
-<span class="source-line-no">086</span><span id="line-86">import org.junit.Rule;</span>
-<span class="source-line-no">087</span><span id="line-87">import org.junit.Test;</span>
-<span class="source-line-no">088</span><span id="line-88">import org.junit.runners.Parameterized.Parameter;</span>
-<span class="source-line-no">089</span><span id="line-89">import org.slf4j.Logger;</span>
-<span class="source-line-no">090</span><span id="line-90">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">091</span><span id="line-91"></span>
-<span class="source-line-no">092</span><span id="line-92">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
-<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
-<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
-<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
-<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
-<span class="source-line-no">097</span><span id="line-97"></span>
-<span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
-<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
-<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
-<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
-<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
-<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
-<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
-<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
-<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
-<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
-<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
-<span class="source-line-no">109</span><span id="line-109"></span>
-<span class="source-line-no">110</span><span id="line-110">/**</span>
-<span class="source-line-no">111</span><span id="line-111"> * Some basic ipc tests.</span>
-<span class="source-line-no">112</span><span id="line-112"> */</span>
-<span class="source-line-no">113</span><span id="line-113">public abstract class AbstractTestIPC {</span>
-<span class="source-line-no">114</span><span id="line-114"></span>
-<span class="source-line-no">115</span><span id="line-115">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
-<span class="source-line-no">116</span><span id="line-116"></span>
-<span class="source-line-no">117</span><span id="line-117">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
-<span class="source-line-no">118</span><span id="line-118">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
-<span class="source-line-no">119</span><span id="line-119"></span>
-<span class="source-line-no">120</span><span id="line-120">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
-<span class="source-line-no">121</span><span id="line-121"></span>
-<span class="source-line-no">122</span><span id="line-122">  protected RpcServer createRpcServer(Server server, String name,</span>
-<span class="source-line-no">123</span><span id="line-123">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
-<span class="source-line-no">124</span><span id="line-124">    RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">125</span><span id="line-125">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
-<span class="source-line-no">129</span><span id="line-129">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">130</span><span id="line-130">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">131</span><span id="line-131">  }</span>
-<span class="source-line-no">132</span><span id="line-132"></span>
-<span class="source-line-no">133</span><span id="line-133">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
-<span class="source-line-no">134</span><span id="line-134"></span>
-<span class="source-line-no">135</span><span id="line-135">  @Rule</span>
-<span class="source-line-no">136</span><span id="line-136">  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();</span>
-<span class="source-line-no">137</span><span id="line-137"></span>
-<span class="source-line-no">138</span><span id="line-138">  @Parameter(0)</span>
-<span class="source-line-no">139</span><span id="line-139">  public Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
+<span class="source-line-no">030</span><span id="line-30">import static org.awaitility.Awaitility.await;</span>
+<span class="source-line-no">031</span><span id="line-31">import static org.hamcrest.MatcherAssert.assertThat;</span>
+<span class="source-line-no">032</span><span id="line-32">import static org.hamcrest.Matchers.allOf;</span>
+<span class="source-line-no">033</span><span id="line-33">import static org.hamcrest.Matchers.containsString;</span>
+<span class="source-line-no">034</span><span id="line-34">import static org.hamcrest.Matchers.everyItem;</span>
+<span class="source-line-no">035</span><span id="line-35">import static org.hamcrest.Matchers.greaterThanOrEqualTo;</span>
+<span class="source-line-no">036</span><span id="line-36">import static org.hamcrest.Matchers.hasItem;</span>
+<span class="source-line-no">037</span><span id="line-37">import static org.hamcrest.Matchers.instanceOf;</span>
+<span class="source-line-no">038</span><span id="line-38">import static org.hamcrest.Matchers.lessThan;</span>
+<span class="source-line-no">039</span><span id="line-39">import static org.hamcrest.Matchers.startsWith;</span>
+<span class="source-line-no">040</span><span id="line-40">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">041</span><span id="line-41">import static org.junit.jupiter.api.Assertions.assertFalse;</span>
+<span class="source-line-no">042</span><span id="line-42">import static org.junit.jupiter.api.Assertions.assertNotNull;</span>
+<span class="source-line-no">043</span><span id="line-43">import static org.junit.jupiter.api.Assertions.assertNull;</span>
+<span class="source-line-no">044</span><span id="line-44">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">045</span><span id="line-45">import static org.junit.jupiter.api.Assertions.assertTrue;</span>
+<span class="source-line-no">046</span><span id="line-46">import static org.junit.jupiter.api.Assertions.fail;</span>
+<span class="source-line-no">047</span><span id="line-47">import static org.mockito.ArgumentMatchers.any;</span>
+<span class="source-line-no">048</span><span id="line-48">import static org.mockito.Mockito.mock;</span>
+<span class="source-line-no">049</span><span id="line-49">import static org.mockito.Mockito.spy;</span>
+<span class="source-line-no">050</span><span id="line-50">import static org.mockito.Mockito.verify;</span>
+<span class="source-line-no">051</span><span id="line-51">import static org.mockito.Mockito.when;</span>
+<span class="source-line-no">052</span><span id="line-52">import static org.mockito.internal.verification.VerificationModeFactory.times;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import io.opentelemetry.api.common.AttributeKey;</span>
+<span class="source-line-no">055</span><span id="line-55">import io.opentelemetry.api.trace.SpanKind;</span>
+<span class="source-line-no">056</span><span id="line-56">import io.opentelemetry.api.trace.StatusCode;</span>
+<span class="source-line-no">057</span><span id="line-57">import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;</span>
+<span class="source-line-no">058</span><span id="line-58">import io.opentelemetry.sdk.trace.data.SpanData;</span>
+<span class="source-line-no">059</span><span id="line-59">import java.io.IOException;</span>
+<span class="source-line-no">060</span><span id="line-60">import java.net.InetSocketAddress;</span>
+<span class="source-line-no">061</span><span id="line-61">import java.nio.channels.SocketChannel;</span>
+<span class="source-line-no">062</span><span id="line-62">import java.time.Duration;</span>
+<span class="source-line-no">063</span><span id="line-63">import java.util.ArrayList;</span>
+<span class="source-line-no">064</span><span id="line-64">import java.util.Collections;</span>
+<span class="source-line-no">065</span><span id="line-65">import java.util.List;</span>
+<span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.CellScanner;</span>
+<span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.DoNotRetryIOException;</span>
+<span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.ExtendedCell;</span>
+<span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.HBaseConfiguration;</span>
+<span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.HBaseServerBase;</span>
+<span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.KeyValue;</span>
+<span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.MatcherPredicate;</span>
+<span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
+<span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.Server;</span>
+<span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.ServerName;</span>
+<span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.Waiter;</span>
+<span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
+<span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
+<span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.io.compress.GzipCodec;</span>
+<span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.ipc.RemoteException;</span>
+<span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.util.StringUtils;</span>
+<span class="source-line-no">086</span><span id="line-86">import org.hamcrest.Matcher;</span>
+<span class="source-line-no">087</span><span id="line-87">import org.junit.jupiter.api.BeforeEach;</span>
+<span class="source-line-no">088</span><span id="line-88">import org.junit.jupiter.api.TestTemplate;</span>
+<span class="source-line-no">089</span><span id="line-89">import org.junit.jupiter.api.extension.RegisterExtension;</span>
+<span class="source-line-no">090</span><span id="line-90">import org.slf4j.Logger;</span>
+<span class="source-line-no">091</span><span id="line-91">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">092</span><span id="line-92"></span>
+<span class="source-line-no">093</span><span id="line-93">import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;</span>
+<span class="source-line-no">094</span><span id="line-94">import org.apache.hbase.thirdparty.com.google.common.collect.Lists;</span>
+<span class="source-line-no">095</span><span id="line-95">import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;</span>
+<span class="source-line-no">096</span><span id="line-96">import org.apache.hbase.thirdparty.com.google.protobuf.RpcChannel;</span>
+<span class="source-line-no">097</span><span id="line-97">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
+<span class="source-line-no">098</span><span id="line-98"></span>
+<span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoRequestProto;</span>
+<span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EchoResponseProto;</span>
+<span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyRequestProto;</span>
+<span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.EmptyResponseProto;</span>
+<span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestProtos.PauseRequestProto;</span>
+<span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface;</span>
+<span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.hbase.shaded.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.Interface;</span>
+<span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
+<span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ConnectionRegistryService;</span>
+<span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryRequest;</span>
+<span class="source-line-no">109</span><span id="line-109">import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;</span>
+<span class="source-line-no">110</span><span id="line-110"></span>
+<span class="source-line-no">111</span><span id="line-111">/**</span>
+<span class="source-line-no">112</span><span id="line-112"> * Some basic ipc tests.</span>
+<span class="source-line-no">113</span><span id="line-113"> */</span>
+<span class="source-line-no">114</span><span id="line-114">public abstract class AbstractTestIPC {</span>
+<span class="source-line-no">115</span><span id="line-115"></span>
+<span class="source-line-no">116</span><span id="line-116">  private static final Logger LOG = LoggerFactory.getLogger(AbstractTestIPC.class);</span>
+<span class="source-line-no">117</span><span id="line-117"></span>
+<span class="source-line-no">118</span><span id="line-118">  private static final byte[] CELL_BYTES = Bytes.toBytes("xyz");</span>
+<span class="source-line-no">119</span><span id="line-119">  private static final KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);</span>
+<span class="source-line-no">120</span><span id="line-120"></span>
+<span class="source-line-no">121</span><span id="line-121">  protected static final Configuration CONF = HBaseConfiguration.create();</span>
+<span class="source-line-no">122</span><span id="line-122"></span>
+<span class="source-line-no">123</span><span id="line-123">  protected RpcServer createRpcServer(Server server, String name,</span>
+<span class="source-line-no">124</span><span id="line-124">    List&lt;BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress, Configuration conf,</span>
+<span class="source-line-no">125</span><span id="line-125">    RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">126</span><span id="line-126">    return RpcServerFactory.createRpcServer(server, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">127</span><span id="line-127">  }</span>
+<span class="source-line-no">128</span><span id="line-128"></span>
+<span class="source-line-no">129</span><span id="line-129">  private RpcServer createRpcServer(String name, List&lt;BlockingServiceAndInterface&gt; services,</span>
+<span class="source-line-no">130</span><span id="line-130">    InetSocketAddress bindAddress, Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">131</span><span id="line-131">    return createRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">132</span><span id="line-132">  }</span>
+<span class="source-line-no">133</span><span id="line-133"></span>
+<span class="source-line-no">134</span><span id="line-134">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClientNoCodec(Configuration conf);</span>
+<span class="source-line-no">135</span><span id="line-135"></span>
+<span class="source-line-no">136</span><span id="line-136">  @RegisterExtension</span>
+<span class="source-line-no">137</span><span id="line-137">  private static final OpenTelemetryExtension OTEL_EXT = OpenTelemetryExtension.create();</span>
+<span class="source-line-no">138</span><span id="line-138"></span>
+<span class="source-line-no">139</span><span id="line-139">  private Class&lt;? extends RpcServer&gt; rpcServerImpl;</span>
 <span class="source-line-no">140</span><span id="line-140"></span>
-<span class="source-line-no">141</span><span id="line-141">  @Before</span>
-<span class="source-line-no">142</span><span id="line-142">  public void setUpBeforeTest() {</span>
-<span class="source-line-no">143</span><span id="line-143">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
-<span class="source-line-no">144</span><span id="line-144">  }</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">  /**</span>
-<span class="source-line-no">147</span><span id="line-147">   * Ensure we do not HAVE TO HAVE a codec.</span>
-<span class="source-line-no">148</span><span id="line-148">   */</span>
-<span class="source-line-no">149</span><span id="line-149">  @Test</span>
-<span class="source-line-no">150</span><span id="line-150">  public void testNoCodec() throws IOException, ServiceException {</span>
-<span class="source-line-no">151</span><span id="line-151">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">152</span><span id="line-152">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">153</span><span id="line-153">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">154</span><span id="line-154">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">155</span><span id="line-155">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
-<span class="source-line-no">156</span><span id="line-156">      rpcServer.start();</span>
-<span class="source-line-no">157</span><span id="line-157">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">158</span><span id="line-158">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">159</span><span id="line-159">      String message = "hello";</span>
-<span class="source-line-no">160</span><span id="line-160">      assertEquals(message,</span>
-<span class="source-line-no">161</span><span id="line-161">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">162</span><span id="line-162">      assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">163</span><span id="line-163">    } finally {</span>
-<span class="source-line-no">164</span><span id="line-164">      rpcServer.stop();</span>
-<span class="source-line-no">165</span><span id="line-165">    }</span>
-<span class="source-line-no">166</span><span id="line-166">  }</span>
-<span class="source-line-no">167</span><span id="line-167"></span>
-<span class="source-line-no">168</span><span id="line-168">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
-<span class="source-line-no">169</span><span id="line-169"></span>
-<span class="source-line-no">170</span><span id="line-170">  /**</span>
-<span class="source-line-no">171</span><span id="line-171">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
-<span class="source-line-no">172</span><span id="line-172">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
-<span class="source-line-no">173</span><span id="line-173">   * confirm that compression is happening down in the client and server).</span>
-<span class="source-line-no">174</span><span id="line-174">   */</span>
-<span class="source-line-no">175</span><span id="line-175">  @Test</span>
-<span class="source-line-no">176</span><span id="line-176">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
-<span class="source-line-no">177</span><span id="line-177">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">178</span><span id="line-178">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
-<span class="source-line-no">179</span><span id="line-179">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">180</span><span id="line-180">    int count = 3;</span>
-<span class="source-line-no">181</span><span id="line-181">    for (int i = 0; i &lt; count; i++) {</span>
-<span class="source-line-no">182</span><span id="line-182">      cells.add(CELL);</span>
-<span class="source-line-no">183</span><span id="line-183">    }</span>
-<span class="source-line-no">184</span><span id="line-184">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">185</span><span id="line-185">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">186</span><span id="line-186">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">189</span><span id="line-189">      rpcServer.start();</span>
-<span class="source-line-no">190</span><span id="line-190">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">191</span><span id="line-191">      HBaseRpcController pcrc =</span>
-<span class="source-line-no">192</span><span id="line-192">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
-<span class="source-line-no">193</span><span id="line-193">      String message = "hello";</span>
-<span class="source-line-no">194</span><span id="line-194">      assertEquals(message,</span>
-<span class="source-line-no">195</span><span id="line-195">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
-<span class="source-line-no">196</span><span id="line-196">      int index = 0;</span>
-<span class="source-line-no">197</span><span id="line-197">      CellScanner cellScanner = pcrc.cellScanner();</span>
-<span class="source-line-no">198</span><span id="line-198">      assertNotNull(cellScanner);</span>
-<span class="source-line-no">199</span><span id="line-199">      while (cellScanner.advance()) {</span>
-<span class="source-line-no">200</span><span id="line-200">        assertEquals(CELL, cellScanner.current());</span>
-<span class="source-line-no">201</span><span id="line-201">        index++;</span>
-<span class="source-line-no">202</span><span id="line-202">      }</span>
-<span class="source-line-no">203</span><span id="line-203">      assertEquals(count, index);</span>
-<span class="source-line-no">204</span><span id="line-204">    } finally {</span>
-<span class="source-line-no">205</span><span id="line-205">      rpcServer.stop();</span>
-<span class="source-line-no">206</span><span id="line-206">    }</span>
-<span class="source-line-no">207</span><span id="line-207">  }</span>
-<span class="source-line-no">208</span><span id="line-208"></span>
-<span class="source-line-no">209</span><span id="line-209">  protected abstract AbstractRpcClient&lt;?&gt;</span>
-<span class="source-line-no">210</span><span id="line-210">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
-<span class="source-line-no">211</span><span id="line-211"></span>
-<span class="source-line-no">212</span><span id="line-212">  @Test</span>
-<span class="source-line-no">213</span><span id="line-213">  public void testRTEDuringConnectionSetup() throws Exception {</span>
-<span class="source-line-no">214</span><span id="line-214">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">215</span><span id="line-215">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">216</span><span id="line-216">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">217</span><span id="line-217">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">218</span><span id="line-218">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
-<span class="source-line-no">219</span><span id="line-219">      rpcServer.start();</span>
-<span class="source-line-no">220</span><span id="line-220">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">221</span><span id="line-221">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">222</span><span id="line-222">      fail("Expected an exception to have been thrown!");</span>
-<span class="source-line-no">223</span><span id="line-223">    } catch (Exception e) {</span>
-<span class="source-line-no">224</span><span id="line-224">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">225</span><span id="line-225">      assertTrue(e.toString(), StringUtils.stringifyException(e).contains("Injected fault"));</span>
-<span class="source-line-no">226</span><span id="line-226">    } finally {</span>
-<span class="source-line-no">227</span><span id="line-227">      rpcServer.stop();</span>
-<span class="source-line-no">228</span><span id="line-228">    }</span>
-<span class="source-line-no">229</span><span id="line-229">  }</span>
-<span class="source-line-no">230</span><span id="line-230"></span>
-<span class="source-line-no">231</span><span id="line-231">  /**</span>
-<span class="source-line-no">232</span><span id="line-232">   * Tests that the rpc scheduler is called when requests arrive.</span>
-<span class="source-line-no">233</span><span id="line-233">   */</span>
-<span class="source-line-no">234</span><span id="line-234">  @Test</span>
-<span class="source-line-no">235</span><span id="line-235">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
-<span class="source-line-no">236</span><span id="line-236">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">237</span><span id="line-237">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">238</span><span id="line-238">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">239</span><span id="line-239">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">240</span><span id="line-240">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
-<span class="source-line-no">241</span><span id="line-241">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
-<span class="source-line-no">242</span><span id="line-242">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">243</span><span id="line-243">      rpcServer.start();</span>
-<span class="source-line-no">244</span><span id="line-244">      verify(scheduler).start();</span>
-<span class="source-line-no">245</span><span id="line-245">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">246</span><span id="line-246">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">247</span><span id="line-247">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">248</span><span id="line-248">        stub.echo(null, param);</span>
-<span class="source-line-no">249</span><span id="line-249">      }</span>
-<span class="source-line-no">250</span><span id="line-250">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
-<span class="source-line-no">251</span><span id="line-251">    } finally {</span>
-<span class="source-line-no">252</span><span id="line-252">      rpcServer.stop();</span>
-<span class="source-line-no">253</span><span id="line-253">      verify(scheduler).stop();</span>
-<span class="source-line-no">254</span><span id="line-254">    }</span>
-<span class="source-line-no">255</span><span id="line-255">  }</span>
-<span class="source-line-no">256</span><span id="line-256"></span>
-<span class="source-line-no">257</span><span id="line-257">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
-<span class="source-line-no">258</span><span id="line-258">  @Test</span>
-<span class="source-line-no">259</span><span id="line-259">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
-<span class="source-line-no">260</span><span id="line-260">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">261</span><span id="line-261">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
-<span class="source-line-no">262</span><span id="line-262">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">263</span><span id="line-263">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">264</span><span id="line-264">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
-<span class="source-line-no">265</span><span id="line-265">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">266</span><span id="line-266">      rpcServer.start();</span>
-<span class="source-line-no">267</span><span id="line-267">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">268</span><span id="line-268">      StringBuilder message = new StringBuilder(1200);</span>
-<span class="source-line-no">269</span><span id="line-269">      for (int i = 0; i &lt; 200; i++) {</span>
-<span class="source-line-no">270</span><span id="line-270">        message.append("hello.");</span>
-<span class="source-line-no">271</span><span id="line-271">      }</span>
-<span class="source-line-no">272</span><span id="line-272">      // set total RPC size bigger than 100 bytes</span>
-<span class="source-line-no">273</span><span id="line-273">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
-<span class="source-line-no">274</span><span id="line-274">      stub.echo(new HBaseRpcControllerImpl(</span>
-<span class="source-line-no">275</span><span id="line-275">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
-<span class="source-line-no">276</span><span id="line-276">      fail("RPC should have failed because it exceeds max request size");</span>
-<span class="source-line-no">277</span><span id="line-277">    } catch (ServiceException e) {</span>
-<span class="source-line-no">278</span><span id="line-278">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">279</span><span id="line-279">      assertTrue(e.toString(),</span>
-<span class="source-line-no">280</span><span id="line-280">        StringUtils.stringifyException(e).contains("RequestTooBigException"));</span>
-<span class="source-line-no">281</span><span id="line-281">    } finally {</span>
-<span class="source-line-no">282</span><span id="line-282">      rpcServer.stop();</span>
-<span class="source-line-no">283</span><span id="line-283">    }</span>
-<span class="source-line-no">284</span><span id="line-284">  }</span>
-<span class="source-line-no">285</span><span id="line-285"></span>
-<span class="source-line-no">286</span><span id="line-286">  /**</span>
-<span class="source-line-no">287</span><span id="line-287">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
-<span class="source-line-no">288</span><span id="line-288">   * remoteAddress set to its Call Object</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  @Test</span>
-<span class="source-line-no">291</span><span id="line-291">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
-<span class="source-line-no">292</span><span id="line-292">    throws IOException, ServiceException {</span>
-<span class="source-line-no">293</span><span id="line-293">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">294</span><span id="line-294">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">295</span><span id="line-295">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">296</span><span id="line-296">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">297</span><span id="line-297">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
-<span class="source-line-no">298</span><span id="line-298">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">299</span><span id="line-299">      rpcServer.start();</span>
-<span class="source-line-no">300</span><span id="line-300">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">301</span><span id="line-301">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
-<span class="source-line-no">302</span><span id="line-302">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
-<span class="source-line-no">303</span><span id="line-303">    } finally {</span>
-<span class="source-line-no">304</span><span id="line-304">      rpcServer.stop();</span>
-<span class="source-line-no">305</span><span id="line-305">    }</span>
-<span class="source-line-no">306</span><span id="line-306">  }</span>
-<span class="source-line-no">307</span><span id="line-307"></span>
-<span class="source-line-no">308</span><span id="line-308">  @Test</span>
-<span class="source-line-no">309</span><span id="line-309">  public void testRemoteError() throws IOException, ServiceException {</span>
-<span class="source-line-no">310</span><span id="line-310">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">311</span><span id="line-311">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">312</span><span id="line-312">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">313</span><span id="line-313">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">314</span><span id="line-314">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">315</span><span id="line-315">      rpcServer.start();</span>
-<span class="source-line-no">316</span><span id="line-316">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">317</span><span id="line-317">      stub.error(null, EmptyRequestProto.getDefaultInstance());</span>
-<span class="source-line-no">318</span><span id="line-318">    } catch (ServiceException e) {</span>
-<span class="source-line-no">319</span><span id="line-319">      LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">320</span><span id="line-320">      IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">321</span><span id="line-321">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">322</span><span id="line-322">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">323</span><span id="line-323">    } finally {</span>
-<span class="source-line-no">324</span><span id="line-324">      rpcServer.stop();</span>
-<span class="source-line-no">325</span><span id="line-325">    }</span>
-<span class="source-line-no">326</span><span id="line-326">  }</span>
-<span class="source-line-no">327</span><span id="line-327"></span>
-<span class="source-line-no">328</span><span id="line-328">  @Test</span>
-<span class="source-line-no">329</span><span id="line-329">  public void testTimeout() throws IOException {</span>
-<span class="source-line-no">330</span><span id="line-330">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">331</span><span id="line-331">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">332</span><span id="line-332">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">333</span><span id="line-333">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">334</span><span id="line-334">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">335</span><span id="line-335">      rpcServer.start();</span>
-<span class="source-line-no">336</span><span id="line-336">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">337</span><span id="line-337">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">338</span><span id="line-338">      int ms = 1000;</span>
-<span class="source-line-no">339</span><span id="line-339">      int timeout = 100;</span>
-<span class="source-line-no">340</span><span id="line-340">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">341</span><span id="line-341">        pcrc.reset();</span>
-<span class="source-line-no">342</span><span id="line-342">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">343</span><span id="line-343">        long startTime = System.nanoTime();</span>
-<span class="source-line-no">344</span><span id="line-344">        try {</span>
-<span class="source-line-no">345</span><span id="line-345">          stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build());</span>
-<span class="source-line-no">346</span><span id="line-346">        } catch (ServiceException e) {</span>
-<span class="source-line-no">347</span><span id="line-347">          long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">348</span><span id="line-348">          // expected</span>
-<span class="source-line-no">349</span><span id="line-349">          LOG.info("Caught expected exception: " + e);</span>
-<span class="source-line-no">350</span><span id="line-350">          IOException ioe = ProtobufUtil.handleRemoteException(e);</span>
-<span class="source-line-no">351</span><span id="line-351">          assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">352</span><span id="line-352">          // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">353</span><span id="line-353">          assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">354</span><span id="line-354">        }</span>
-<span class="source-line-no">355</span><span id="line-355">      }</span>
-<span class="source-line-no">356</span><span id="line-356">    } finally {</span>
-<span class="source-line-no">357</span><span id="line-357">      rpcServer.stop();</span>
-<span class="source-line-no">358</span><span id="line-358">    }</span>
-<span class="source-line-no">359</span><span id="line-359">  }</span>
-<span class="source-line-no">360</span><span id="line-360"></span>
-<span class="source-line-no">361</span><span id="line-361">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
-<span class="source-line-no">362</span><span id="line-362"></span>
-<span class="source-line-no">363</span><span id="line-363">    FailingSimpleRpcServer(Server server, String name,</span>
-<span class="source-line-no">364</span><span id="line-364">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
-<span class="source-line-no">365</span><span id="line-365">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">366</span><span id="line-366">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
-<span class="source-line-no">367</span><span id="line-367">    }</span>
+<span class="source-line-no">141</span><span id="line-141">  protected AbstractTestIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl) {</span>
+<span class="source-line-no">142</span><span id="line-142">    this.rpcServerImpl = rpcServerImpl;</span>
+<span class="source-line-no">143</span><span id="line-143">  }</span>
+<span class="source-line-no">144</span><span id="line-144"></span>
+<span class="source-line-no">145</span><span id="line-145">  @BeforeEach</span>
+<span class="source-line-no">146</span><span id="line-146">  public void setUpBeforeTest() {</span>
+<span class="source-line-no">147</span><span id="line-147">    CONF.setClass(RpcServerFactory.CUSTOM_RPC_SERVER_IMPL_CONF_KEY, rpcServerImpl, RpcServer.class);</span>
+<span class="source-line-no">148</span><span id="line-148">  }</span>
+<span class="source-line-no">149</span><span id="line-149"></span>
+<span class="source-line-no">150</span><span id="line-150">  /**</span>
+<span class="source-line-no">151</span><span id="line-151">   * Ensure we do not HAVE TO HAVE a codec.</span>
+<span class="source-line-no">152</span><span id="line-152">   */</span>
+<span class="source-line-no">153</span><span id="line-153">  @TestTemplate</span>
+<span class="source-line-no">154</span><span id="line-154">  public void testNoCodec() throws IOException, ServiceException {</span>
+<span class="source-line-no">155</span><span id="line-155">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">156</span><span id="line-156">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">157</span><span id="line-157">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">158</span><span id="line-158">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">159</span><span id="line-159">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientNoCodec(clientConf)) {</span>
+<span class="source-line-no">160</span><span id="line-160">      rpcServer.start();</span>
+<span class="source-line-no">161</span><span id="line-161">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">162</span><span id="line-162">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">163</span><span id="line-163">      String message = "hello";</span>
+<span class="source-line-no">164</span><span id="line-164">      assertEquals(message,</span>
+<span class="source-line-no">165</span><span id="line-165">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">166</span><span id="line-166">      assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">167</span><span id="line-167">    } finally {</span>
+<span class="source-line-no">168</span><span id="line-168">      rpcServer.stop();</span>
+<span class="source-line-no">169</span><span id="line-169">    }</span>
+<span class="source-line-no">170</span><span id="line-170">  }</span>
+<span class="source-line-no">171</span><span id="line-171"></span>
+<span class="source-line-no">172</span><span id="line-172">  protected abstract AbstractRpcClient&lt;?&gt; createRpcClient(Configuration conf);</span>
+<span class="source-line-no">173</span><span id="line-173"></span>
+<span class="source-line-no">174</span><span id="line-174">  /**</span>
+<span class="source-line-no">175</span><span id="line-175">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</span>
+<span class="source-line-no">176</span><span id="line-176">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</span>
+<span class="source-line-no">177</span><span id="line-177">   * confirm that compression is happening down in the client and server).</span>
+<span class="source-line-no">178</span><span id="line-178">   */</span>
+<span class="source-line-no">179</span><span id="line-179">  @TestTemplate</span>
+<span class="source-line-no">180</span><span id="line-180">  public void testCompressCellBlock() throws IOException, ServiceException {</span>
+<span class="source-line-no">181</span><span id="line-181">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">182</span><span id="line-182">    clientConf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());</span>
+<span class="source-line-no">183</span><span id="line-183">    List&lt;ExtendedCell&gt; cells = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">184</span><span id="line-184">    int count = 3;</span>
+<span class="source-line-no">185</span><span id="line-185">    for (int i = 0; i &lt; count; i++) {</span>
+<span class="source-line-no">186</span><span id="line-186">      cells.add(CELL);</span>
+<span class="source-line-no">187</span><span id="line-187">    }</span>
+<span class="source-line-no">188</span><span id="line-188">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">189</span><span id="line-189">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">190</span><span id="line-190">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">191</span><span id="line-191"></span>
+<span class="source-line-no">192</span><span id="line-192">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">193</span><span id="line-193">      rpcServer.start();</span>
+<span class="source-line-no">194</span><span id="line-194">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">195</span><span id="line-195">      HBaseRpcController pcrc =</span>
+<span class="source-line-no">196</span><span id="line-196">        new HBaseRpcControllerImpl(PrivateCellUtil.createExtendedCellScanner(cells));</span>
+<span class="source-line-no">197</span><span id="line-197">      String message = "hello";</span>
+<span class="source-line-no">198</span><span id="line-198">      assertEquals(message,</span>
+<span class="source-line-no">199</span><span id="line-199">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage(message).build()).getMessage());</span>
+<span class="source-line-no">200</span><span id="line-200">      int index = 0;</span>
+<span class="source-line-no">201</span><span id="line-201">      CellScanner cellScanner = pcrc.cellScanner();</span>
+<span class="source-line-no">202</span><span id="line-202">      assertNotNull(cellScanner);</span>
+<span class="source-line-no">203</span><span id="line-203">      while (cellScanner.advance()) {</span>
+<span class="source-line-no">204</span><span id="line-204">        assertEquals(CELL, cellScanner.current());</span>
+<span class="source-line-no">205</span><span id="line-205">        index++;</span>
+<span class="source-line-no">206</span><span id="line-206">      }</span>
+<span class="source-line-no">207</span><span id="line-207">      assertEquals(count, index);</span>
+<span class="source-line-no">208</span><span id="line-208">    } finally {</span>
+<span class="source-line-no">209</span><span id="line-209">      rpcServer.stop();</span>
+<span class="source-line-no">210</span><span id="line-210">    }</span>
+<span class="source-line-no">211</span><span id="line-211">  }</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">  protected abstract AbstractRpcClient&lt;?&gt;</span>
+<span class="source-line-no">214</span><span id="line-214">    createRpcClientRTEDuringConnectionSetup(Configuration conf) throws IOException;</span>
+<span class="source-line-no">215</span><span id="line-215"></span>
+<span class="source-line-no">216</span><span id="line-216">  @TestTemplate</span>
+<span class="source-line-no">217</span><span id="line-217">  public void testRTEDuringConnectionSetup() throws Exception {</span>
+<span class="source-line-no">218</span><span id="line-218">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">219</span><span id="line-219">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">220</span><span id="line-220">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">221</span><span id="line-221">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">222</span><span id="line-222">    try (AbstractRpcClient&lt;?&gt; client = createRpcClientRTEDuringConnectionSetup(clientConf)) {</span>
+<span class="source-line-no">223</span><span id="line-223">      rpcServer.start();</span>
+<span class="source-line-no">224</span><span id="line-224">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">225</span><span id="line-225">      stub.ping(null, EmptyRequestProto.getDefaultInstance());</span>
+<span class="source-line-no">226</span><span id="line-226">      fail("Expected an exception to have been thrown!");</span>
+<span class="source-line-no">227</span><span id="line-227">    } catch (Exception e) {</span>
+<span class="source-line-no">228</span><span id="line-228">      LOG.info("Caught expected exception: " + e.toString());</span>
+<span class="source-line-no">229</span><span id="line-229">      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"), e.toString());</span>
+<span class="source-line-no">230</span><span id="line-230">    } finally {</span>
+<span class="source-line-no">231</span><span id="line-231">      rpcServer.stop();</span>
+<span class="source-line-no">232</span><span id="line-232">    }</span>
+<span class="source-line-no">233</span><span id="line-233">  }</span>
+<span class="source-line-no">234</span><span id="line-234"></span>
+<span class="source-line-no">235</span><span id="line-235">  /**</span>
+<span class="source-line-no">236</span><span id="line-236">   * Tests that the rpc scheduler is called when requests arrive.</span>
+<span class="source-line-no">237</span><span id="line-237">   */</span>
+<span class="source-line-no">238</span><span id="line-238">  @TestTemplate</span>
+<span class="source-line-no">239</span><span id="line-239">  public void testRpcScheduler() throws IOException, ServiceException, InterruptedException {</span>
+<span class="source-line-no">240</span><span id="line-240">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">241</span><span id="line-241">    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">242</span><span id="line-242">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">243</span><span id="line-243">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">244</span><span id="line-244">      new InetSocketAddress("localhost", 0), CONF, scheduler);</span>
+<span class="source-line-no">245</span><span id="line-245">    verify(scheduler).init(any(RpcScheduler.Context.class));</span>
+<span class="source-line-no">246</span><span id="line-246">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">247</span><span id="line-247">      rpcServer.start();</span>
+<span class="source-line-no">248</span><span id="line-248">      verify(scheduler).start();</span>
+<span class="source-line-no">249</span><span id="line-249">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">250</span><span id="line-250">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">251</span><span id="line-251">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">252</span><span id="line-252">        stub.echo(null, param);</span>
+<span class="source-line-no">253</span><span id="line-253">      }</span>
+<span class="source-line-no">254</span><span id="line-254">      verify(scheduler, times(10)).dispatch(any(CallRunner.class));</span>
+<span class="source-line-no">255</span><span id="line-255">    } finally {</span>
+<span class="source-line-no">256</span><span id="line-256">      rpcServer.stop();</span>
+<span class="source-line-no">257</span><span id="line-257">      verify(scheduler).stop();</span>
+<span class="source-line-no">258</span><span id="line-258">    }</span>
+<span class="source-line-no">259</span><span id="line-259">  }</span>
+<span class="source-line-no">260</span><span id="line-260"></span>
+<span class="source-line-no">261</span><span id="line-261">  /** Tests that the rpc scheduler is called when requests arrive. */</span>
+<span class="source-line-no">262</span><span id="line-262">  @TestTemplate</span>
+<span class="source-line-no">263</span><span id="line-263">  public void testRpcMaxRequestSize() throws IOException, ServiceException {</span>
+<span class="source-line-no">264</span><span id="line-264">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">265</span><span id="line-265">    clientConf.setInt(RpcServer.MAX_REQUEST_SIZE, 1000);</span>
+<span class="source-line-no">266</span><span id="line-266">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">267</span><span id="line-267">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">268</span><span id="line-268">      new InetSocketAddress("localhost", 0), clientConf, new FifoRpcScheduler(clientConf, 1));</span>
+<span class="source-line-no">269</span><span id="line-269">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">270</span><span id="line-270">      rpcServer.start();</span>
+<span class="source-line-no">271</span><span id="line-271">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">272</span><span id="line-272">      StringBuilder message = new StringBuilder(1200);</span>
+<span class="source-line-no">273</span><span id="line-273">      for (int i = 0; i &lt; 200; i++) {</span>
+<span class="source-line-no">274</span><span id="line-274">        message.append("hello.");</span>
+<span class="source-line-no">275</span><span id="line-275">      }</span>
+<span class="source-line-no">276</span><span id="line-276">      // set total RPC size bigger than 100 bytes</span>
+<span class="source-line-no">277</span><span id="line-277">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message.toString()).build();</span>
+<span class="source-line-no">278</span><span id="line-278">      stub.echo(new HBaseRpcControllerImpl(</span>
+<span class="source-line-no">279</span><span id="line-279">        PrivateCellUtil.createExtendedCellScanner(ImmutableList.&lt;ExtendedCell&gt; of(CELL))), param);</span>
+<span class="source-line-no">280</span><span id="line-280">      fail("RPC should have failed because it exceeds max request size");</span>
+<span class="source-line-no">281</span><span id="line-281">    } catch (ServiceException e) {</span>
+<span class="source-line-no">282</span><span id="line-282">      LOG.info("Caught expected exception: " + e);</span>
+<span class="source-line-no">283</span><span id="line-283">      assertTrue(StringUtils.stringifyException(e).contains("RequestTooBigException"),</span>
+<span class="source-line-no">284</span><span id="line-284">        e.toString());</span>
+<span class="source-line-no">285</span><span id="line-285">    } finally {</span>
+<span class="source-line-no">286</span><span id="line-286">      rpcServer.stop();</span>
+<span class="source-line-no">287</span><span id="line-287">    }</span>
+<span class="source-line-no">288</span><span id="line-288">  }</span>
+<span class="source-line-no">289</span><span id="line-289"></span>
+<span class="source-line-no">290</span><span id="line-290">  /**</span>
+<span class="source-line-no">291</span><span id="line-291">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</span>
+<span class="source-line-no">292</span><span id="line-292">   * remoteAddress set to its Call Object</span>
+<span class="source-line-no">293</span><span id="line-293">   */</span>
+<span class="source-line-no">294</span><span id="line-294">  @TestTemplate</span>
+<span class="source-line-no">295</span><span id="line-295">  public void testRpcServerForNotNullRemoteAddressInCallObject()</span>
+<span class="source-line-no">296</span><span id="line-296">    throws IOException, ServiceException {</span>
+<span class="source-line-no">297</span><span id="line-297">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">298</span><span id="line-298">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">299</span><span id="line-299">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">300</span><span id="line-300">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">301</span><span id="line-301">    InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);</span>
+<span class="source-line-no">302</span><span id="line-302">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">303</span><span id="line-303">      rpcServer.start();</span>
+<span class="source-line-no">304</span><span id="line-304">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">305</span><span id="line-305">      assertEquals(localAddr.getAddress().getHostAddress(),</span>
+<span class="source-line-no">306</span><span id="line-306">        stub.addr(null, EmptyRequestProto.getDefaultInstance()).getAddr());</span>
+<span class="source-line-no">307</span><span id="line-307">    } finally {</span>
+<span class="source-line-no">308</span><span id="line-308">      rpcServer.stop();</span>
+<span class="source-line-no">309</span><span id="line-309">    }</span>
+<span class="source-line-no">310</span><span id="line-310">  }</span>
+<span class="source-line-no">311</span><span id="line-311"></span>
+<span class="source-line-no">312</span><span id="line-312">  @TestTemplate</span>
+<span class="source-line-no">313</span><span id="line-313">  public void testRemoteError() throws IOException, ServiceException {</span>
+<span class="source-line-no">314</span><span id="line-314">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">315</span><span id="line-315">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">316</span><span id="line-316">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">317</span><span id="line-317">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">318</span><span id="line-318">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">319</span><span id="line-319">      rpcServer.start();</span>
+<span class="source-line-no">320</span><span id="line-320">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">321</span><span id="line-321">      ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">322</span><span id="line-322">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">323</span><span id="line-323">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">324</span><span id="line-324">      IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">325</span><span id="line-325">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">326</span><span id="line-326">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">327</span><span id="line-327">    } finally {</span>
+<span class="source-line-no">328</span><span id="line-328">      rpcServer.stop();</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330">  }</span>
+<span class="source-line-no">331</span><span id="line-331"></span>
+<span class="source-line-no">332</span><span id="line-332">  @TestTemplate</span>
+<span class="source-line-no">333</span><span id="line-333">  public void testTimeout() throws IOException {</span>
+<span class="source-line-no">334</span><span id="line-334">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">335</span><span id="line-335">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">336</span><span id="line-336">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">337</span><span id="line-337">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">338</span><span id="line-338">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">339</span><span id="line-339">      rpcServer.start();</span>
+<span class="source-line-no">340</span><span id="line-340">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">341</span><span id="line-341">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">342</span><span id="line-342">      int ms = 1000;</span>
+<span class="source-line-no">343</span><span id="line-343">      int timeout = 100;</span>
+<span class="source-line-no">344</span><span id="line-344">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">345</span><span id="line-345">        pcrc.reset();</span>
+<span class="source-line-no">346</span><span id="line-346">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">347</span><span id="line-347">        long startTime = System.nanoTime();</span>
+<span class="source-line-no">348</span><span id="line-348">        ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">349</span><span id="line-349">          () -&gt; stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build()));</span>
+<span class="source-line-no">350</span><span id="line-350">        long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">351</span><span id="line-351">        // expected</span>
+<span class="source-line-no">352</span><span id="line-352">        LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">353</span><span id="line-353">        IOException ioe = ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">354</span><span id="line-354">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">355</span><span id="line-355">        // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">356</span><span id="line-356">        assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">357</span><span id="line-357">      }</span>
+<span class="source-line-no">358</span><span id="line-358">    } finally {</span>
+<span class="source-line-no">359</span><span id="line-359">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">360</span><span id="line-360">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">361</span><span id="line-361">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">362</span><span id="line-362">      rpcServer.stop();</span>
+<span class="source-line-no">363</span><span id="line-363">    }</span>
+<span class="source-line-no">364</span><span id="line-364">  }</span>
+<span class="source-line-no">365</span><span id="line-365"></span>
+<span class="source-line-no">366</span><span id="line-366">  @SuppressWarnings("deprecation")</span>
+<span class="source-line-no">367</span><span id="line-367">  private static class FailingSimpleRpcServer extends SimpleRpcServer {</span>
 <span class="source-line-no">368</span><span id="line-368"></span>
-<span class="source-line-no">369</span><span id="line-369">    final class FailingConnection extends SimpleServerRpcConnection {</span>
-<span class="source-line-no">370</span><span id="line-370">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
-<span class="source-line-no">371</span><span id="line-371">        long lastContact) {</span>
-<span class="source-line-no">372</span><span id="line-372">        super(rpcServer, channel, lastContact);</span>
-<span class="source-line-no">373</span><span id="line-373">      }</span>
+<span class="source-line-no">369</span><span id="line-369">    FailingSimpleRpcServer(Server server, String name,</span>
+<span class="source-line-no">370</span><span id="line-370">      List&lt;RpcServer.BlockingServiceAndInterface&gt; services, InetSocketAddress bindAddress,</span>
+<span class="source-line-no">371</span><span id="line-371">      Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">372</span><span id="line-372">      super(server, name, services, bindAddress, conf, scheduler, true);</span>
+<span class="source-line-no">373</span><span id="line-373">    }</span>
 <span class="source-line-no">374</span><span id="line-374"></span>
-<span class="source-line-no">375</span><span id="line-375">      @Override</span>
-<span class="source-line-no">376</span><span id="line-376">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
-<span class="source-line-no">377</span><span id="line-377">        // this will throw exception after the connection header is read, and an RPC is sent</span>
-<span class="source-line-no">378</span><span id="line-378">        // from client</span>
-<span class="source-line-no">379</span><span id="line-379">        throw new DoNotRetryIOException("Failing for test");</span>
-<span class="source-line-no">380</span><span id="line-380">      }</span>
-<span class="source-line-no">381</span><span id="line-381">    }</span>
-<span class="source-line-no">382</span><span id="line-382"></span>
-<span class="source-line-no">383</span><span id="line-383">    @Override</span>
-<span class="source-line-no">384</span><span id="line-384">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
-<span class="source-line-no">385</span><span id="line-385">      return new FailingConnection(this, channel, time);</span>
-<span class="source-line-no">386</span><span id="line-386">    }</span>
-<span class="source-line-no">387</span><span id="line-387">  }</span>
+<span class="source-line-no">375</span><span id="line-375">    final class FailingConnection extends SimpleServerRpcConnection {</span>
+<span class="source-line-no">376</span><span id="line-376">      private FailingConnection(FailingSimpleRpcServer rpcServer, SocketChannel channel,</span>
+<span class="source-line-no">377</span><span id="line-377">        long lastContact) {</span>
+<span class="source-line-no">378</span><span id="line-378">        super(rpcServer, channel, lastContact);</span>
+<span class="source-line-no">379</span><span id="line-379">      }</span>
+<span class="source-line-no">380</span><span id="line-380"></span>
+<span class="source-line-no">381</span><span id="line-381">      @Override</span>
+<span class="source-line-no">382</span><span id="line-382">      public void processRequest(ByteBuff buf) throws IOException, InterruptedException {</span>
+<span class="source-line-no">383</span><span id="line-383">        // this will throw exception after the connection header is read, and an RPC is sent</span>
+<span class="source-line-no">384</span><span id="line-384">        // from client</span>
+<span class="source-line-no">385</span><span id="line-385">        throw new DoNotRetryIOException("Failing for test");</span>
+<span class="source-line-no">386</span><span id="line-386">      }</span>
+<span class="source-line-no">387</span><span id="line-387">    }</span>
 <span class="source-line-no">388</span><span id="line-388"></span>
-<span class="source-line-no">389</span><span id="line-389">  protected RpcServer createTestFailingRpcServer(final String name,</span>
-<span class="source-line-no">390</span><span id="line-390">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
-<span class="source-line-no">391</span><span id="line-391">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
-<span class="source-line-no">392</span><span id="line-392">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
-<span class="source-line-no">393</span><span id="line-393">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">394</span><span id="line-394">    } else {</span>
-<span class="source-line-no">395</span><span id="line-395">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
-<span class="source-line-no">396</span><span id="line-396">    }</span>
-<span class="source-line-no">397</span><span id="line-397">  }</span>
-<span class="source-line-no">398</span><span id="line-398"></span>
-<span class="source-line-no">399</span><span id="line-399">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
-<span class="source-line-no">400</span><span id="line-400">  @Test</span>
-<span class="source-line-no">401</span><span id="line-401">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
-<span class="source-line-no">402</span><span id="line-402">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">403</span><span id="line-403">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
-<span class="source-line-no">404</span><span id="line-404">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">405</span><span id="line-405">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">406</span><span id="line-406"></span>
-<span class="source-line-no">407</span><span id="line-407">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">408</span><span id="line-408">      rpcServer.start();</span>
-<span class="source-line-no">409</span><span id="line-409">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">410</span><span id="line-410">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
-<span class="source-line-no">411</span><span id="line-411">      stub.echo(null, param);</span>
-<span class="source-line-no">412</span><span id="line-412">      fail("RPC should have failed because connection closed");</span>
-<span class="source-line-no">413</span><span id="line-413">    } catch (ServiceException e) {</span>
-<span class="source-line-no">414</span><span id="line-414">      LOG.info("Caught expected exception: " + e.toString());</span>
-<span class="source-line-no">415</span><span id="line-415">    } finally {</span>
-<span class="source-line-no">416</span><span id="line-416">      rpcServer.stop();</span>
-<span class="source-line-no">417</span><span id="line-417">    }</span>
-<span class="source-line-no">418</span><span id="line-418">  }</span>
-<span class="source-line-no">419</span><span id="line-419"></span>
-<span class="source-line-no">420</span><span id="line-420">  @Test</span>
-<span class="source-line-no">421</span><span id="line-421">  public void testAsyncEcho() throws IOException {</span>
-<span class="source-line-no">422</span><span id="line-422">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">423</span><span id="line-423">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">424</span><span id="line-424">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">425</span><span id="line-425">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">426</span><span id="line-426">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">427</span><span id="line-427">      rpcServer.start();</span>
-<span class="source-line-no">428</span><span id="line-428">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">429</span><span id="line-429">      int num = 10;</span>
-<span class="source-line-no">430</span><span id="line-430">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">431</span><span id="line-431">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">432</span><span id="line-432">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">433</span><span id="line-433">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">434</span><span id="line-434">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">435</span><span id="line-435">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
-<span class="source-line-no">436</span><span id="line-436">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">437</span><span id="line-437">        callbackList.add(done);</span>
-<span class="source-line-no">438</span><span id="line-438">      }</span>
-<span class="source-line-no">439</span><span id="line-439">      for (int i = 0; i &lt; num; i++) {</span>
-<span class="source-line-no">440</span><span id="line-440">        EchoResponseProto resp = callbackList.get(i).get();</span>
-<span class="source-line-no">441</span><span id="line-441">        HBaseRpcController pcrc = pcrcList.get(i);</span>
-<span class="source-line-no">442</span><span id="line-442">        assertEquals("hello-" + i, resp.getMessage());</span>
-<span class="source-line-no">443</span><span id="line-443">        assertFalse(pcrc.failed());</span>
-<span class="source-line-no">444</span><span id="line-444">        assertNull(pcrc.cellScanner());</span>
-<span class="source-line-no">445</span><span id="line-445">      }</span>
-<span class="source-line-no">446</span><span id="line-446">    } finally {</span>
-<span class="source-line-no">447</span><span id="line-447">      rpcServer.stop();</span>
-<span class="source-line-no">448</span><span id="line-448">    }</span>
-<span class="source-line-no">449</span><span id="line-449">  }</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">  @Test</span>
-<span class="source-line-no">452</span><span id="line-452">  public void testAsyncRemoteError() throws IOException {</span>
-<span class="source-line-no">453</span><span id="line-453">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">454</span><span id="line-454">    AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf);</span>
-<span class="source-line-no">455</span><span id="line-455">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">456</span><span id="line-456">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">457</span><span id="line-457">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">458</span><span id="line-458">    try {</span>
-<span class="source-line-no">459</span><span id="line-459">      rpcServer.start();</span>
-<span class="source-line-no">460</span><span id="line-460">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">461</span><span id="line-461">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">462</span><span id="line-462">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">463</span><span id="line-463">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
-<span class="source-line-no">464</span><span id="line-464">      assertNull(callback.get());</span>
-<span class="source-line-no">465</span><span id="line-465">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">466</span><span id="line-466">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">467</span><span id="line-467">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">468</span><span id="line-468">      assertTrue(ioe instanceof DoNotRetryIOException);</span>
-<span class="source-line-no">469</span><span id="line-469">      assertTrue(ioe.getMessage().contains("server error!"));</span>
-<span class="source-line-no">470</span><span id="line-470">    } finally {</span>
-<span class="source-line-no">471</span><span id="line-471">      client.close();</span>
-<span class="source-line-no">472</span><span id="line-472">      rpcServer.stop();</span>
-<span class="source-line-no">473</span><span id="line-473">    }</span>
-<span class="source-line-no">474</span><span id="line-474">  }</span>
-<span class="source-line-no">475</span><span id="line-475"></span>
-<span class="source-line-no">476</span><span id="line-476">  @Test</span>
-<span class="source-line-no">477</span><span id="line-477">  public void testAsyncTimeout() throws IOException {</span>
-<span class="source-line-no">478</span><span id="line-478">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">479</span><span id="line-479">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">480</span><span id="line-480">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">481</span><span id="line-481">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">482</span><span id="line-482">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">483</span><span id="line-483">      rpcServer.start();</span>
-<span class="source-line-no">484</span><span id="line-484">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">485</span><span id="line-485">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">486</span><span id="line-486">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">487</span><span id="line-487">      int ms = 1000;</span>
-<span class="source-line-no">488</span><span id="line-488">      int timeout = 100;</span>
-<span class="source-line-no">489</span><span id="line-489">      long startTime = System.nanoTime();</span>
-<span class="source-line-no">490</span><span id="line-490">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">491</span><span id="line-491">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">492</span><span id="line-492">        pcrc.setCallTimeout(timeout);</span>
-<span class="source-line-no">493</span><span id="line-493">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">494</span><span id="line-494">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
-<span class="source-line-no">495</span><span id="line-495">        pcrcList.add(pcrc);</span>
-<span class="source-line-no">496</span><span id="line-496">        callbackList.add(callback);</span>
-<span class="source-line-no">497</span><span id="line-497">      }</span>
-<span class="source-line-no">498</span><span id="line-498">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
-<span class="source-line-no">499</span><span id="line-499">        assertNull(callback.get());</span>
-<span class="source-line-no">500</span><span id="line-500">      }</span>
-<span class="source-line-no">501</span><span id="line-501">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">502</span><span id="line-502">      for (HBaseRpcController pcrc : pcrcList) {</span>
-<span class="source-line-no">503</span><span id="line-503">        assertTrue(pcrc.failed());</span>
-<span class="source-line-no">504</span><span id="line-504">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
-<span class="source-line-no">505</span><span id="line-505">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
-<span class="source-line-no">506</span><span id="line-506">        assertTrue(ioe.getCause() instanceof CallTimeoutException);</span>
-<span class="source-line-no">507</span><span id="line-507">      }</span>
-<span class="source-line-no">508</span><span id="line-508">      // confirm that we got exception before the actual pause.</span>
-<span class="source-line-no">509</span><span id="line-509">      assertTrue(waitTime &lt; ms);</span>
-<span class="source-line-no">510</span><span id="line-510">    } finally {</span>
-<span class="source-line-no">511</span><span id="line-511">      rpcServer.stop();</span>
-<span class="source-line-no">512</span><span id="line-512">    }</span>
-<span class="source-line-no">513</span><span id="line-513">  }</span>
-<span class="source-line-no">514</span><span id="line-514"></span>
-<span class="source-line-no">515</span><span id="line-515">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
-<span class="source-line-no">516</span><span id="line-516">    Waiter.waitFor(CONF, 1000,</span>
-<span class="source-line-no">517</span><span id="line-517">      new MatcherPredicate&lt;&gt;(() -&gt; traceRule.getSpans(), hasItem(matcher)));</span>
-<span class="source-line-no">518</span><span id="line-518">    return traceRule.getSpans().stream().filter(matcher::matches).findFirst()</span>
-<span class="source-line-no">519</span><span id="line-519">      .orElseThrow(AssertionError::new);</span>
-<span class="source-line-no">520</span><span id="line-520">  }</span>
-<span class="source-line-no">521</span><span id="line-521"></span>
-<span class="source-line-no">522</span><span id="line-522">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">523</span><span id="line-523">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">389</span><span id="line-389">    @Override</span>
+<span class="source-line-no">390</span><span id="line-390">    protected SimpleServerRpcConnection getConnection(SocketChannel channel, long time) {</span>
+<span class="source-line-no">391</span><span id="line-391">      return new FailingConnection(this, channel, time);</span>
+<span class="source-line-no">392</span><span id="line-392">    }</span>
+<span class="source-line-no">393</span><span id="line-393">  }</span>
+<span class="source-line-no">394</span><span id="line-394"></span>
+<span class="source-line-no">395</span><span id="line-395">  protected RpcServer createTestFailingRpcServer(final String name,</span>
+<span class="source-line-no">396</span><span id="line-396">    final List&lt;BlockingServiceAndInterface&gt; services, final InetSocketAddress bindAddress,</span>
+<span class="source-line-no">397</span><span id="line-397">    Configuration conf, RpcScheduler scheduler) throws IOException {</span>
+<span class="source-line-no">398</span><span id="line-398">    if (rpcServerImpl.equals(NettyRpcServer.class)) {</span>
+<span class="source-line-no">399</span><span id="line-399">      return new FailingNettyRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">400</span><span id="line-400">    } else {</span>
+<span class="source-line-no">401</span><span id="line-401">      return new FailingSimpleRpcServer(null, name, services, bindAddress, conf, scheduler);</span>
+<span class="source-line-no">402</span><span id="line-402">    }</span>
+<span class="source-line-no">403</span><span id="line-403">  }</span>
+<span class="source-line-no">404</span><span id="line-404"></span>
+<span class="source-line-no">405</span><span id="line-405">  /** Tests that the connection closing is handled by the client with outstanding RPC calls */</span>
+<span class="source-line-no">406</span><span id="line-406">  @TestTemplate</span>
+<span class="source-line-no">407</span><span id="line-407">  public void testConnectionCloseWithOutstandingRPCs() throws InterruptedException, IOException {</span>
+<span class="source-line-no">408</span><span id="line-408">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">409</span><span id="line-409">    RpcServer rpcServer = createTestFailingRpcServer("testRpcServer",</span>
+<span class="source-line-no">410</span><span id="line-410">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">411</span><span id="line-411">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">412</span><span id="line-412">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">413</span><span id="line-413">      rpcServer.start();</span>
+<span class="source-line-no">414</span><span id="line-414">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">415</span><span id="line-415">      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();</span>
+<span class="source-line-no">416</span><span id="line-416">      ServiceException se = assertThrows(ServiceException.class, () -&gt; stub.echo(null, param),</span>
+<span class="source-line-no">417</span><span id="line-417">        "RPC should have failed because connection closed");</span>
+<span class="source-line-no">418</span><span id="line-418">      LOG.info("Caught expected exception: " + se);</span>
+<span class="source-line-no">419</span><span id="line-419">    } finally {</span>
+<span class="source-line-no">420</span><span id="line-420">      rpcServer.stop();</span>
+<span class="source-line-no">421</span><span id="line-421">    }</span>
+<span class="source-line-no">422</span><span id="line-422">  }</span>
+<span class="source-line-no">423</span><span id="line-423"></span>
+<span class="source-line-no">424</span><span id="line-424">  @TestTemplate</span>
+<span class="source-line-no">425</span><span id="line-425">  public void testAsyncEcho() throws IOException {</span>
+<span class="source-line-no">426</span><span id="line-426">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">427</span><span id="line-427">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">428</span><span id="line-428">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">429</span><span id="line-429">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">430</span><span id="line-430">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">431</span><span id="line-431">      rpcServer.start();</span>
+<span class="source-line-no">432</span><span id="line-432">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">433</span><span id="line-433">      int num = 10;</span>
+<span class="source-line-no">434</span><span id="line-434">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">435</span><span id="line-435">      List&lt;BlockingRpcCallback&lt;EchoResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">436</span><span id="line-436">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">437</span><span id="line-437">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">438</span><span id="line-438">        BlockingRpcCallback&lt;EchoResponseProto&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">439</span><span id="line-439">        stub.echo(pcrc, EchoRequestProto.newBuilder().setMessage("hello-" + i).build(), done);</span>
+<span class="source-line-no">440</span><span id="line-440">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">441</span><span id="line-441">        callbackList.add(done);</span>
+<span class="source-line-no">442</span><span id="line-442">      }</span>
+<span class="source-line-no">443</span><span id="line-443">      for (int i = 0; i &lt; num; i++) {</span>
+<span class="source-line-no">444</span><span id="line-444">        EchoResponseProto resp = callbackList.get(i).get();</span>
+<span class="source-line-no">445</span><span id="line-445">        HBaseRpcController pcrc = pcrcList.get(i);</span>
+<span class="source-line-no">446</span><span id="line-446">        assertEquals("hello-" + i, resp.getMessage());</span>
+<span class="source-line-no">447</span><span id="line-447">        assertFalse(pcrc.failed());</span>
+<span class="source-line-no">448</span><span id="line-448">        assertNull(pcrc.cellScanner());</span>
+<span class="source-line-no">449</span><span id="line-449">      }</span>
+<span class="source-line-no">450</span><span id="line-450">    } finally {</span>
+<span class="source-line-no">451</span><span id="line-451">      rpcServer.stop();</span>
+<span class="source-line-no">452</span><span id="line-452">    }</span>
+<span class="source-line-no">453</span><span id="line-453">  }</span>
+<span class="source-line-no">454</span><span id="line-454"></span>
+<span class="source-line-no">455</span><span id="line-455">  @TestTemplate</span>
+<span class="source-line-no">456</span><span id="line-456">  public void testAsyncRemoteError() throws IOException {</span>
+<span class="source-line-no">457</span><span id="line-457">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">458</span><span id="line-458">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">459</span><span id="line-459">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">460</span><span id="line-460">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">461</span><span id="line-461">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">462</span><span id="line-462">      rpcServer.start();</span>
+<span class="source-line-no">463</span><span id="line-463">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">464</span><span id="line-464">      BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">465</span><span id="line-465">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">466</span><span id="line-466">      stub.error(pcrc, EmptyRequestProto.getDefaultInstance(), callback);</span>
+<span class="source-line-no">467</span><span id="line-467">      assertNull(callback.get());</span>
+<span class="source-line-no">468</span><span id="line-468">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">469</span><span id="line-469">      LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">470</span><span id="line-470">      IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">471</span><span id="line-471">      assertThat(ioe, instanceOf(DoNotRetryIOException.class));</span>
+<span class="source-line-no">472</span><span id="line-472">      assertThat(ioe.getMessage(), containsString("server error!"));</span>
+<span class="source-line-no">473</span><span id="line-473">    } finally {</span>
+<span class="source-line-no">474</span><span id="line-474">      rpcServer.stop();</span>
+<span class="source-line-no">475</span><span id="line-475">    }</span>
+<span class="source-line-no">476</span><span id="line-476">  }</span>
+<span class="source-line-no">477</span><span id="line-477"></span>
+<span class="source-line-no">478</span><span id="line-478">  @TestTemplate</span>
+<span class="source-line-no">479</span><span id="line-479">  public void testAsyncTimeout() throws IOException {</span>
+<span class="source-line-no">480</span><span id="line-480">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">481</span><span id="line-481">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">482</span><span id="line-482">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">483</span><span id="line-483">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">484</span><span id="line-484">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">485</span><span id="line-485">      rpcServer.start();</span>
+<span class="source-line-no">486</span><span id="line-486">      Interface stub = newStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">487</span><span id="line-487">      List&lt;HBaseRpcController&gt; pcrcList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">488</span><span id="line-488">      List&lt;BlockingRpcCallback&lt;EmptyResponseProto&gt;&gt; callbackList = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">489</span><span id="line-489">      int ms = 1000;</span>
+<span class="source-line-no">490</span><span id="line-490">      int timeout = 100;</span>
+<span class="source-line-no">491</span><span id="line-491">      long startTime = System.nanoTime();</span>
+<span class="source-line-no">492</span><span id="line-492">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">493</span><span id="line-493">        HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">494</span><span id="line-494">        pcrc.setCallTimeout(timeout);</span>
+<span class="source-line-no">495</span><span id="line-495">        BlockingRpcCallback&lt;EmptyResponseProto&gt; callback = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">496</span><span id="line-496">        stub.pause(pcrc, PauseRequestProto.newBuilder().setMs(ms).build(), callback);</span>
+<span class="source-line-no">497</span><span id="line-497">        pcrcList.add(pcrc);</span>
+<span class="source-line-no">498</span><span id="line-498">        callbackList.add(callback);</span>
+<span class="source-line-no">499</span><span id="line-499">      }</span>
+<span class="source-line-no">500</span><span id="line-500">      for (BlockingRpcCallback&lt;?&gt; callback : callbackList) {</span>
+<span class="source-line-no">501</span><span id="line-501">        assertNull(callback.get());</span>
+<span class="source-line-no">502</span><span id="line-502">      }</span>
+<span class="source-line-no">503</span><span id="line-503">      long waitTime = (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">504</span><span id="line-504">      for (HBaseRpcController pcrc : pcrcList) {</span>
+<span class="source-line-no">505</span><span id="line-505">        assertTrue(pcrc.failed());</span>
+<span class="source-line-no">506</span><span id="line-506">        LOG.info("Caught expected exception: " + pcrc.getFailed());</span>
+<span class="source-line-no">507</span><span id="line-507">        IOException ioe = ProtobufUtil.handleRemoteException(pcrc.getFailed());</span>
+<span class="source-line-no">508</span><span id="line-508">        assertThat(ioe.getCause(), instanceOf(CallTimeoutException.class));</span>
+<span class="source-line-no">509</span><span id="line-509">      }</span>
+<span class="source-line-no">510</span><span id="line-510">      // confirm that we got exception before the actual pause.</span>
+<span class="source-line-no">511</span><span id="line-511">      assertThat(waitTime, lessThan((long) ms));</span>
+<span class="source-line-no">512</span><span id="line-512">    } finally {</span>
+<span class="source-line-no">513</span><span id="line-513">      // wait until all active calls quit, otherwise it may mess up the tracing spans</span>
+<span class="source-line-no">514</span><span id="line-514">      await().atMost(Duration.ofSeconds(2))</span>
+<span class="source-line-no">515</span><span id="line-515">        .untilAsserted(() -&gt; assertEquals(0, rpcServer.getScheduler().getActiveRpcHandlerCount()));</span>
+<span class="source-line-no">516</span><span id="line-516">      rpcServer.stop();</span>
+<span class="source-line-no">517</span><span id="line-517">    }</span>
+<span class="source-line-no">518</span><span id="line-518">  }</span>
+<span class="source-line-no">519</span><span id="line-519"></span>
+<span class="source-line-no">520</span><span id="line-520">  private SpanData waitSpan(Matcher&lt;SpanData&gt; matcher) {</span>
+<span class="source-line-no">521</span><span id="line-521">    Waiter.waitFor(CONF, 1000, new MatcherPredicate&lt;&gt;(() -&gt; OTEL_EXT.getSpans(), hasItem(matcher)));</span>
+<span class="source-line-no">522</span><span id="line-522">    return OTEL_EXT.getSpans().stream().filter(matcher::matches).findFirst()</span>
+<span class="source-line-no">523</span><span id="line-523">      .orElseThrow(AssertionError::new);</span>
 <span class="source-line-no">524</span><span id="line-524">  }</span>
 <span class="source-line-no">525</span><span id="line-525"></span>
-<span class="source-line-no">526</span><span id="line-526">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">527</span><span id="line-527">    final String methodName) {</span>
-<span class="source-line-no">528</span><span id="line-528">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">529</span><span id="line-529">      hasKind(SpanKind.CLIENT));</span>
-<span class="source-line-no">530</span><span id="line-530">  }</span>
-<span class="source-line-no">531</span><span id="line-531"></span>
-<span class="source-line-no">532</span><span id="line-532">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
-<span class="source-line-no">533</span><span id="line-533">    final String methodName) {</span>
-<span class="source-line-no">534</span><span id="line-534">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
-<span class="source-line-no">535</span><span id="line-535">      hasKind(SpanKind.SERVER));</span>
-<span class="source-line-no">536</span><span id="line-536">  }</span>
-<span class="source-line-no">537</span><span id="line-537"></span>
-<span class="source-line-no">538</span><span id="line-538">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
-<span class="source-line-no">539</span><span id="line-539">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
-<span class="source-line-no">540</span><span id="line-540">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">541</span><span id="line-541">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
-<span class="source-line-no">542</span><span id="line-542">      containsEntry("net.peer.name", isa.getHostName()),</span>
-<span class="source-line-no">543</span><span id="line-543">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
-<span class="source-line-no">544</span><span id="line-544">  }</span>
-<span class="source-line-no">545</span><span id="line-545"></span>
-<span class="source-line-no">546</span><span id="line-546">  private static Matcher&lt;SpanData&gt;</span>
-<span class="source-line-no">547</span><span id="line-547">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
-<span class="source-line-no">548</span><span id="line-548">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
-<span class="source-line-no">549</span><span id="line-549">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
-<span class="source-line-no">550</span><span id="line-550">  }</span>
-<span class="source-line-no">551</span><span id="line-551"></span>
-<span class="source-line-no">552</span><span id="line-552">  private void assertRemoteSpan() {</span>
-<span class="source-line-no">553</span><span id="line-553">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
-<span class="source-line-no">554</span><span id="line-554">    assertTrue(data.getParentSpanContext().isRemote());</span>
-<span class="source-line-no">555</span><span id="line-555">    assertEquals(SpanKind.SERVER, data.getKind());</span>
-<span class="source-line-no">556</span><span id="line-556">  }</span>
-<span class="source-line-no">557</span><span id="line-557"></span>
-<span class="source-line-no">558</span><span id="line-558">  @Test</span>
-<span class="source-line-no">559</span><span id="line-559">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
-<span class="source-line-no">560</span><span id="line-560">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">561</span><span id="line-561">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">562</span><span id="line-562">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">563</span><span id="line-563">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">564</span><span id="line-564">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">565</span><span id="line-565">      rpcServer.start();</span>
-<span class="source-line-no">566</span><span id="line-566">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">567</span><span id="line-567">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
-<span class="source-line-no">568</span><span id="line-568">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">569</span><span id="line-569">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">570</span><span id="line-570">      final SpanData pauseClientSpan =</span>
-<span class="source-line-no">571</span><span id="line-571">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">572</span><span id="line-572">      assertThat(pauseClientSpan,</span>
-<span class="source-line-no">573</span><span id="line-573">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
-<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseServerSpan =</span>
-<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseServerSpan,</span>
-<span class="source-line-no">577</span><span id="line-577">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
-<span class="source-line-no">578</span><span id="line-578">      assertRemoteSpan();</span>
-<span class="source-line-no">579</span><span id="line-579">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">580</span><span id="line-580">      assertThat(traceRule.getSpans(),</span>
-<span class="source-line-no">581</span><span id="line-581">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
-<span class="source-line-no">582</span><span id="line-582">          hasTraceId(traceRule.getSpans().iterator().next().getTraceId()),</span>
-<span class="source-line-no">583</span><span id="line-583">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
-<span class="source-line-no">584</span><span id="line-584">    } finally {</span>
-<span class="source-line-no">585</span><span id="line-585">      rpcServer.stop();</span>
-<span class="source-line-no">586</span><span id="line-586">    }</span>
-<span class="source-line-no">587</span><span id="line-587">  }</span>
-<span class="source-line-no">588</span><span id="line-588"></span>
-<span class="source-line-no">589</span><span id="line-589">  @Test</span>
-<span class="source-line-no">590</span><span id="line-590">  public void testTracingErrorIpc() throws IOException {</span>
-<span class="source-line-no">591</span><span id="line-591">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">592</span><span id="line-592">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
-<span class="source-line-no">593</span><span id="line-593">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
-<span class="source-line-no">594</span><span id="line-594">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">595</span><span id="line-595">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">596</span><span id="line-596">      rpcServer.start();</span>
-<span class="source-line-no">597</span><span id="line-597">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">598</span><span id="line-598">      // use the ISA from the running server so that we can get the port selected.</span>
-<span class="source-line-no">599</span><span id="line-599">      assertThrows(ServiceException.class,</span>
-<span class="source-line-no">600</span><span id="line-600">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
-<span class="source-line-no">601</span><span id="line-601">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">602</span><span id="line-602">      final SpanData errorClientSpan =</span>
-<span class="source-line-no">603</span><span id="line-603">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">604</span><span id="line-604">      assertThat(errorClientSpan,</span>
-<span class="source-line-no">605</span><span id="line-605">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
-<span class="source-line-no">606</span><span id="line-606">      final SpanData errorServerSpan =</span>
-<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">608</span><span id="line-608">      assertThat(errorServerSpan,</span>
-<span class="source-line-no">609</span><span id="line-609">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
-<span class="source-line-no">610</span><span id="line-610">      assertRemoteSpan();</span>
-<span class="source-line-no">611</span><span id="line-611">      assertFalse("no spans provided", traceRule.getSpans().isEmpty());</span>
-<span class="source-line-no">612</span><span id="line-612">      assertThat(traceRule.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
-<span class="source-line-no">613</span><span id="line-613">        hasTraceId(traceRule.getSpans().iterator().next().getTraceId()))));</span>
-<span class="source-line-no">614</span><span id="line-614">    } finally {</span>
-<span class="source-line-no">615</span><span id="line-615">      rpcServer.stop();</span>
-<span class="source-line-no">616</span><span id="line-616">    }</span>
-<span class="source-line-no">617</span><span id="line-617">  }</span>
-<span class="source-line-no">618</span><span id="line-618"></span>
-<span class="source-line-no">619</span><span id="line-619">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
-<span class="source-line-no">620</span><span id="line-620"></span>
-<span class="source-line-no">621</span><span id="line-621">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
-<span class="source-line-no">622</span><span id="line-622">    ServiceException se = assertThrows(ServiceException.class,</span>
-<span class="source-line-no">623</span><span id="line-623">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
-<span class="source-line-no">624</span><span id="line-624">    return ProtobufUtil.handleRemoteException(se);</span>
-<span class="source-line-no">625</span><span id="line-625">  }</span>
-<span class="source-line-no">626</span><span id="line-626"></span>
-<span class="source-line-no">627</span><span id="line-627">  @Test</span>
-<span class="source-line-no">628</span><span id="line-628">  public void testBadPreambleHeader() throws Exception {</span>
-<span class="source-line-no">629</span><span id="line-629">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">630</span><span id="line-630">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">631</span><span id="line-631">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">632</span><span id="line-632">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
-<span class="source-line-no">633</span><span id="line-633">      rpcServer.start();</span>
-<span class="source-line-no">634</span><span id="line-634">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
-<span class="source-line-no">635</span><span id="line-635">      BadAuthException error = null;</span>
-<span class="source-line-no">636</span><span id="line-636">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
-<span class="source-line-no">637</span><span id="line-637">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
-<span class="source-line-no">638</span><span id="line-638">      for (int i = 0; i &lt; 10; i++) {</span>
-<span class="source-line-no">639</span><span id="line-639">        IOException ioe = doBadPreableHeaderCall(stub);</span>
-<span class="source-line-no">640</span><span id="line-640">        if (ioe instanceof BadAuthException) {</span>
-<span class="source-line-no">641</span><span id="line-641">          error = (BadAuthException) ioe;</span>
-<span class="source-line-no">642</span><span id="line-642">          break;</span>
-<span class="source-line-no">643</span><span id="line-643">        }</span>
-<span class="source-line-no">644</span><span id="line-644">        Thread.sleep(100);</span>
-<span class="source-line-no">645</span><span id="line-645">      }</span>
-<span class="source-line-no">646</span><span id="line-646">      assertNotNull("Can not get expected BadAuthException", error);</span>
-<span class="source-line-no">647</span><span id="line-647">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
-<span class="source-line-no">648</span><span id="line-648">    } finally {</span>
-<span class="source-line-no">649</span><span id="line-649">      rpcServer.stop();</span>
-<span class="source-line-no">650</span><span id="line-650">    }</span>
-<span class="source-line-no">651</span><span id="line-651">  }</span>
-<span class="source-line-no">652</span><span id="line-652"></span>
-<span class="source-line-no">653</span><span id="line-653">  /**</span>
-<span class="source-line-no">654</span><span id="line-654">   * Testcase for getting connection registry information through connection preamble header, see</span>
-<span class="source-line-no">655</span><span id="line-655">   * HBASE-25051 for more details.</span>
-<span class="source-line-no">656</span><span id="line-656">   */</span>
-<span class="source-line-no">657</span><span id="line-657">  @Test</span>
-<span class="source-line-no">658</span><span id="line-658">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
-<span class="source-line-no">659</span><span id="line-659">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">660</span><span id="line-660">    String clusterId = "test_cluster_id";</span>
-<span class="source-line-no">661</span><span id="line-661">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
-<span class="source-line-no">662</span><span id="line-662">    when(server.getClusterId()).thenReturn(clusterId);</span>
-<span class="source-line-no">663</span><span id="line-663">    // do not need any services</span>
-<span class="source-line-no">664</span><span id="line-664">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">665</span><span id="line-665">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">666</span><span id="line-666">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">667</span><span id="line-667">      rpcServer.start();</span>
-<span class="source-line-no">668</span><span id="line-668">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">669</span><span id="line-669">      BlockingRpcChannel channel =</span>
-<span class="source-line-no">670</span><span id="line-670">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
-<span class="source-line-no">671</span><span id="line-671">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">672</span><span id="line-672">      ConnectionRegistryService.BlockingInterface stub =</span>
-<span class="source-line-no">673</span><span id="line-673">        ConnectionRegistryService.newBlockingStub(channel);</span>
-<span class="source-line-no">674</span><span id="line-674">      GetConnectionRegistryResponse resp =</span>
-<span class="source-line-no">675</span><span id="line-675">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
-<span class="source-line-no">676</span><span id="line-676">      assertEquals(clusterId, resp.getClusterId());</span>
-<span class="source-line-no">677</span><span id="line-677">    } finally {</span>
-<span class="source-line-no">678</span><span id="line-678">      rpcServer.stop();</span>
-<span class="source-line-no">679</span><span id="line-679">    }</span>
-<span class="source-line-no">680</span><span id="line-680">  }</span>
-<span class="source-line-no">681</span><span id="line-681"></span>
-<span class="source-line-no">682</span><span id="line-682">  /**</span>
-<span class="source-line-no">683</span><span id="line-683">   * Test server does not support getting connection registry information through connection</span>
-<span class="source-line-no">684</span><span id="line-684">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
-<span class="source-line-no">685</span><span id="line-685">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
-<span class="source-line-no">686</span><span id="line-686">   */</span>
-<span class="source-line-no">687</span><span id="line-687">  @Test</span>
-<span class="source-line-no">688</span><span id="line-688">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
-<span class="source-line-no">689</span><span id="line-689">    Configuration clientConf = new Configuration(CONF);</span>
-<span class="source-line-no">690</span><span id="line-690">    // do not need any services</span>
-<span class="source-line-no">691</span><span id="line-691">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
-<span class="source-line-no">692</span><span id="line-692">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
-<span class="source-line-no">693</span><span id="line-693">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
-<span class="source-line-no">694</span><span id="line-694">      rpcServer.start();</span>
-<span class="source-line-no">695</span><span id="line-695">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
-<span class="source-line-no">696</span><span id="line-696">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
-<span class="source-line-no">697</span><span id="line-697">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
-<span class="source-line-no">698</span><span id="line-698">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
-<span class="source-line-no">699</span><span id="line-699">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
-<span class="source-line-no">700</span><span id="line-700">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
-<span class="source-line-no">701</span><span id="line-701">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
-<span class="source-line-no">702</span><span id="line-702">      // should have failed so no response</span>
-<span class="source-line-no">703</span><span id="line-703">      assertNull(done.get());</span>
-<span class="source-line-no">704</span><span id="line-704">      assertTrue(pcrc.failed());</span>
-<span class="source-line-no">705</span><span id="line-705">      // should be a FatalConnectionException</span>
-<span class="source-line-no">706</span><span id="line-706">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
-<span class="source-line-no">707</span><span id="line-707">      assertEquals(FatalConnectionException.class.getName(),</span>
-<span class="source-line-no">708</span><span id="line-708">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
-<span class="source-line-no">709</span><span id="line-709">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
-<span class="source-line-no">710</span><span id="line-710">    } finally {</span>
-<span class="source-line-no">711</span><span id="line-711">      rpcServer.stop();</span>
-<span class="source-line-no">712</span><span id="line-712">    }</span>
-<span class="source-line-no">713</span><span id="line-713">  }</span>
-<span class="source-line-no">714</span><span id="line-714">}</span>
+<span class="source-line-no">526</span><span id="line-526">  private static String buildIpcSpanName(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">527</span><span id="line-527">    return packageAndService + "/" + methodName;</span>
+<span class="source-line-no">528</span><span id="line-528">  }</span>
+<span class="source-line-no">529</span><span id="line-529"></span>
+<span class="source-line-no">530</span><span id="line-530">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">531</span><span id="line-531">    final String methodName) {</span>
+<span class="source-line-no">532</span><span id="line-532">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">533</span><span id="line-533">      hasKind(SpanKind.CLIENT));</span>
+<span class="source-line-no">534</span><span id="line-534">  }</span>
+<span class="source-line-no">535</span><span id="line-535"></span>
+<span class="source-line-no">536</span><span id="line-536">  private static Matcher&lt;SpanData&gt; buildIpcServerSpanMatcher(final String packageAndService,</span>
+<span class="source-line-no">537</span><span id="line-537">    final String methodName) {</span>
+<span class="source-line-no">538</span><span id="line-538">    return allOf(hasName(buildIpcSpanName(packageAndService, methodName)),</span>
+<span class="source-line-no">539</span><span id="line-539">      hasKind(SpanKind.SERVER));</span>
+<span class="source-line-no">540</span><span id="line-540">  }</span>
+<span class="source-line-no">541</span><span id="line-541"></span>
+<span class="source-line-no">542</span><span id="line-542">  private static Matcher&lt;SpanData&gt; buildIpcClientSpanAttributesMatcher(</span>
+<span class="source-line-no">543</span><span id="line-543">    final String packageAndService, final String methodName, final InetSocketAddress isa) {</span>
+<span class="source-line-no">544</span><span id="line-544">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">545</span><span id="line-545">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName),</span>
+<span class="source-line-no">546</span><span id="line-546">      containsEntry("net.peer.name", isa.getHostName()),</span>
+<span class="source-line-no">547</span><span id="line-547">      containsEntry(AttributeKey.longKey("net.peer.port"), (long) isa.getPort())));</span>
+<span class="source-line-no">548</span><span id="line-548">  }</span>
+<span class="source-line-no">549</span><span id="line-549"></span>
+<span class="source-line-no">550</span><span id="line-550">  private static Matcher&lt;SpanData&gt;</span>
+<span class="source-line-no">551</span><span id="line-551">    buildIpcServerSpanAttributesMatcher(final String packageAndService, final String methodName) {</span>
+<span class="source-line-no">552</span><span id="line-552">    return hasAttributes(allOf(containsEntry("rpc.system", "HBASE_RPC"),</span>
+<span class="source-line-no">553</span><span id="line-553">      containsEntry("rpc.service", packageAndService), containsEntry("rpc.method", methodName)));</span>
+<span class="source-line-no">554</span><span id="line-554">  }</span>
+<span class="source-line-no">555</span><span id="line-555"></span>
+<span class="source-line-no">556</span><span id="line-556">  private void assertRemoteSpan() {</span>
+<span class="source-line-no">557</span><span id="line-557">    SpanData data = waitSpan(hasName("RpcServer.process"));</span>
+<span class="source-line-no">558</span><span id="line-558">    assertTrue(data.getParentSpanContext().isRemote());</span>
+<span class="source-line-no">559</span><span id="line-559">    assertEquals(SpanKind.SERVER, data.getKind());</span>
+<span class="source-line-no">560</span><span id="line-560">  }</span>
+<span class="source-line-no">561</span><span id="line-561"></span>
+<span class="source-line-no">562</span><span id="line-562">  @TestTemplate</span>
+<span class="source-line-no">563</span><span id="line-563">  public void testTracingSuccessIpc() throws IOException, ServiceException {</span>
+<span class="source-line-no">564</span><span id="line-564">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">565</span><span id="line-565">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">566</span><span id="line-566">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">567</span><span id="line-567">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">568</span><span id="line-568">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">569</span><span id="line-569">      rpcServer.start();</span>
+<span class="source-line-no">570</span><span id="line-570">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">571</span><span id="line-571">      stub.pause(null, PauseRequestProto.newBuilder().setMs(100).build());</span>
+<span class="source-line-no">572</span><span id="line-572">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">573</span><span id="line-573">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">574</span><span id="line-574">      final SpanData pauseClientSpan =</span>
+<span class="source-line-no">575</span><span id="line-575">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">576</span><span id="line-576">      assertThat(pauseClientSpan,</span>
+<span class="source-line-no">577</span><span id="line-577">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause", isa));</span>
+<span class="source-line-no">578</span><span id="line-578">      final SpanData pauseServerSpan =</span>
+<span class="source-line-no">579</span><span id="line-579">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">580</span><span id="line-580">      assertThat(pauseServerSpan,</span>
+<span class="source-line-no">581</span><span id="line-581">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "pause"));</span>
+<span class="source-line-no">582</span><span id="line-582">      assertRemoteSpan();</span>
+<span class="source-line-no">583</span><span id="line-583">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">584</span><span id="line-584">      assertThat(OTEL_EXT.getSpans(),</span>
+<span class="source-line-no">585</span><span id="line-585">        everyItem(allOf(hasStatusWithCode(StatusCode.OK),</span>
+<span class="source-line-no">586</span><span id="line-586">          hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()),</span>
+<span class="source-line-no">587</span><span id="line-587">          hasDuration(greaterThanOrEqualTo(Duration.ofMillis(100L))))));</span>
+<span class="source-line-no">588</span><span id="line-588">    } finally {</span>
+<span class="source-line-no">589</span><span id="line-589">      rpcServer.stop();</span>
+<span class="source-line-no">590</span><span id="line-590">    }</span>
+<span class="source-line-no">591</span><span id="line-591">  }</span>
+<span class="source-line-no">592</span><span id="line-592"></span>
+<span class="source-line-no">593</span><span id="line-593">  @TestTemplate</span>
+<span class="source-line-no">594</span><span id="line-594">  public void testTracingErrorIpc() throws IOException {</span>
+<span class="source-line-no">595</span><span id="line-595">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">596</span><span id="line-596">    RpcServer rpcServer = createRpcServer("testRpcServer",</span>
+<span class="source-line-no">597</span><span id="line-597">      Lists.newArrayList(new RpcServer.BlockingServiceAndInterface(SERVICE, null)),</span>
+<span class="source-line-no">598</span><span id="line-598">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">599</span><span id="line-599">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">600</span><span id="line-600">      rpcServer.start();</span>
+<span class="source-line-no">601</span><span id="line-601">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">602</span><span id="line-602">      // use the ISA from the running server so that we can get the port selected.</span>
+<span class="source-line-no">603</span><span id="line-603">      assertThrows(ServiceException.class,</span>
+<span class="source-line-no">604</span><span id="line-604">        () -&gt; stub.error(null, EmptyRequestProto.getDefaultInstance()));</span>
+<span class="source-line-no">605</span><span id="line-605">      final InetSocketAddress isa = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">606</span><span id="line-606">      final SpanData errorClientSpan =</span>
+<span class="source-line-no">607</span><span id="line-607">        waitSpan(buildIpcClientSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">608</span><span id="line-608">      assertThat(errorClientSpan,</span>
+<span class="source-line-no">609</span><span id="line-609">        buildIpcClientSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error", isa));</span>
+<span class="source-line-no">610</span><span id="line-610">      final SpanData errorServerSpan =</span>
+<span class="source-line-no">611</span><span id="line-611">        waitSpan(buildIpcServerSpanMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">612</span><span id="line-612">      assertThat(errorServerSpan,</span>
+<span class="source-line-no">613</span><span id="line-613">        buildIpcServerSpanAttributesMatcher("hbase.test.pb.TestProtobufRpcProto", "error"));</span>
+<span class="source-line-no">614</span><span id="line-614">      assertRemoteSpan();</span>
+<span class="source-line-no">615</span><span id="line-615">      assertFalse(OTEL_EXT.getSpans().isEmpty(), "no spans provided");</span>
+<span class="source-line-no">616</span><span id="line-616">      assertThat(OTEL_EXT.getSpans(), everyItem(allOf(hasStatusWithCode(StatusCode.ERROR),</span>
+<span class="source-line-no">617</span><span id="line-617">        hasTraceId(OTEL_EXT.getSpans().iterator().next().getTraceId()))));</span>
+<span class="source-line-no">618</span><span id="line-618">    } finally {</span>
+<span class="source-line-no">619</span><span id="line-619">      rpcServer.stop();</span>
+<span class="source-line-no">620</span><span id="line-620">    }</span>
+<span class="source-line-no">621</span><span id="line-621">  }</span>
+<span class="source-line-no">622</span><span id="line-622"></span>
+<span class="source-line-no">623</span><span id="line-623">  protected abstract AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf);</span>
+<span class="source-line-no">624</span><span id="line-624"></span>
+<span class="source-line-no">625</span><span id="line-625">  private IOException doBadPreableHeaderCall(BlockingInterface stub) {</span>
+<span class="source-line-no">626</span><span id="line-626">    ServiceException se = assertThrows(ServiceException.class,</span>
+<span class="source-line-no">627</span><span id="line-627">      () -&gt; stub.echo(null, EchoRequestProto.newBuilder().setMessage("hello").build()));</span>
+<span class="source-line-no">628</span><span id="line-628">    return ProtobufUtil.handleRemoteException(se);</span>
+<span class="source-line-no">629</span><span id="line-629">  }</span>
+<span class="source-line-no">630</span><span id="line-630"></span>
+<span class="source-line-no">631</span><span id="line-631">  @TestTemplate</span>
+<span class="source-line-no">632</span><span id="line-632">  public void testBadPreambleHeader() throws Exception {</span>
+<span class="source-line-no">633</span><span id="line-633">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">634</span><span id="line-634">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">635</span><span id="line-635">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">636</span><span id="line-636">    try (AbstractRpcClient&lt;?&gt; client = createBadAuthRpcClient(clientConf)) {</span>
+<span class="source-line-no">637</span><span id="line-637">      rpcServer.start();</span>
+<span class="source-line-no">638</span><span id="line-638">      BlockingInterface stub = newBlockingStub(client, rpcServer.getListenerAddress());</span>
+<span class="source-line-no">639</span><span id="line-639">      BadAuthException error = null;</span>
+<span class="source-line-no">640</span><span id="line-640">      // for SimpleRpcServer, it is possible that we get a broken pipe before getting the</span>
+<span class="source-line-no">641</span><span id="line-641">      // BadAuthException, so we add some retries here, see HBASE-28417</span>
+<span class="source-line-no">642</span><span id="line-642">      for (int i = 0; i &lt; 10; i++) {</span>
+<span class="source-line-no">643</span><span id="line-643">        IOException ioe = doBadPreableHeaderCall(stub);</span>
+<span class="source-line-no">644</span><span id="line-644">        if (ioe instanceof BadAuthException) {</span>
+<span class="source-line-no">645</span><span id="line-645">          error = (BadAuthException) ioe;</span>
+<span class="source-line-no">646</span><span id="line-646">          break;</span>
+<span class="source-line-no">647</span><span id="line-647">        }</span>
+<span class="source-line-no">648</span><span id="line-648">        Thread.sleep(100);</span>
+<span class="source-line-no">649</span><span id="line-649">      }</span>
+<span class="source-line-no">650</span><span id="line-650">      assertNotNull(error, "Can not get expected BadAuthException");</span>
+<span class="source-line-no">651</span><span id="line-651">      assertThat(error.getMessage(), containsString("authName=unknown"));</span>
+<span class="source-line-no">652</span><span id="line-652">    } finally {</span>
+<span class="source-line-no">653</span><span id="line-653">      rpcServer.stop();</span>
+<span class="source-line-no">654</span><span id="line-654">    }</span>
+<span class="source-line-no">655</span><span id="line-655">  }</span>
+<span class="source-line-no">656</span><span id="line-656"></span>
+<span class="source-line-no">657</span><span id="line-657">  /**</span>
+<span class="source-line-no">658</span><span id="line-658">   * Testcase for getting connection registry information through connection preamble header, see</span>
+<span class="source-line-no">659</span><span id="line-659">   * HBASE-25051 for more details.</span>
+<span class="source-line-no">660</span><span id="line-660">   */</span>
+<span class="source-line-no">661</span><span id="line-661">  @TestTemplate</span>
+<span class="source-line-no">662</span><span id="line-662">  public void testGetConnectionRegistry() throws IOException, ServiceException {</span>
+<span class="source-line-no">663</span><span id="line-663">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">664</span><span id="line-664">    String clusterId = "test_cluster_id";</span>
+<span class="source-line-no">665</span><span id="line-665">    HBaseServerBase&lt;?&gt; server = mock(HBaseServerBase.class);</span>
+<span class="source-line-no">666</span><span id="line-666">    when(server.getClusterId()).thenReturn(clusterId);</span>
+<span class="source-line-no">667</span><span id="line-667">    // do not need any services</span>
+<span class="source-line-no">668</span><span id="line-668">    RpcServer rpcServer = createRpcServer(server, "testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">669</span><span id="line-669">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">670</span><span id="line-670">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">671</span><span id="line-671">      rpcServer.start();</span>
+<span class="source-line-no">672</span><span id="line-672">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">673</span><span id="line-673">      BlockingRpcChannel channel =</span>
+<span class="source-line-no">674</span><span id="line-674">        client.createBlockingRpcChannel(ServerName.valueOf(addr.getHostName(), addr.getPort(),</span>
+<span class="source-line-no">675</span><span id="line-675">          EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">676</span><span id="line-676">      ConnectionRegistryService.BlockingInterface stub =</span>
+<span class="source-line-no">677</span><span id="line-677">        ConnectionRegistryService.newBlockingStub(channel);</span>
+<span class="source-line-no">678</span><span id="line-678">      GetConnectionRegistryResponse resp =</span>
+<span class="source-line-no">679</span><span id="line-679">        stub.getConnectionRegistry(null, GetConnectionRegistryRequest.getDefaultInstance());</span>
+<span class="source-line-no">680</span><span id="line-680">      assertEquals(clusterId, resp.getClusterId());</span>
+<span class="source-line-no">681</span><span id="line-681">    } finally {</span>
+<span class="source-line-no">682</span><span id="line-682">      rpcServer.stop();</span>
+<span class="source-line-no">683</span><span id="line-683">    }</span>
+<span class="source-line-no">684</span><span id="line-684">  }</span>
+<span class="source-line-no">685</span><span id="line-685"></span>
+<span class="source-line-no">686</span><span id="line-686">  /**</span>
+<span class="source-line-no">687</span><span id="line-687">   * Test server does not support getting connection registry information through connection</span>
+<span class="source-line-no">688</span><span id="line-688">   * preamble header, i.e, a new client connecting to an old server. We simulate this by using a</span>
+<span class="source-line-no">689</span><span id="line-689">   * Server without implementing the ConnectionRegistryEndpoint interface.</span>
+<span class="source-line-no">690</span><span id="line-690">   */</span>
+<span class="source-line-no">691</span><span id="line-691">  @TestTemplate</span>
+<span class="source-line-no">692</span><span id="line-692">  public void testGetConnectionRegistryError() throws IOException, ServiceException {</span>
+<span class="source-line-no">693</span><span id="line-693">    Configuration clientConf = new Configuration(CONF);</span>
+<span class="source-line-no">694</span><span id="line-694">    // do not need any services</span>
+<span class="source-line-no">695</span><span id="line-695">    RpcServer rpcServer = createRpcServer("testRpcServer", Collections.emptyList(),</span>
+<span class="source-line-no">696</span><span id="line-696">      new InetSocketAddress("localhost", 0), CONF, new FifoRpcScheduler(CONF, 1));</span>
+<span class="source-line-no">697</span><span id="line-697">    try (AbstractRpcClient&lt;?&gt; client = createRpcClient(clientConf)) {</span>
+<span class="source-line-no">698</span><span id="line-698">      rpcServer.start();</span>
+<span class="source-line-no">699</span><span id="line-699">      InetSocketAddress addr = rpcServer.getListenerAddress();</span>
+<span class="source-line-no">700</span><span id="line-700">      RpcChannel channel = client.createRpcChannel(ServerName.valueOf(addr.getHostName(),</span>
+<span class="source-line-no">701</span><span id="line-701">        addr.getPort(), EnvironmentEdgeManager.currentTime()), User.getCurrent(), 0);</span>
+<span class="source-line-no">702</span><span id="line-702">      ConnectionRegistryService.Interface stub = ConnectionRegistryService.newStub(channel);</span>
+<span class="source-line-no">703</span><span id="line-703">      HBaseRpcController pcrc = new HBaseRpcControllerImpl();</span>
+<span class="source-line-no">704</span><span id="line-704">      BlockingRpcCallback&lt;GetConnectionRegistryResponse&gt; done = new BlockingRpcCallback&lt;&gt;();</span>
+<span class="source-line-no">705</span><span id="line-705">      stub.getConnectionRegistry(pcrc, GetConnectionRegistryRequest.getDefaultInstance(), done);</span>
+<span class="source-line-no">706</span><span id="line-706">      // should have failed so no response</span>
+<span class="source-line-no">707</span><span id="line-707">      assertNull(done.get());</span>
+<span class="source-line-no">708</span><span id="line-708">      assertTrue(pcrc.failed());</span>
+<span class="source-line-no">709</span><span id="line-709">      // should be a FatalConnectionException</span>
+<span class="source-line-no">710</span><span id="line-710">      assertThat(pcrc.getFailed(), instanceOf(RemoteException.class));</span>
+<span class="source-line-no">711</span><span id="line-711">      assertEquals(FatalConnectionException.class.getName(),</span>
+<span class="source-line-no">712</span><span id="line-712">        ((RemoteException) pcrc.getFailed()).getClassName());</span>
+<span class="source-line-no">713</span><span id="line-713">      assertThat(pcrc.getFailed().getMessage(), startsWith("Expected HEADER="));</span>
+<span class="source-line-no">714</span><span id="line-714">    } finally {</span>
+<span class="source-line-no">715</span><span id="line-715">      rpcServer.stop();</span>
+<span class="source-line-no">716</span><span id="line-716">    }</span>
+<span class="source-line-no">717</span><span id="line-717">  }</span>
+<span class="source-line-no">718</span><span id="line-718">}</span>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
index a277e239b1c..2bcc4dfa63f 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestBlockingIPC.html
@@ -31,79 +31,74 @@
 <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.ipc;</span>
 <span class="source-line-no">019</span><span id="line-19"></span>
 <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
-<span class="source-line-no">021</span><span id="line-21">import java.util.Arrays;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.hbase.HBaseClassTestRule;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.codec.Codec;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.junit.ClassRule;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.junit.experimental.categories.Category;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.junit.runner.RunWith;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.junit.runners.Parameterized;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.junit.runners.Parameterized.Parameters;</span>
-<span class="source-line-no">033</span><span id="line-33"></span>
-<span class="source-line-no">034</span><span id="line-34">@RunWith(Parameterized.class)</span>
-<span class="source-line-no">035</span><span id="line-35">@Category({ RPCTests.class, MediumTests.class })</span>
-<span class="source-line-no">036</span><span id="line-36">public class TestBlockingIPC extends AbstractTestIPC {</span>
-<span class="source-line-no">037</span><span id="line-37"></span>
-<span class="source-line-no">038</span><span id="line-38">  @ClassRule</span>
-<span class="source-line-no">039</span><span id="line-39">  public static final HBaseClassTestRule CLASS_RULE =</span>
-<span class="source-line-no">040</span><span id="line-40">    HBaseClassTestRule.forClass(TestBlockingIPC.class);</span>
-<span class="source-line-no">041</span><span id="line-41"></span>
-<span class="source-line-no">042</span><span id="line-42">  @Parameters(name = "{index}: rpcServerImpl={0}")</span>
-<span class="source-line-no">043</span><span id="line-43">  public static List&lt;Object[]&gt; data() {</span>
-<span class="source-line-no">044</span><span id="line-44">    return Arrays.asList(new Object[] { SimpleRpcServer.class },</span>
-<span class="source-line-no">045</span><span id="line-45">      new Object[] { NettyRpcServer.class });</span>
-<span class="source-line-no">046</span><span id="line-46">  }</span>
-<span class="source-line-no">047</span><span id="line-47"></span>
-<span class="source-line-no">048</span><span id="line-48">  @Override</span>
-<span class="source-line-no">049</span><span id="line-49">  protected BlockingRpcClient createRpcClientNoCodec(Configuration conf) {</span>
-<span class="source-line-no">050</span><span id="line-50">    return new BlockingRpcClient(conf) {</span>
-<span class="source-line-no">051</span><span id="line-51">      @Override</span>
-<span class="source-line-no">052</span><span id="line-52">      protected Codec getCodec() {</span>
-<span class="source-line-no">053</span><span id="line-53">        return null;</span>
-<span class="source-line-no">054</span><span id="line-54">      }</span>
-<span class="source-line-no">055</span><span id="line-55">    };</span>
+<span class="source-line-no">021</span><span id="line-21">import java.util.stream.Stream;</span>
+<span class="source-line-no">022</span><span id="line-22">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">023</span><span id="line-23">import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;</span>
+<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.hbase.codec.Codec;</span>
+<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
+<span class="source-line-no">027</span><span id="line-27">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">028</span><span id="line-28">import org.junit.jupiter.params.provider.Arguments;</span>
+<span class="source-line-no">029</span><span id="line-29"></span>
+<span class="source-line-no">030</span><span id="line-30">@Tag(RPCTests.TAG)</span>
+<span class="source-line-no">031</span><span id="line-31">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">032</span><span id="line-32">@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}")</span>
+<span class="source-line-no">033</span><span id="line-33">public class TestBlockingIPC extends AbstractTestIPC {</span>
+<span class="source-line-no">034</span><span id="line-34"></span>
+<span class="source-line-no">035</span><span id="line-35">  public TestBlockingIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl) {</span>
+<span class="source-line-no">036</span><span id="line-36">    super(rpcServerImpl);</span>
+<span class="source-line-no">037</span><span id="line-37">  }</span>
+<span class="source-line-no">038</span><span id="line-38"></span>
+<span class="source-line-no">039</span><span id="line-39">  public static Stream&lt;Arguments&gt; parameters() {</span>
+<span class="source-line-no">040</span><span id="line-40">    return Stream.of(Arguments.of(SimpleRpcServer.class), Arguments.of(NettyRpcServer.class));</span>
+<span class="source-line-no">041</span><span id="line-41">  }</span>
+<span class="source-line-no">042</span><span id="line-42"></span>
+<span class="source-line-no">043</span><span id="line-43">  @Override</span>
+<span class="source-line-no">044</span><span id="line-44">  protected BlockingRpcClient createRpcClientNoCodec(Configuration conf) {</span>
+<span class="source-line-no">045</span><span id="line-45">    return new BlockingRpcClient(conf) {</span>
+<span class="source-line-no">046</span><span id="line-46">      @Override</span>
+<span class="source-line-no">047</span><span id="line-47">      protected Codec getCodec() {</span>
+<span class="source-line-no">048</span><span id="line-48">        return null;</span>
+<span class="source-line-no">049</span><span id="line-49">      }</span>
+<span class="source-line-no">050</span><span id="line-50">    };</span>
+<span class="source-line-no">051</span><span id="line-51">  }</span>
+<span class="source-line-no">052</span><span id="line-52"></span>
+<span class="source-line-no">053</span><span id="line-53">  @Override</span>
+<span class="source-line-no">054</span><span id="line-54">  protected BlockingRpcClient createRpcClient(Configuration conf) {</span>
+<span class="source-line-no">055</span><span id="line-55">    return new BlockingRpcClient(conf);</span>
 <span class="source-line-no">056</span><span id="line-56">  }</span>
 <span class="source-line-no">057</span><span id="line-57"></span>
 <span class="source-line-no">058</span><span id="line-58">  @Override</span>
-<span class="source-line-no">059</span><span id="line-59">  protected BlockingRpcClient createRpcClient(Configuration conf) {</span>
-<span class="source-line-no">060</span><span id="line-60">    return new BlockingRpcClient(conf);</span>
-<span class="source-line-no">061</span><span id="line-61">  }</span>
+<span class="source-line-no">059</span><span id="line-59">  protected BlockingRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)</span>
+<span class="source-line-no">060</span><span id="line-60">    throws IOException {</span>
+<span class="source-line-no">061</span><span id="line-61">    return new BlockingRpcClient(conf) {</span>
 <span class="source-line-no">062</span><span id="line-62"></span>
-<span class="source-line-no">063</span><span id="line-63">  @Override</span>
-<span class="source-line-no">064</span><span id="line-64">  protected BlockingRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)</span>
-<span class="source-line-no">065</span><span id="line-65">    throws IOException {</span>
-<span class="source-line-no">066</span><span id="line-66">    return new BlockingRpcClient(conf) {</span>
-<span class="source-line-no">067</span><span id="line-67"></span>
-<span class="source-line-no">068</span><span id="line-68">      @Override</span>
-<span class="source-line-no">069</span><span id="line-69">      protected boolean isTcpNoDelay() {</span>
-<span class="source-line-no">070</span><span id="line-70">        throw new RuntimeException("Injected fault");</span>
-<span class="source-line-no">071</span><span id="line-71">      }</span>
-<span class="source-line-no">072</span><span id="line-72">    };</span>
-<span class="source-line-no">073</span><span id="line-73">  }</span>
-<span class="source-line-no">074</span><span id="line-74"></span>
-<span class="source-line-no">075</span><span id="line-75">  @Override</span>
-<span class="source-line-no">076</span><span id="line-76">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
-<span class="source-line-no">077</span><span id="line-77">    return new BlockingRpcClient(conf) {</span>
-<span class="source-line-no">078</span><span id="line-78"></span>
-<span class="source-line-no">079</span><span id="line-79">      @Override</span>
-<span class="source-line-no">080</span><span id="line-80">      protected BlockingRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
-<span class="source-line-no">081</span><span id="line-81">        return new BlockingRpcConnection(this, remoteId) {</span>
-<span class="source-line-no">082</span><span id="line-82">          @Override</span>
-<span class="source-line-no">083</span><span id="line-83">          protected byte[] getConnectionHeaderPreamble() {</span>
-<span class="source-line-no">084</span><span id="line-84">            byte[] header = super.getConnectionHeaderPreamble();</span>
-<span class="source-line-no">085</span><span id="line-85">            // set an invalid auth code</span>
-<span class="source-line-no">086</span><span id="line-86">            header[header.length - 1] = -10;</span>
-<span class="source-line-no">087</span><span id="line-87">            return header;</span>
-<span class="source-line-no">088</span><span id="line-88">          }</span>
-<span class="source-line-no">089</span><span id="line-89">        };</span>
-<span class="source-line-no">090</span><span id="line-90">      }</span>
-<span class="source-line-no">091</span><span id="line-91">    };</span>
-<span class="source-line-no">092</span><span id="line-92">  }</span>
-<span class="source-line-no">093</span><span id="line-93">}</span>
+<span class="source-line-no">063</span><span id="line-63">      @Override</span>
+<span class="source-line-no">064</span><span id="line-64">      protected boolean isTcpNoDelay() {</span>
+<span class="source-line-no">065</span><span id="line-65">        throw new RuntimeException("Injected fault");</span>
+<span class="source-line-no">066</span><span id="line-66">      }</span>
+<span class="source-line-no">067</span><span id="line-67">    };</span>
+<span class="source-line-no">068</span><span id="line-68">  }</span>
+<span class="source-line-no">069</span><span id="line-69"></span>
+<span class="source-line-no">070</span><span id="line-70">  @Override</span>
+<span class="source-line-no">071</span><span id="line-71">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
+<span class="source-line-no">072</span><span id="line-72">    return new BlockingRpcClient(conf) {</span>
+<span class="source-line-no">073</span><span id="line-73"></span>
+<span class="source-line-no">074</span><span id="line-74">      @Override</span>
+<span class="source-line-no">075</span><span id="line-75">      protected BlockingRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
+<span class="source-line-no">076</span><span id="line-76">        return new BlockingRpcConnection(this, remoteId) {</span>
+<span class="source-line-no">077</span><span id="line-77">          @Override</span>
+<span class="source-line-no">078</span><span id="line-78">          protected byte[] getConnectionHeaderPreamble() {</span>
+<span class="source-line-no">079</span><span id="line-79">            byte[] header = super.getConnectionHeaderPreamble();</span>
+<span class="source-line-no">080</span><span id="line-80">            // set an invalid auth code</span>
+<span class="source-line-no">081</span><span id="line-81">            header[header.length - 1] = -10;</span>
+<span class="source-line-no">082</span><span id="line-82">            return header;</span>
+<span class="source-line-no">083</span><span id="line-83">          }</span>
+<span class="source-line-no">084</span><span id="line-84">        };</span>
+<span class="source-line-no">085</span><span id="line-85">      }</span>
+<span class="source-line-no">086</span><span id="line-86">    };</span>
+<span class="source-line-no">087</span><span id="line-87">  }</span>
+<span class="source-line-no">088</span><span id="line-88">}</span>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
index 8a884a10565..ee67d77c314 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyIPC.html
@@ -33,137 +33,134 @@
 <span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
 <span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
 <span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.hbase.HBaseClassTestRule;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.codec.Codec;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.util.JVM;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.junit.AfterClass;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.junit.BeforeClass;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.junit.ClassRule;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.junit.experimental.categories.Category;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.junit.runner.RunWith;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.junit.runners.Parameterized;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.junit.runners.Parameterized.Parameter;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.junit.runners.Parameterized.Parameters;</span>
-<span class="source-line-no">037</span><span id="line-37"></span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollSocketChannel;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioSocketChannel;</span>
-<span class="source-line-no">042</span><span id="line-42"></span>
-<span class="source-line-no">043</span><span id="line-43">@RunWith(Parameterized.class)</span>
-<span class="source-line-no">044</span><span id="line-44">@Category({ RPCTests.class, MediumTests.class })</span>
-<span class="source-line-no">045</span><span id="line-45">public class TestNettyIPC extends AbstractTestIPC {</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">  @ClassRule</span>
-<span class="source-line-no">048</span><span id="line-48">  public static final HBaseClassTestRule CLASS_RULE =</span>
-<span class="source-line-no">049</span><span id="line-49">    HBaseClassTestRule.forClass(TestNettyIPC.class);</span>
-<span class="source-line-no">050</span><span id="line-50"></span>
-<span class="source-line-no">051</span><span id="line-51">  private static List&lt;String&gt; getEventLoopTypes() {</span>
-<span class="source-line-no">052</span><span id="line-52">    List&lt;String&gt; types = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">053</span><span id="line-53">    types.add("nio");</span>
-<span class="source-line-no">054</span><span id="line-54">    types.add("perClientNio");</span>
-<span class="source-line-no">055</span><span id="line-55">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
-<span class="source-line-no">056</span><span id="line-56">      types.add("epoll");</span>
-<span class="source-line-no">057</span><span id="line-57">    }</span>
-<span class="source-line-no">058</span><span id="line-58">    return types;</span>
-<span class="source-line-no">059</span><span id="line-59">  }</span>
-<span class="source-line-no">060</span><span id="line-60"></span>
-<span class="source-line-no">061</span><span id="line-61">  @Parameters(name = "{index}: rpcServerImpl={0}, EventLoop={1}")</span>
-<span class="source-line-no">062</span><span id="line-62">  public static List&lt;Object[]&gt; parameters() {</span>
-<span class="source-line-no">063</span><span id="line-63">    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">064</span><span id="line-64">    for (String eventLoopType : getEventLoopTypes()) {</span>
-<span class="source-line-no">065</span><span id="line-65">      params.add(new Object[] { SimpleRpcServer.class, eventLoopType });</span>
-<span class="source-line-no">066</span><span id="line-66">      params.add(new Object[] { NettyRpcServer.class, eventLoopType });</span>
-<span class="source-line-no">067</span><span id="line-67">    }</span>
-<span class="source-line-no">068</span><span id="line-68">    return params;</span>
+<span class="source-line-no">023</span><span id="line-23">import java.util.stream.Stream;</span>
+<span class="source-line-no">024</span><span id="line-24">import org.apache.hadoop.conf.Configuration;</span>
+<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;</span>
+<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.codec.Codec;</span>
+<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
+<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.util.JVM;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">032</span><span id="line-32">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.junit.jupiter.params.provider.Arguments;</span>
+<span class="source-line-no">034</span><span id="line-34"></span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoopGroup;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollSocketChannel;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioSocketChannel;</span>
+<span class="source-line-no">039</span><span id="line-39"></span>
+<span class="source-line-no">040</span><span id="line-40">@Tag(RPCTests.TAG)</span>
+<span class="source-line-no">041</span><span id="line-41">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">042</span><span id="line-42">@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}, EventLoop={1}")</span>
+<span class="source-line-no">043</span><span id="line-43">public class TestNettyIPC extends AbstractTestIPC {</span>
+<span class="source-line-no">044</span><span id="line-44"></span>
+<span class="source-line-no">045</span><span id="line-45">  private static List&lt;String&gt; getEventLoopTypes() {</span>
+<span class="source-line-no">046</span><span id="line-46">    List&lt;String&gt; types = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">047</span><span id="line-47">    types.add("nio");</span>
+<span class="source-line-no">048</span><span id="line-48">    types.add("perClientNio");</span>
+<span class="source-line-no">049</span><span id="line-49">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
+<span class="source-line-no">050</span><span id="line-50">      types.add("epoll");</span>
+<span class="source-line-no">051</span><span id="line-51">    }</span>
+<span class="source-line-no">052</span><span id="line-52">    return types;</span>
+<span class="source-line-no">053</span><span id="line-53">  }</span>
+<span class="source-line-no">054</span><span id="line-54"></span>
+<span class="source-line-no">055</span><span id="line-55">  public static Stream&lt;Arguments&gt; parameters() {</span>
+<span class="source-line-no">056</span><span id="line-56">    List&lt;Arguments&gt; params = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">057</span><span id="line-57">    for (String eventLoopType : getEventLoopTypes()) {</span>
+<span class="source-line-no">058</span><span id="line-58">      params.add(Arguments.of(SimpleRpcServer.class, eventLoopType));</span>
+<span class="source-line-no">059</span><span id="line-59">      params.add(Arguments.of(NettyRpcServer.class, eventLoopType));</span>
+<span class="source-line-no">060</span><span id="line-60">    }</span>
+<span class="source-line-no">061</span><span id="line-61">    return params.stream();</span>
+<span class="source-line-no">062</span><span id="line-62">  }</span>
+<span class="source-line-no">063</span><span id="line-63"></span>
+<span class="source-line-no">064</span><span id="line-64">  private String eventLoopType;</span>
+<span class="source-line-no">065</span><span id="line-65"></span>
+<span class="source-line-no">066</span><span id="line-66">  public TestNettyIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl, String eventLoopType) {</span>
+<span class="source-line-no">067</span><span id="line-67">    super(rpcServerImpl);</span>
+<span class="source-line-no">068</span><span id="line-68">    this.eventLoopType = eventLoopType;</span>
 <span class="source-line-no">069</span><span id="line-69">  }</span>
 <span class="source-line-no">070</span><span id="line-70"></span>
-<span class="source-line-no">071</span><span id="line-71">  @Parameter(1)</span>
-<span class="source-line-no">072</span><span id="line-72">  public String eventLoopType;</span>
-<span class="source-line-no">073</span><span id="line-73"></span>
-<span class="source-line-no">074</span><span id="line-74">  private static NioEventLoopGroup NIO;</span>
-<span class="source-line-no">075</span><span id="line-75"></span>
-<span class="source-line-no">076</span><span id="line-76">  private static EpollEventLoopGroup EPOLL;</span>
-<span class="source-line-no">077</span><span id="line-77"></span>
-<span class="source-line-no">078</span><span id="line-78">  @BeforeClass</span>
-<span class="source-line-no">079</span><span id="line-79">  public static void setUpBeforeClass() {</span>
-<span class="source-line-no">080</span><span id="line-80">    NIO = new NioEventLoopGroup();</span>
-<span class="source-line-no">081</span><span id="line-81">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
-<span class="source-line-no">082</span><span id="line-82">      EPOLL = new EpollEventLoopGroup();</span>
-<span class="source-line-no">083</span><span id="line-83">    }</span>
-<span class="source-line-no">084</span><span id="line-84">  }</span>
-<span class="source-line-no">085</span><span id="line-85"></span>
-<span class="source-line-no">086</span><span id="line-86">  @AfterClass</span>
-<span class="source-line-no">087</span><span id="line-87">  public static void tearDownAfterClass() {</span>
-<span class="source-line-no">088</span><span id="line-88">    if (NIO != null) {</span>
-<span class="source-line-no">089</span><span id="line-89">      NIO.shutdownGracefully();</span>
+<span class="source-line-no">071</span><span id="line-71">  private static NioEventLoopGroup NIO;</span>
+<span class="source-line-no">072</span><span id="line-72"></span>
+<span class="source-line-no">073</span><span id="line-73">  private static EpollEventLoopGroup EPOLL;</span>
+<span class="source-line-no">074</span><span id="line-74"></span>
+<span class="source-line-no">075</span><span id="line-75">  @BeforeAll</span>
+<span class="source-line-no">076</span><span id="line-76">  public static void setUpBeforeClass() {</span>
+<span class="source-line-no">077</span><span id="line-77">    NIO = new NioEventLoopGroup();</span>
+<span class="source-line-no">078</span><span id="line-78">    if (JVM.isLinux() &amp;&amp; JVM.isAmd64()) {</span>
+<span class="source-line-no">079</span><span id="line-79">      EPOLL = new EpollEventLoopGroup();</span>
+<span class="source-line-no">080</span><span id="line-80">    }</span>
+<span class="source-line-no">081</span><span id="line-81">  }</span>
+<span class="source-line-no">082</span><span id="line-82"></span>
+<span class="source-line-no">083</span><span id="line-83">  @AfterAll</span>
+<span class="source-line-no">084</span><span id="line-84">  public static void tearDownAfterClass() {</span>
+<span class="source-line-no">085</span><span id="line-85">    if (NIO != null) {</span>
+<span class="source-line-no">086</span><span id="line-86">      NIO.shutdownGracefully();</span>
+<span class="source-line-no">087</span><span id="line-87">    }</span>
+<span class="source-line-no">088</span><span id="line-88">    if (EPOLL != null) {</span>
+<span class="source-line-no">089</span><span id="line-89">      EPOLL.shutdownGracefully();</span>
 <span class="source-line-no">090</span><span id="line-90">    }</span>
-<span class="source-line-no">091</span><span id="line-91">    if (EPOLL != null) {</span>
-<span class="source-line-no">092</span><span id="line-92">      EPOLL.shutdownGracefully();</span>
-<span class="source-line-no">093</span><span id="line-93">    }</span>
-<span class="source-line-no">094</span><span id="line-94">  }</span>
-<span class="source-line-no">095</span><span id="line-95"></span>
-<span class="source-line-no">096</span><span id="line-96">  private void setConf(Configuration conf) {</span>
-<span class="source-line-no">097</span><span id="line-97">    switch (eventLoopType) {</span>
-<span class="source-line-no">098</span><span id="line-98">      case "nio":</span>
-<span class="source-line-no">099</span><span id="line-99">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, NIO, NioSocketChannel.class);</span>
+<span class="source-line-no">091</span><span id="line-91">  }</span>
+<span class="source-line-no">092</span><span id="line-92"></span>
+<span class="source-line-no">093</span><span id="line-93">  private void setConf(Configuration conf) {</span>
+<span class="source-line-no">094</span><span id="line-94">    switch (eventLoopType) {</span>
+<span class="source-line-no">095</span><span id="line-95">      case "nio":</span>
+<span class="source-line-no">096</span><span id="line-96">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, NIO, NioSocketChannel.class);</span>
+<span class="source-line-no">097</span><span id="line-97">        break;</span>
+<span class="source-line-no">098</span><span id="line-98">      case "epoll":</span>
+<span class="source-line-no">099</span><span id="line-99">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, EPOLL, EpollSocketChannel.class);</span>
 <span class="source-line-no">100</span><span id="line-100">        break;</span>
-<span class="source-line-no">101</span><span id="line-101">      case "epoll":</span>
-<span class="source-line-no">102</span><span id="line-102">        NettyRpcClientConfigHelper.setEventLoopConfig(conf, EPOLL, EpollSocketChannel.class);</span>
+<span class="source-line-no">101</span><span id="line-101">      case "perClientNio":</span>
+<span class="source-line-no">102</span><span id="line-102">        NettyRpcClientConfigHelper.createEventLoopPerClient(conf);</span>
 <span class="source-line-no">103</span><span id="line-103">        break;</span>
-<span class="source-line-no">104</span><span id="line-104">      case "perClientNio":</span>
-<span class="source-line-no">105</span><span id="line-105">        NettyRpcClientConfigHelper.createEventLoopPerClient(conf);</span>
-<span class="source-line-no">106</span><span id="line-106">        break;</span>
-<span class="source-line-no">107</span><span id="line-107">      default:</span>
-<span class="source-line-no">108</span><span id="line-108">        break;</span>
-<span class="source-line-no">109</span><span id="line-109">    }</span>
-<span class="source-line-no">110</span><span id="line-110">  }</span>
-<span class="source-line-no">111</span><span id="line-111"></span>
-<span class="source-line-no">112</span><span id="line-112">  @Override</span>
-<span class="source-line-no">113</span><span id="line-113">  protected NettyRpcClient createRpcClientNoCodec(Configuration conf) {</span>
-<span class="source-line-no">114</span><span id="line-114">    setConf(conf);</span>
-<span class="source-line-no">115</span><span id="line-115">    return new NettyRpcClient(conf) {</span>
-<span class="source-line-no">116</span><span id="line-116"></span>
-<span class="source-line-no">117</span><span id="line-117">      @Override</span>
-<span class="source-line-no">118</span><span id="line-118">      protected Codec getCodec() {</span>
-<span class="source-line-no">119</span><span id="line-119">        return null;</span>
-<span class="source-line-no">120</span><span id="line-120">      }</span>
+<span class="source-line-no">104</span><span id="line-104">      default:</span>
+<span class="source-line-no">105</span><span id="line-105">        break;</span>
+<span class="source-line-no">106</span><span id="line-106">    }</span>
+<span class="source-line-no">107</span><span id="line-107">  }</span>
+<span class="source-line-no">108</span><span id="line-108"></span>
+<span class="source-line-no">109</span><span id="line-109">  @Override</span>
+<span class="source-line-no">110</span><span id="line-110">  protected NettyRpcClient createRpcClientNoCodec(Configuration conf) {</span>
+<span class="source-line-no">111</span><span id="line-111">    setConf(conf);</span>
+<span class="source-line-no">112</span><span id="line-112">    return new NettyRpcClient(conf) {</span>
+<span class="source-line-no">113</span><span id="line-113"></span>
+<span class="source-line-no">114</span><span id="line-114">      @Override</span>
+<span class="source-line-no">115</span><span id="line-115">      protected Codec getCodec() {</span>
+<span class="source-line-no">116</span><span id="line-116">        return null;</span>
+<span class="source-line-no">117</span><span id="line-117">      }</span>
+<span class="source-line-no">118</span><span id="line-118"></span>
+<span class="source-line-no">119</span><span id="line-119">    };</span>
+<span class="source-line-no">120</span><span id="line-120">  }</span>
 <span class="source-line-no">121</span><span id="line-121"></span>
-<span class="source-line-no">122</span><span id="line-122">    };</span>
-<span class="source-line-no">123</span><span id="line-123">  }</span>
-<span class="source-line-no">124</span><span id="line-124"></span>
-<span class="source-line-no">125</span><span id="line-125">  @Override</span>
-<span class="source-line-no">126</span><span id="line-126">  protected NettyRpcClient createRpcClient(Configuration conf) {</span>
-<span class="source-line-no">127</span><span id="line-127">    setConf(conf);</span>
-<span class="source-line-no">128</span><span id="line-128">    return new NettyRpcClient(conf);</span>
-<span class="source-line-no">129</span><span id="line-129">  }</span>
-<span class="source-line-no">130</span><span id="line-130"></span>
-<span class="source-line-no">131</span><span id="line-131">  @Override</span>
-<span class="source-line-no">132</span><span id="line-132">  protected NettyRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf) {</span>
-<span class="source-line-no">133</span><span id="line-133">    setConf(conf);</span>
-<span class="source-line-no">134</span><span id="line-134">    return new NettyRpcClient(conf) {</span>
-<span class="source-line-no">135</span><span id="line-135"></span>
-<span class="source-line-no">136</span><span id="line-136">      @Override</span>
-<span class="source-line-no">137</span><span id="line-137">      protected boolean isTcpNoDelay() {</span>
-<span class="source-line-no">138</span><span id="line-138">        throw new RuntimeException("Injected fault");</span>
-<span class="source-line-no">139</span><span id="line-139">      }</span>
-<span class="source-line-no">140</span><span id="line-140">    };</span>
-<span class="source-line-no">141</span><span id="line-141">  }</span>
-<span class="source-line-no">142</span><span id="line-142"></span>
-<span class="source-line-no">143</span><span id="line-143">  @Override</span>
-<span class="source-line-no">144</span><span id="line-144">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
-<span class="source-line-no">145</span><span id="line-145">    return new NettyRpcClient(conf) {</span>
-<span class="source-line-no">146</span><span id="line-146"></span>
-<span class="source-line-no">147</span><span id="line-147">      @Override</span>
-<span class="source-line-no">148</span><span id="line-148">      protected NettyRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
-<span class="source-line-no">149</span><span id="line-149">        return new BadAuthNettyRpcConnection(this, remoteId);</span>
-<span class="source-line-no">150</span><span id="line-150">      }</span>
-<span class="source-line-no">151</span><span id="line-151">    };</span>
-<span class="source-line-no">152</span><span id="line-152">  }</span>
-<span class="source-line-no">153</span><span id="line-153">}</span>
+<span class="source-line-no">122</span><span id="line-122">  @Override</span>
+<span class="source-line-no">123</span><span id="line-123">  protected NettyRpcClient createRpcClient(Configuration conf) {</span>
+<span class="source-line-no">124</span><span id="line-124">    setConf(conf);</span>
+<span class="source-line-no">125</span><span id="line-125">    return new NettyRpcClient(conf);</span>
+<span class="source-line-no">126</span><span id="line-126">  }</span>
+<span class="source-line-no">127</span><span id="line-127"></span>
+<span class="source-line-no">128</span><span id="line-128">  @Override</span>
+<span class="source-line-no">129</span><span id="line-129">  protected NettyRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf) {</span>
+<span class="source-line-no">130</span><span id="line-130">    setConf(conf);</span>
+<span class="source-line-no">131</span><span id="line-131">    return new NettyRpcClient(conf) {</span>
+<span class="source-line-no">132</span><span id="line-132"></span>
+<span class="source-line-no">133</span><span id="line-133">      @Override</span>
+<span class="source-line-no">134</span><span id="line-134">      protected boolean isTcpNoDelay() {</span>
+<span class="source-line-no">135</span><span id="line-135">        throw new RuntimeException("Injected fault");</span>
+<span class="source-line-no">136</span><span id="line-136">      }</span>
+<span class="source-line-no">137</span><span id="line-137">    };</span>
+<span class="source-line-no">138</span><span id="line-138">  }</span>
+<span class="source-line-no">139</span><span id="line-139"></span>
+<span class="source-line-no">140</span><span id="line-140">  @Override</span>
+<span class="source-line-no">141</span><span id="line-141">  protected AbstractRpcClient&lt;?&gt; createBadAuthRpcClient(Configuration conf) {</span>
+<span class="source-line-no">142</span><span id="line-142">    return new NettyRpcClient(conf) {</span>
+<span class="source-line-no">143</span><span id="line-143"></span>
+<span class="source-line-no">144</span><span id="line-144">      @Override</span>
+<span class="source-line-no">145</span><span id="line-145">      protected NettyRpcConnection createConnection(ConnectionId remoteId) throws IOException {</span>
+<span class="source-line-no">146</span><span id="line-146">        return new BadAuthNettyRpcConnection(this, remoteId);</span>
+<span class="source-line-no">147</span><span id="line-147">      }</span>
+<span class="source-line-no">148</span><span id="line-148">    };</span>
+<span class="source-line-no">149</span><span id="line-149">  }</span>
+<span class="source-line-no">150</span><span id="line-150">}</span>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
index 037a0246857..3c6f7a1a981 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/TestNettyTlsIPC.html
@@ -39,89 +39,89 @@
 <span class="source-line-no">026</span><span id="line-26">import java.security.Security;</span>
 <span class="source-line-no">027</span><span id="line-27">import java.util.ArrayList;</span>
 <span class="source-line-no">028</span><span id="line-28">import java.util.List;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.apache.commons.io.FileUtils;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.conf.Configuration;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.HBaseClassTestRule;</span>
+<span class="source-line-no">029</span><span id="line-29">import java.util.stream.Stream;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.apache.commons.io.FileUtils;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.conf.Configuration;</span>
 <span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.HBaseCommonTestingUtil;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.HBaseServerBase;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.Server;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.client.ConnectionRegistryEndpoint;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.codec.Codec;</span>
-<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.io.crypto.tls.KeyStoreFileType;</span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.io.crypto.tls.X509KeyType;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContext;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContextProvider;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.io.crypto.tls.X509Util;</span>
-<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
-<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
-<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig;</span>
-<span class="source-line-no">046</span><span id="line-46">import org.bouncycastle.jce.provider.BouncyCastleProvider;</span>
-<span class="source-line-no">047</span><span id="line-47">import org.junit.After;</span>
-<span class="source-line-no">048</span><span id="line-48">import org.junit.AfterClass;</span>
-<span class="source-line-no">049</span><span id="line-49">import org.junit.Before;</span>
-<span class="source-line-no">050</span><span id="line-50">import org.junit.BeforeClass;</span>
-<span class="source-line-no">051</span><span id="line-51">import org.junit.ClassRule;</span>
-<span class="source-line-no">052</span><span id="line-52">import org.junit.experimental.categories.Category;</span>
-<span class="source-line-no">053</span><span id="line-53">import org.junit.runner.RunWith;</span>
-<span class="source-line-no">054</span><span id="line-54">import org.junit.runners.Parameterized;</span>
-<span class="source-line-no">055</span><span id="line-55"></span>
-<span class="source-line-no">056</span><span id="line-56">@RunWith(Parameterized.class)</span>
-<span class="source-line-no">057</span><span id="line-57">@Category({ RPCTests.class, MediumTests.class })</span>
-<span class="source-line-no">058</span><span id="line-58">public class TestNettyTlsIPC extends AbstractTestIPC {</span>
-<span class="source-line-no">059</span><span id="line-59"></span>
-<span class="source-line-no">060</span><span id="line-60">  @ClassRule</span>
-<span class="source-line-no">061</span><span id="line-61">  public static final HBaseClassTestRule CLASS_RULE =</span>
-<span class="source-line-no">062</span><span id="line-62">    HBaseClassTestRule.forClass(TestNettyTlsIPC.class);</span>
-<span class="source-line-no">063</span><span id="line-63"></span>
-<span class="source-line-no">064</span><span id="line-64">  private static final HBaseCommonTestingUtil UTIL = new HBaseCommonTestingUtil(CONF);</span>
-<span class="source-line-no">065</span><span id="line-65"></span>
-<span class="source-line-no">066</span><span id="line-66">  private static X509TestContextProvider PROVIDER;</span>
-<span class="source-line-no">067</span><span id="line-67"></span>
-<span class="source-line-no">068</span><span id="line-68">  private static NettyEventLoopGroupConfig EVENT_LOOP_GROUP_CONFIG;</span>
-<span class="source-line-no">069</span><span id="line-69"></span>
-<span class="source-line-no">070</span><span id="line-70">  @Parameterized.Parameter(1)</span>
-<span class="source-line-no">071</span><span id="line-71">  public X509KeyType caKeyType;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;</span>
+<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.HBaseServerBase;</span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.Server;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.client.ConnectionRegistryEndpoint;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.codec.Codec;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.io.crypto.tls.KeyStoreFileType;</span>
+<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.io.crypto.tls.X509KeyType;</span>
+<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContext;</span>
+<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.io.crypto.tls.X509TestContextProvider;</span>
+<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.io.crypto.tls.X509Util;</span>
+<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.ipc.RpcServer.BlockingServiceAndInterface;</span>
+<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.testclassification.RPCTests;</span>
+<span class="source-line-no">046</span><span id="line-46">import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig;</span>
+<span class="source-line-no">047</span><span id="line-47">import org.bouncycastle.jce.provider.BouncyCastleProvider;</span>
+<span class="source-line-no">048</span><span id="line-48">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">049</span><span id="line-49">import org.junit.jupiter.api.AfterEach;</span>
+<span class="source-line-no">050</span><span id="line-50">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">051</span><span id="line-51">import org.junit.jupiter.api.BeforeEach;</span>
+<span class="source-line-no">052</span><span id="line-52">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">053</span><span id="line-53">import org.junit.jupiter.params.provider.Arguments;</span>
+<span class="source-line-no">054</span><span id="line-54"></span>
+<span class="source-line-no">055</span><span id="line-55">@Tag(RPCTests.TAG)</span>
+<span class="source-line-no">056</span><span id="line-56">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">057</span><span id="line-57">@HBaseParameterizedTestTemplate(name = "{index}: rpcServerImpl={0}, caKeyType={1},"</span>
+<span class="source-line-no">058</span><span id="line-58">  + " certKeyType={2}, keyPassword={3}, acceptPlainText={4}, clientTlsEnabled={5}")</span>
+<span class="source-line-no">059</span><span id="line-59">public class TestNettyTlsIPC extends AbstractTestIPC {</span>
+<span class="source-line-no">060</span><span id="line-60"></span>
+<span class="source-line-no">061</span><span id="line-61">  private static final HBaseCommonTestingUtil UTIL = new HBaseCommonTestingUtil(CONF);</span>
+<span class="source-line-no">062</span><span id="line-62"></span>
+<span class="source-line-no">063</span><span id="line-63">  private static X509TestContextProvider PROVIDER;</span>
+<span class="source-line-no">064</span><span id="line-64"></span>
+<span class="source-line-no">065</span><span id="line-65">  private static NettyEventLoopGroupConfig EVENT_LOOP_GROUP_CONFIG;</span>
+<span class="source-line-no">066</span><span id="line-66"></span>
+<span class="source-line-no">067</span><span id="line-67">  private X509KeyType caKeyType;</span>
+<span class="source-line-no">068</span><span id="line-68"></span>
+<span class="source-line-no">069</span><span id="line-69">  private X509KeyType certKeyType;</span>
+<span class="source-line-no">070</span><span id="line-70"></span>
+<span class="source-line-no">071</span><span id="line-71">  private char[] keyPassword;</span>
 <span class="source-line-no">072</span><span id="line-72"></span>
-<span class="source-line-no">073</span><span id="line-73">  @Parameterized.Parameter(2)</span>
-<span class="source-line-no">074</span><span id="line-74">  public X509KeyType certKeyType;</span>
-<span class="source-line-no">075</span><span id="line-75"></span>
-<span class="source-line-no">076</span><span id="line-76">  @Parameterized.Parameter(3)</span>
-<span class="source-line-no">077</span><span id="line-77">  public char[] keyPassword;</span>
-<span class="source-line-no">078</span><span id="line-78"></span>
-<span class="source-line-no">079</span><span id="line-79">  @Parameterized.Parameter(4)</span>
-<span class="source-line-no">080</span><span id="line-80">  public boolean acceptPlainText;</span>
-<span class="source-line-no">081</span><span id="line-81"></span>
-<span class="source-line-no">082</span><span id="line-82">  @Parameterized.Parameter(5)</span>
-<span class="source-line-no">083</span><span id="line-83">  public boolean clientTlsEnabled;</span>
-<span class="source-line-no">084</span><span id="line-84"></span>
-<span class="source-line-no">085</span><span id="line-85">  private X509TestContext x509TestContext;</span>
-<span class="source-line-no">086</span><span id="line-86"></span>
-<span class="source-line-no">087</span><span id="line-87">  // only netty rpc server supports TLS, so here we will only test NettyRpcServer</span>
-<span class="source-line-no">088</span><span id="line-88">  @Parameterized.Parameters(</span>
-<span class="source-line-no">089</span><span id="line-89">      name = "{index}: rpcServerImpl={0}, caKeyType={1}, certKeyType={2}, keyPassword={3},"</span>
-<span class="source-line-no">090</span><span id="line-90">        + " acceptPlainText={4}, clientTlsEnabled={5}")</span>
-<span class="source-line-no">091</span><span id="line-91">  public static List&lt;Object[]&gt; data() {</span>
-<span class="source-line-no">092</span><span id="line-92">    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">073</span><span id="line-73">  private boolean acceptPlainText;</span>
+<span class="source-line-no">074</span><span id="line-74"></span>
+<span class="source-line-no">075</span><span id="line-75">  private boolean clientTlsEnabled;</span>
+<span class="source-line-no">076</span><span id="line-76"></span>
+<span class="source-line-no">077</span><span id="line-77">  public TestNettyTlsIPC(Class&lt;? extends RpcServer&gt; rpcServerImpl, X509KeyType caKeyType,</span>
+<span class="source-line-no">078</span><span id="line-78">    X509KeyType certKeyType, char[] keyPassword, boolean acceptPlainText,</span>
+<span class="source-line-no">079</span><span id="line-79">    boolean clientTlsEnabled) {</span>
+<span class="source-line-no">080</span><span id="line-80">    super(rpcServerImpl);</span>
+<span class="source-line-no">081</span><span id="line-81">    this.caKeyType = caKeyType;</span>
+<span class="source-line-no">082</span><span id="line-82">    this.certKeyType = certKeyType;</span>
+<span class="source-line-no">083</span><span id="line-83">    this.keyPassword = keyPassword;</span>
+<span class="source-line-no">084</span><span id="line-84">    this.acceptPlainText = acceptPlainText;</span>
+<span class="source-line-no">085</span><span id="line-85">    this.clientTlsEnabled = clientTlsEnabled;</span>
+<span class="source-line-no">086</span><span id="line-86">  }</span>
+<span class="source-line-no">087</span><span id="line-87"></span>
+<span class="source-line-no">088</span><span id="line-88">  private X509TestContext x509TestContext;</span>
+<span class="source-line-no">089</span><span id="line-89"></span>
+<span class="source-line-no">090</span><span id="line-90">  // only netty rpc server supports TLS, so here we will only test NettyRpcServer</span>
+<span class="source-line-no">091</span><span id="line-91">  public static Stream&lt;Arguments&gt; parameters() {</span>
+<span class="source-line-no">092</span><span id="line-92">    List&lt;Arguments&gt; params = new ArrayList&lt;&gt;();</span>
 <span class="source-line-no">093</span><span id="line-93">    for (X509KeyType caKeyType : X509KeyType.values()) {</span>
 <span class="source-line-no">094</span><span id="line-94">      for (X509KeyType certKeyType : X509KeyType.values()) {</span>
 <span class="source-line-no">095</span><span id="line-95">        for (char[] keyPassword : new char[][] { "".toCharArray(), "pa$$w0rd".toCharArray() }) {</span>
 <span class="source-line-no">096</span><span id="line-96">          // do not accept plain text</span>
-<span class="source-line-no">097</span><span id="line-97">          params.add(new Object[] { NettyRpcServer.class, caKeyType, certKeyType, keyPassword,</span>
-<span class="source-line-no">098</span><span id="line-98">            false, true });</span>
+<span class="source-line-no">097</span><span id="line-97">          params.add(</span>
+<span class="source-line-no">098</span><span id="line-98">            Arguments.of(NettyRpcServer.class, caKeyType, certKeyType, keyPassword, false, true));</span>
 <span class="source-line-no">099</span><span id="line-99">          // support plain text and client enables tls</span>
 <span class="source-line-no">100</span><span id="line-100">          params.add(</span>
-<span class="source-line-no">101</span><span id="line-101">            new Object[] { NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true, true });</span>
+<span class="source-line-no">101</span><span id="line-101">            Arguments.of(NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true, true));</span>
 <span class="source-line-no">102</span><span id="line-102">          // support plain text and client disables tls</span>
-<span class="source-line-no">103</span><span id="line-103">          params.add(new Object[] { NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true,</span>
-<span class="source-line-no">104</span><span id="line-104">            false });</span>
+<span class="source-line-no">103</span><span id="line-103">          params.add(</span>
+<span class="source-line-no">104</span><span id="line-104">            Arguments.of(NettyRpcServer.class, caKeyType, certKeyType, keyPassword, true, false));</span>
 <span class="source-line-no">105</span><span id="line-105">        }</span>
 <span class="source-line-no">106</span><span id="line-106">      }</span>
 <span class="source-line-no">107</span><span id="line-107">    }</span>
-<span class="source-line-no">108</span><span id="line-108">    return params;</span>
+<span class="source-line-no">108</span><span id="line-108">    return params.stream();</span>
 <span class="source-line-no">109</span><span id="line-109">  }</span>
 <span class="source-line-no">110</span><span id="line-110"></span>
-<span class="source-line-no">111</span><span id="line-111">  @BeforeClass</span>
+<span class="source-line-no">111</span><span id="line-111">  @BeforeAll</span>
 <span class="source-line-no">112</span><span id="line-112">  public static void setUpBeforeClass() throws IOException {</span>
 <span class="source-line-no">113</span><span id="line-113">    Security.addProvider(new BouncyCastleProvider());</span>
 <span class="source-line-no">114</span><span id="line-114">    File dir = new File(UTIL.getDataTestDir(TestNettyTlsIPC.class.getSimpleName()).toString())</span>
@@ -134,14 +134,14 @@
 <span class="source-line-no">121</span><span id="line-121">      NettyEventLoopGroupConfig.setup(CONF, TestNettyTlsIPC.class.getSimpleName());</span>
 <span class="source-line-no">122</span><span id="line-122">  }</span>
 <span class="source-line-no">123</span><span id="line-123"></span>
-<span class="source-line-no">124</span><span id="line-124">  @AfterClass</span>
+<span class="source-line-no">124</span><span id="line-124">  @AfterAll</span>
 <span class="source-line-no">125</span><span id="line-125">  public static void tearDownAfterClass() throws InterruptedException {</span>
 <span class="source-line-no">126</span><span id="line-126">    Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);</span>
 <span class="source-line-no">127</span><span id="line-127">    EVENT_LOOP_GROUP_CONFIG.group().shutdownGracefully().sync();</span>
 <span class="source-line-no">128</span><span id="line-128">    UTIL.cleanupTestDir();</span>
 <span class="source-line-no">129</span><span id="line-129">  }</span>
 <span class="source-line-no">130</span><span id="line-130"></span>
-<span class="source-line-no">131</span><span id="line-131">  @Before</span>
+<span class="source-line-no">131</span><span id="line-131">  @BeforeEach</span>
 <span class="source-line-no">132</span><span id="line-132">  public void setUp() throws IOException {</span>
 <span class="source-line-no">133</span><span id="line-133">    x509TestContext = PROVIDER.get(caKeyType, certKeyType, keyPassword);</span>
 <span class="source-line-no">134</span><span id="line-134">    x509TestContext.setConfigurations(KeyStoreFileType.JKS, KeyStoreFileType.JKS);</span>
@@ -149,7 +149,7 @@
 <span class="source-line-no">136</span><span id="line-136">    CONF.setBoolean(X509Util.HBASE_CLIENT_NETTY_TLS_ENABLED, clientTlsEnabled);</span>
 <span class="source-line-no">137</span><span id="line-137">  }</span>
 <span class="source-line-no">138</span><span id="line-138"></span>
-<span class="source-line-no">139</span><span id="line-139">  @After</span>
+<span class="source-line-no">139</span><span id="line-139">  @AfterEach</span>
 <span class="source-line-no">140</span><span id="line-140">  public void tearDown() {</span>
 <span class="source-line-no">141</span><span id="line-141">    x509TestContext.clearConfigurations();</span>
 <span class="source-line-no">142</span><span id="line-142">    x509TestContext.getConf().unset(X509Util.TLS_CONFIG_OCSP);</span>