diff --git a/CHANGES.txt b/CHANGES.txt index bf07983d12f..aa2f3645912 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -7,6 +7,8 @@ Release 0.3.0 - Unreleased HBASE-805 Remove unnecessary getRow overloads in HRS (Jonathan Gray via Jim Kellerman) (Fix whitespace diffs in HRegionServer) HBASE-811 HTD is not fully copyable (Andrew Purtell via Jim Kellerman) + HBASE-729 Client region/metadata cache should have a public method for + invalidating entries (Andrew Purtell via Stack) IMPROVEMENTS HBASE-801 When a table haven't disable, shell could response in a "user diff --git a/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java b/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java index 4f38bd93d0a..913dfa45b68 100644 --- a/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java +++ b/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java @@ -371,61 +371,42 @@ public class HConnectionManager implements HConstants { return rowsScanned > 0 && result; } + private class HTableDescriptorFinder + implements MetaScanner.MetaScannerVisitor { + byte[] tableName; + HTableDescriptor result; + public HTableDescriptorFinder(byte[] tableName) { + this.tableName = tableName; + } + public boolean processRow(RowResult rowResult) throws IOException { + HRegionInfo info = Writables.getHRegionInfo( + rowResult.get(HConstants.COL_REGIONINFO)); + HTableDescriptor desc = info.getTableDesc(); + if (Bytes.compareTo(desc.getName(), tableName) == 0) { + result = desc; + return false; + } + return true; + } + HTableDescriptor getResult() { + return result; + } + } + /** {@inheritDoc} */ - public HTableDescriptor getHTableDescriptor(byte[] tableName) + public HTableDescriptor getHTableDescriptor(final byte[] tableName) throws IOException { if (Bytes.equals(tableName, HConstants.ROOT_TABLE_NAME)) { return new UnmodifyableHTableDescriptor(HTableDescriptor.ROOT_TABLEDESC); } - if (!tableExists(tableName)) { - throw new TableNotFoundException(Bytes.toString(tableName)); + if (Bytes.equals(tableName, HConstants.META_TABLE_NAME)) { + return new UnmodifyableHTableDescriptor(HTableDescriptor.META_TABLEDESC); } - byte[] startKey = - HRegionInfo.createRegionName(tableName, null, HConstants.ZEROES); - - HTableDescriptor result = null; - HRegionInfo currentRegion = null; - ScannerCallable s = null; - while (result == null) { - if (currentRegion != null) { - byte[] endKey = currentRegion.getEndKey(); - if (endKey == null || - Bytes.equals(endKey, HConstants.EMPTY_BYTE_ARRAY)) { - // We have reached the end of the table and we're done - break; - } - } - HRegionInfo oldRegion = currentRegion; - if (oldRegion != null) { - startKey = oldRegion.getEndKey(); - } - s = new ScannerCallable(this, - (Bytes.equals(tableName, HConstants.META_TABLE_NAME) ? - HConstants.ROOT_TABLE_NAME : HConstants.META_TABLE_NAME), - HConstants.COL_REGIONINFO_ARRAY, startKey, - HConstants.LATEST_TIMESTAMP, null - ); - // Open scanner - getRegionServerWithRetries(s); - currentRegion = s.getHRegionInfo(); - try { - RowResult r = null; - while ((r = getRegionServerWithRetries(s)) != null) { - Cell c = r.get(HConstants.COL_REGIONINFO); - if (c != null) { - HRegionInfo info = Writables.getHRegionInfoOrNull(c.getValue()); - if (info != null) { - if (Bytes.equals(info.getTableDesc().getName(), tableName)) { - result = new UnmodifyableHTableDescriptor(info.getTableDesc()); - break; - } - } - } - } - } finally { - s.setClose(); - getRegionServerWithRetries(s); - } + HTableDescriptorFinder finder = new HTableDescriptorFinder(tableName); + MetaScanner.metaScan(conf, finder); + HTableDescriptor result = finder.getResult(); + if (result == null) { + throw new TableNotFoundException(Bytes.toString(tableName)); } return result; } diff --git a/src/test/org/apache/hadoop/hbase/client/TestHTable.java b/src/test/org/apache/hadoop/hbase/client/TestHTable.java index f1d4e31b9db..a1340990d73 100644 --- a/src/test/org/apache/hadoop/hbase/client/TestHTable.java +++ b/src/test/org/apache/hadoop/hbase/client/TestHTable.java @@ -150,36 +150,25 @@ public class TestHTable extends HBaseClusterTestCase implements HConstants { // enable the table admin.enableTable(tableAname); - // Use a metascanner to avoid client API caching (HConnection has a - // metadata cache) - MetaScanner.MetaScannerVisitor visitor = - new MetaScanner.MetaScannerVisitor() { - public boolean processRow(RowResult rowResult) throws IOException { - HRegionInfo info = Writables.getHRegionInfo( - rowResult.get(HConstants.COL_REGIONINFO)); + // test that attribute changes were applied + desc = a.getTableDescriptor(); + if (Bytes.compareTo(desc.getName(), tableAname) != 0) + fail("wrong table descriptor returned"); + // check HTD attribute + value = desc.getValue(attrName); + if (value == null) + fail("missing HTD attribute value"); + if (Bytes.compareTo(value, attrValue) != 0) + fail("HTD attribute value is incorrect"); + // check HCD attribute + for (HColumnDescriptor c: desc.getFamilies()) { + value = c.getValue(attrName); + if (value == null) + fail("missing HCD attribute value"); + if (Bytes.compareTo(value, attrValue) != 0) + fail("HCD attribute value is incorrect"); + } - LOG.info("visiting " + info.toString()); - HTableDescriptor desc = info.getTableDesc(); - if (Bytes.compareTo(desc.getName(), tableAname) == 0) { - // check HTD attribute - byte[] value = desc.getValue(attrName); - if (value == null) - fail("missing HTD attribute value"); - if (Bytes.compareTo(value, attrValue) != 0) - fail("HTD attribute value is incorrect"); - // check HCD attribute - for (HColumnDescriptor c: desc.getFamilies()) { - value = c.getValue(attrName); - if (value == null) - fail("missing HCD attribute value"); - if (Bytes.compareTo(value, attrValue) != 0) - fail("HCD attribute value is incorrect"); - } - } - return true; - } - }; - MetaScanner.metaScan(conf, visitor); } catch (Exception e) { e.printStackTrace(); fail();