HBASE-12904 Threading issues in region_mover.rb

This commit is contained in:
Andrew Purtell 2015-01-22 13:11:31 -08:00
parent 418ea93774
commit e370baf8a5
1 changed files with 23 additions and 58 deletions

View File

@ -43,41 +43,6 @@ import org.apache.hadoop.hbase.HRegionInfo
# Name of this script
NAME = "region_mover"
# Get meta table reference
def getMetaTable(config)
# Keep meta reference in ruby global
if not $META
$META = HTable.new(config, HConstants::META_TABLE_NAME)
end
return $META
end
# Get table instance.
# Maintains cache of table instances.
def getTable(config, name)
# Keep dictionary of tables in ruby global
if not $TABLES
$TABLES = {}
end
key = name.toString()
if not $TABLES[key]
$TABLES[key] = HTable.new(config, name)
end
return $TABLES[key]
end
def closeTables()
if not $TABLES
return
end
$LOG.info("Close all tables")
$TABLES.each do |name, table|
$TABLES.delete(name)
table.close()
end
end
# Returns true if passed region is still on 'original' when we look at hbase:meta.
def isSameServer(admin, r, original)
server = getServerNameForRegion(admin, r)
@ -111,17 +76,20 @@ def getServerNameForRegion(admin, r)
zkw.close()
end
end
table = nil
table = getMetaTable(admin.getConfiguration())
g = Get.new(r.getRegionName())
g.addColumn(HConstants::CATALOG_FAMILY, HConstants::SERVER_QUALIFIER)
g.addColumn(HConstants::CATALOG_FAMILY, HConstants::STARTCODE_QUALIFIER)
result = table.get(g)
return nil unless result
server = result.getValue(HConstants::CATALOG_FAMILY, HConstants::SERVER_QUALIFIER)
startcode = result.getValue(HConstants::CATALOG_FAMILY, HConstants::STARTCODE_QUALIFIER)
return nil unless server
return java.lang.String.new(Bytes.toString(server)).replaceFirst(":", ",") + "," + Bytes.toLong(startcode).to_s
table = HTable.new(admin.getConfiguration(), HConstants::META_TABLE_NAME)
begin
g = Get.new(r.getRegionName())
g.addColumn(HConstants::CATALOG_FAMILY, HConstants::SERVER_QUALIFIER)
g.addColumn(HConstants::CATALOG_FAMILY, HConstants::STARTCODE_QUALIFIER)
result = table.get(g)
return nil unless result
server = result.getValue(HConstants::CATALOG_FAMILY, HConstants::SERVER_QUALIFIER)
startcode = result.getValue(HConstants::CATALOG_FAMILY, HConstants::STARTCODE_QUALIFIER)
return nil unless server
return java.lang.String.new(Bytes.toString(server)).replaceFirst(":", ",") + "," + Bytes.toLong(startcode).to_s
ensure
table.close()
end
end
# Trys to scan a row from passed region
@ -132,23 +100,22 @@ def isSuccessfulScan(admin, r)
scan.setCaching(1)
scan.setFilter(FirstKeyOnlyFilter.new())
begin
table = getTable(admin.getConfiguration(), r.getTableName())
table = HTable.new(admin.getConfiguration(), r.getTableName())
scanner = table.getScanner(scan)
begin
results = scanner.next()
# We might scan into next region, this might be an empty table.
# But if no exception, presume scanning is working.
ensure
scanner.close()
end
rescue org.apache.hadoop.hbase.TableNotFoundException,
org.apache.hadoop.hbase.TableNotEnabledException => e
$LOG.warn("Region " + r.getEncodedName() + " belongs to recently " +
"deleted/disabled table. Skipping... " + e.message)
return
end
begin
results = scanner.next()
# We might scan into next region, this might be an empty table.
# But if no exception, presume scanning is working.
ensure
scanner.close()
# Do not close the htable. It is cached in $TABLES and
# may be reused in moving another region of same table.
# table.close()
table.close() unless table.nil?
end
end
@ -517,5 +484,3 @@ case ARGV[0]
puts optparse
exit 3
end
closeTables()