From a7e18a9bfd9ceeb1772597017b840d87a0da9274 Mon Sep 17 00:00:00 2001 From: jxiang Date: Fri, 17 Aug 2012 20:28:32 +0000 Subject: [PATCH] HBASE-6487 assign region doesn't check if the region is already assigned git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1374423 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/hadoop/hbase/master/HMaster.java | 7 ++++++- .../apache/hadoop/hbase/master/RegionStates.java | 13 ++++++++++++- hbase-server/src/main/ruby/shell/commands/assign.rb | 3 +-- 3 files changed, 19 insertions(+), 4 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 31df068e436..b49b5c20f33 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 @@ -2085,8 +2085,13 @@ Server { LOG.warn("assignRegion specifier type: expected: " + RegionSpecifierType.REGION_NAME + " actual: " + type); } - HRegionInfo regionInfo = assignmentManager.getRegionStates().getRegionInfo(regionName); + RegionStates regionStates = assignmentManager.getRegionStates(); + HRegionInfo regionInfo = regionStates.getRegionInfo(regionName); if (regionInfo == null) throw new UnknownRegionException(Bytes.toString(regionName)); + RegionState regionState = regionStates.getRegionState(regionInfo); + if (regionState != null && !regionState.isOffline()) { + throw new IOException("Region " + regionInfo + " is not offline"); + } if (cpHost != null) { if (cpHost.preAssign(regionInfo)) { return arr; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java index 7eff4129cd2..7f382fd552d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java @@ -132,6 +132,13 @@ public class RegionStates { return regionAssignments.containsKey(hri); } + /** + * @return the server the specified region assigned to; null if not assigned. + */ + public synchronized ServerName getAssignedServer(final HRegionInfo hri) { + return regionAssignments.get(hri); + } + /** * Wait for the state map to be updated by assignment manager. */ @@ -519,7 +526,11 @@ public class RegionStates { try { Pair p = MetaReader.getRegion(server.getCatalogTracker(), regionName); - return p == null ? null : p.getFirst(); + HRegionInfo hri = p == null ? null : p.getFirst(); + if (hri != null) { + createRegionState(hri); + } + return hri; } catch (IOException e) { server.abort("Aborting because error occoured while reading " + Bytes.toStringBinary(regionName) + " from .META.", e); diff --git a/hbase-server/src/main/ruby/shell/commands/assign.rb b/hbase-server/src/main/ruby/shell/commands/assign.rb index 4c83d3cf200..7dc470811b4 100644 --- a/hbase-server/src/main/ruby/shell/commands/assign.rb +++ b/hbase-server/src/main/ruby/shell/commands/assign.rb @@ -24,8 +24,7 @@ module Shell def help return <<-EOF Assign a region.Use with caution.If region already assigned, -this command will just go ahead and reassign -the region anyways. For experts only. +this command will throw an exception. For experts only. EOF end