Andrew Purtell created HBASE-9270: ------------------------------------- Summary: [0.94] FSTableDescriptors caching is racy Key: HBASE-9270 URL: https://issues.apache.org/jira/browse/HBASE-9270 Project: HBase Issue Type: Bug Affects Versions: 0.94.11 Reporter: Andrew Purtell Priority: Minor
An occasionally failing test in 0.92 branch that concurrently executes master operations on a single table found this problem in FSTableDescriptors: {code} diff --git src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java index e882621..b0042cd 100644 --- src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java +++ src/main/java/org/apache/hadoop/hbase/util/FSTableDescriptors.java @@ -221,8 +221,15 @@ public class FSTableDescriptors implements TableDescriptors { if (HConstants.HBASE_NON_USER_TABLE_DIRS.contains(htd.getNameAsString())) { throw new NotImplementedException(); } - if (!this.fsreadonly) updateHTableDescriptor(this.fs, this.rootdir, htd); - long modtime = getTableInfoModtime(this.fs, this.rootdir, htd.getNameAsString()); + if (fsreadonly) { + // Cannot cache here. + // We can't know if a modtime from the most recent file found in a + // directory listing at some arbitrary point in time still corresponds + // to the latest, nor that our htd is the latest. + return; + } + // Cache with the modtime of the descriptor we wrote + long modtime = updateHTableDescriptor(this.fs, this.rootdir, htd).getModificationTime(); this.cache.put(htd.getNameAsString(), new TableDescriptorModtime(modtime, htd)); } {code} After HBASE-7305 master operations are serialized by a write lock on the table. However, 0.94 has code with the same issue: {code} @Override public void add(HTableDescriptor htd) throws IOException { if (Bytes.equals(HConstants.ROOT_TABLE_NAME, htd.getName())) { throw new NotImplementedException(); } if (Bytes.equals(HConstants.META_TABLE_NAME, htd.getName())) { throw new NotImplementedException(); } if (HConstants.HBASE_NON_USER_TABLE_DIRS.contains(htd.getNameAsString())) { throw new NotImplementedException(); } if (!this.fsreadonly) updateHTableDescriptor(this.fs, this.rootdir, htd); String tableName = htd.getNameAsString(); long modtime = getTableInfoModtime(this.fs, this.rootdir, tableName); long dirmodtime = getTableDirModtime(this.fs, this.rootdir, tableName); this.cache.put(tableName, new TableDescriptorModtime(modtime, dirmodtime, htd)); } {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira