This is an automated email from the ASF dual-hosted git repository.
Apache9 pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.5 by this push:
new 9d345974037 HBASE-24923 Fixing missed InitMetaProcedures if Hmaster
startup happens after meta assign (#8428)
9d345974037 is described below
commit 9d345974037013bbf6248c0e5c0161eaa10827df
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]>
(cherry picked from commit e1af5a8783a80f364aa0fff6165c1425e044d520)
---
.../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 5231b580484..88e07976646 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
@@ -1038,16 +1038,24 @@ public class HMaster extends HRegionServer implements
MasterServices {
// 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);
}
if (this.balancer instanceof FavoredNodesPromoter) {
favoredNodesManager = new FavoredNodesManager(this);