Index: src/test/org/apache/hadoop/hbase/client/TestHTable.java =================================================================== --- src/test/org/apache/hadoop/hbase/client/TestHTable.java (revision 684399) +++ src/test/org/apache/hadoop/hbase/client/TestHTable.java (working copy) @@ -150,36 +150,25 @@ // 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(); Index: src/java/org/apache/hadoop/hbase/client/HConnectionManager.java =================================================================== --- src/java/org/apache/hadoop/hbase/client/HConnectionManager.java (revision 684399) +++ src/java/org/apache/hadoop/hbase/client/HConnectionManager.java (working copy) @@ -371,62 +371,43 @@ 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)) { + if (Bytes.equals(tableName, HConstants.META_TABLE_NAME)) { + return new UnmodifyableHTableDescriptor(HTableDescriptor.META_TABLEDESC); + } + HTableDescriptorFinder finder = new HTableDescriptorFinder(tableName); + MetaScanner.metaScan(conf, finder); + HTableDescriptor result = finder.getResult(); + if (result == null) { throw new TableNotFoundException(Bytes.toString(tableName)); } - 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); - } - } return result; }