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

Apache9 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new e1af5a8783a HBASE-24923 Fixing missed InitMetaProcedures if Hmaster 
startup happens after meta assign (#8428)
e1af5a8783a is described below

commit e1af5a8783a80f364aa0fff6165c1425e044d520
Author: Swara <[email protected]>
AuthorDate: Mon Jun 29 13:07:34 2026 +0530

    HBASE-24923 Fixing missed InitMetaProcedures if Hmaster startup happens 
after meta assign (#8428)
    
    Signed-off-by: Duo Zhang <[email protected]>
---
 .../org/apache/hadoop/hbase/master/HMaster.java    | 28 ++++++++++++++--------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index f5aaa6e333e..0be89258435 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -1106,16 +1106,24 @@ public class HMaster extends 
HBaseServerBase<MasterRpcServices> implements Maste
     // Checking if meta needs initializing.
     startupTaskGroup.addTask("Initializing meta table if this is a new 
deploy");
     InitMetaProcedure initMetaProc = null;
-    // Print out state of hbase:meta on startup; helps debugging.
-    if 
(!this.assignmentManager.getRegionStates().hasTableRegionStates(TableName.META_TABLE_NAME))
 {
-      Optional<InitMetaProcedure> optProc = 
procedureExecutor.getProcedures().stream()
-        .filter(p -> p instanceof InitMetaProcedure).map(o -> 
(InitMetaProcedure) o).findAny();
-      initMetaProc = optProc.orElseGet(() -> {
-        // schedule an init meta procedure if meta has not been deployed yet
-        InitMetaProcedure temp = new InitMetaProcedure();
-        procedureExecutor.submitProcedure(temp);
-        return temp;
-      });
+
+    // Always look for an already-running InitMetaProcedure first. Once such a 
procedure has passed
+    // the INIT_META_ASSIGN_META state, a RegionState for meta exists, so 
guarding this lookup with
+    // hasTableRegionStates would hide a still-running procedure, and we would 
skip awaiting it.
+    // Filter out finished procedures: getProcedures() also returns completed 
procedures reloaded
+    // from the procedure store, and awaiting such a procedure would block 
forever because its
+    // completion latch is reset to 1 on deserialization and never counted 
down again.
+    Optional<InitMetaProcedure> optProc = 
procedureExecutor.getProcedures().stream()
+      .filter(p -> p instanceof InitMetaProcedure && !p.isFinished())
+      .map(o -> (InitMetaProcedure) o).findAny();
+    if (optProc.isPresent()) {
+      initMetaProc = optProc.get();
+    } else if (
+      
!this.assignmentManager.getRegionStates().hasTableRegionStates(TableName.META_TABLE_NAME)
+    ) {
+      // schedule an init meta procedure if meta has not been deployed yet
+      initMetaProc = new InitMetaProcedure();
+      procedureExecutor.submitProcedure(initMetaProc);
     }
 
     // initialize load balancer

Reply via email to