diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 06e75b4..923523f 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -146,6 +146,7 @@ import org.apache.hadoop.metrics.util.MBeanUtil; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.StringUtils; import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.KeeperException.NoNodeException; import org.apache.zookeeper.data.Stat; import com.google.common.annotations.VisibleForTesting; @@ -2850,31 +2851,38 @@ public class HRegionServer extends HasThread implements minSeqIdForLogReplay = storeSeqIdForReplay; } } - long lastRecordedFlushedSequenceId = -1; - String nodePath = ZKUtil.joinZNode(this.zooKeeper.recoveringRegionsZNode, - region.getEncodedName()); - // recovering-region level - byte[] data; + try { - data = ZKUtil.getData(zkw, nodePath); - } catch (InterruptedException e) { - throw new InterruptedIOException(); - } - if (data != null) { - lastRecordedFlushedSequenceId = SplitLogManager.parseLastFlushedSequenceIdFrom(data); - } - if (data == null || lastRecordedFlushedSequenceId < minSeqIdForLogReplay) { - ZKUtil.setData(zkw, nodePath, ZKUtil.positionToByteArray(minSeqIdForLogReplay)); - } - if (previousRSName != null) { - // one level deeper for the failed RS - nodePath = ZKUtil.joinZNode(nodePath, previousRSName); - ZKUtil.setData(zkw, nodePath, - ZKUtil.regionSequenceIdsToByteArray(minSeqIdForLogReplay, maxSeqIdInStores)); - LOG.debug("Update last flushed sequence id of region " + region.getEncodedName() + " for " - + previousRSName); - } else { - LOG.warn("Can't find failed region server for recovering region " + region.getEncodedName()); + long lastRecordedFlushedSequenceId = -1; + String nodePath = ZKUtil.joinZNode(this.zooKeeper.recoveringRegionsZNode, + region.getEncodedName()); + // recovering-region level + byte[] data; + try { + data = ZKUtil.getData(zkw, nodePath); + } catch (InterruptedException e) { + throw new InterruptedIOException(); + } + if (data != null) { + lastRecordedFlushedSequenceId = SplitLogManager.parseLastFlushedSequenceIdFrom(data); + } + if (data == null || lastRecordedFlushedSequenceId < minSeqIdForLogReplay) { + ZKUtil.setData(zkw, nodePath, ZKUtil.positionToByteArray(minSeqIdForLogReplay)); + } + if (previousRSName != null) { + // one level deeper for the failed RS + nodePath = ZKUtil.joinZNode(nodePath, previousRSName); + ZKUtil.setData(zkw, nodePath, + ZKUtil.regionSequenceIdsToByteArray(minSeqIdForLogReplay, maxSeqIdInStores)); + LOG.debug("Update last flushed sequence id of region " + region.getEncodedName() + " for " + + previousRSName); + } else { + LOG.warn("Can't find failed region server for recovering region " + + region.getEncodedName()); + } + } catch (NoNodeException ignore) { + LOG.debug("Region " + region.getEncodedName() + + " must have completed recovery because its recovery znode has been removed", ignore); } }