HBASE-729 lient region/metadata cache should have a public method for invalidating entries

git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@684951 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2008-08-11 21:56:30 +00:00
parent 0696c139f5
commit 6cab23c4a0
3 changed files with 50 additions and 78 deletions

View File

@ -7,6 +7,8 @@ Release 0.3.0 - Unreleased
HBASE-805 Remove unnecessary getRow overloads in HRS (Jonathan Gray via HBASE-805 Remove unnecessary getRow overloads in HRS (Jonathan Gray via
Jim Kellerman) (Fix whitespace diffs in HRegionServer) Jim Kellerman) (Fix whitespace diffs in HRegionServer)
HBASE-811 HTD is not fully copyable (Andrew Purtell via Jim Kellerman) 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 IMPROVEMENTS
HBASE-801 When a table haven't disable, shell could response in a "user HBASE-801 When a table haven't disable, shell could response in a "user

View File

@ -371,61 +371,42 @@ public class HConnectionManager implements HConstants {
return rowsScanned > 0 && result; 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} */ /** {@inheritDoc} */
public HTableDescriptor getHTableDescriptor(byte[] tableName) public HTableDescriptor getHTableDescriptor(final byte[] tableName)
throws IOException { throws IOException {
if (Bytes.equals(tableName, HConstants.ROOT_TABLE_NAME)) { if (Bytes.equals(tableName, HConstants.ROOT_TABLE_NAME)) {
return new UnmodifyableHTableDescriptor(HTableDescriptor.ROOT_TABLEDESC); return new UnmodifyableHTableDescriptor(HTableDescriptor.ROOT_TABLEDESC);
} }
if (!tableExists(tableName)) { if (Bytes.equals(tableName, HConstants.META_TABLE_NAME)) {
throw new TableNotFoundException(Bytes.toString(tableName)); return new UnmodifyableHTableDescriptor(HTableDescriptor.META_TABLEDESC);
} }
byte[] startKey = HTableDescriptorFinder finder = new HTableDescriptorFinder(tableName);
HRegionInfo.createRegionName(tableName, null, HConstants.ZEROES); MetaScanner.metaScan(conf, finder);
HTableDescriptor result = finder.getResult();
HTableDescriptor result = null; if (result == null) {
HRegionInfo currentRegion = null; throw new TableNotFoundException(Bytes.toString(tableName));
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; return result;
} }

View File

@ -150,36 +150,25 @@ public class TestHTable extends HBaseClusterTestCase implements HConstants {
// enable the table // enable the table
admin.enableTable(tableAname); admin.enableTable(tableAname);
// Use a metascanner to avoid client API caching (HConnection has a // test that attribute changes were applied
// metadata cache) desc = a.getTableDescriptor();
MetaScanner.MetaScannerVisitor visitor = if (Bytes.compareTo(desc.getName(), tableAname) != 0)
new MetaScanner.MetaScannerVisitor() { fail("wrong table descriptor returned");
public boolean processRow(RowResult rowResult) throws IOException { // check HTD attribute
HRegionInfo info = Writables.getHRegionInfo( value = desc.getValue(attrName);
rowResult.get(HConstants.COL_REGIONINFO)); 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) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(); fail();