From 485e88ecdba0c8e01bcf2f1ba4185621aecc2500 Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Fri, 3 Nov 2017 15:13:13 -0700 Subject: [PATCH] HBASE-19165 TODO Handle stuck in transition: rit=OPENING, location=ve0538.... --- .../hbase/master/assignment/AssignmentManager.java | 17 ++++++++++++++--- .../hbase/master/assignment/RegionStateStore.java | 15 ++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index 8bdf4d5dfd..9f374f1614 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -1183,17 +1183,28 @@ public class AssignmentManager implements ServerListener { public void visitRegionState(final RegionInfo regionInfo, final State state, final ServerName regionLocation, final ServerName lastHost, final long openSeqNum) { final RegionStateNode regionNode = regionStates.getOrCreateRegionNode(regionInfo); + State localState = state; + if (state == null) { + // No state in hbase:meta table. Are I doing a rolling upgrade from hbase1 to + // hbase2? If so, there is no state in hbase:meta. It is in zk or, if region has + // been successfully deployed, there is no state in zk; need to ask regionserver + // if it is serving. TODO. + // Presume for now that this is a clean start of an hbase2 over a hbase1 dataset. + // Set state to be OFFLINE. + localState = State.OFFLINE; + LOG.info("State was NULL for " + regionInfo.getEncodedName() + "; presuming OFFLINE!"); + } synchronized (regionNode) { if (!regionNode.isInTransition()) { - regionNode.setState(state); + regionNode.setState(localState); regionNode.setLastHost(lastHost); regionNode.setRegionLocation(regionLocation); regionNode.setOpenSeqNum(openSeqNum); - if (state == State.OPEN) { + if (localState == State.OPEN) { assert regionLocation != null : "found null region location for " + regionNode; regionStates.addRegionToServer(regionLocation, regionNode); - } else if (state == State.OFFLINE || regionInfo.isOffline()) { + } else if (localState == State.OFFLINE || regionInfo.isOffline()) { regionStates.addToOfflineRegions(regionNode); } else { // These regions should have a procedure in replay diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java index f9a1b438c8..85a0d60bc4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java @@ -90,10 +90,15 @@ public class RegionStateStore { @Override public boolean visit(final Result r) throws IOException { if (r != null && !r.isEmpty()) { - long st = System.currentTimeMillis(); + long st = 0; + if (LOG.isTraceEnabled()) { + st = System.currentTimeMillis(); + } visitMetaEntry(visitor, r); - long et = System.currentTimeMillis(); - LOG.info("[T] LOAD META PERF " + StringUtils.humanTimeDiff(et - st)); + if (LOG.isTraceEnabled()) { + long et = System.currentTimeMillis(); + LOG.trace("[T] LOAD META PERF " + StringUtils.humanTimeDiff(et - st)); + } } else if (isDebugEnabled) { LOG.debug("NULL result from meta - ignoring but this is strange."); } @@ -310,11 +315,11 @@ public class RegionStateStore { /** * Pull the region state from a catalog table {@link Result}. * @param r Result to pull the region state from - * @return the region state, or OPEN if there's no value written. + * @return the region state, or null if unknown. */ protected State getRegionState(final Result r, int replicaId) { Cell cell = r.getColumnLatestCell(HConstants.CATALOG_FAMILY, getStateColumn(replicaId)); - if (cell == null || cell.getValueLength() == 0) return State.OPENING; + if (cell == null || cell.getValueLength() == 0) return null; return State.valueOf(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength())); } -- 2.11.0 (Apple Git-81)