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

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


The following commit(s) were added to refs/heads/branch-2.6 by this push:
     new 645fc1d7905 HBASE-30099 Avoid NPE when GetBootstrapNodes RPC arrives 
during startup (#8483)
645fc1d7905 is described below

commit 645fc1d7905905cef949cbaa6af3d4da695659ab
Author: Ma Zhengxuan <[email protected]>
AuthorDate: Thu Aug 27 21:19:38 2026 +0800

    HBASE-30099 Avoid NPE when GetBootstrapNodes RPC arrives during startup 
(#8483)
    
    Co-authored-by: mazhengxuan <[email protected]>
    Signed-off-by: Peter Somogyi <[email protected]>
    (cherry picked from commit df76c46e8ed7c2f81948b254a68ae98ebe064ed3)
---
 .../java/org/apache/hadoop/hbase/regionserver/HRegionServer.java  | 5 +++--
 .../hadoop/hbase/regionserver/TestBootstrapNodeManager.java       | 8 ++++++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
index d59b1b222fd..8539396dadd 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
@@ -593,7 +593,7 @@ public class HRegionServer extends Thread
    */
   private NamedQueueRecorder namedQueueRecorder = null;
 
-  private BootstrapNodeManager bootstrapNodeManager;
+  private volatile BootstrapNodeManager bootstrapNodeManager;
 
   /**
    * True if this RegionServer is coming up in a cluster where there is no 
Master; means it needs to
@@ -4239,7 +4239,8 @@ public class HRegionServer extends Thread
   }
 
   public Iterator<ServerName> getBootstrapNodes() {
-    return bootstrapNodeManager.getBootstrapNodes().iterator();
+    BootstrapNodeManager manager = bootstrapNodeManager;
+    return manager != null ? manager.getBootstrapNodes().iterator() : 
Collections.emptyIterator();
   }
 
   public MetaRegionLocationCache getMetaRegionLocationCache() {
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBootstrapNodeManager.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBootstrapNodeManager.java
index 657d99ae32a..ec9f0bca9f7 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBootstrapNodeManager.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBootstrapNodeManager.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.regionserver;
 import static org.hamcrest.CoreMatchers.hasItems;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.atLeast;
@@ -84,6 +85,13 @@ public class TestBootstrapNodeManager {
     assertThat(actual, hasItems(expected.toArray(new ServerName[0])));
   }
 
+  @Test
+  public void testGetBootstrapNodesBeforeInitialization() {
+    HRegionServer regionServer = mock(HRegionServer.class);
+    when(regionServer.getBootstrapNodes()).thenCallRealMethod();
+    assertFalse(regionServer.getBootstrapNodes().hasNext());
+  }
+
   @Test
   public void testNormal() throws Exception {
     List<ServerName> regionServers =

Reply via email to