HBASE-13331 Exceptions from DFS client can cause CatalogJanitor to delete referenced files

Summary:
CatalogJanitor#checkDaughterInFs assumes that there are no references
whenever HRegionFileSystem.openRegionFromFileSystem throws IOException.
Well Hadoop and HBase throw IOExceptions whenever someone looks in their general direction.

This patch explicitly checks if the directory exists. If it doesn't then it allows references to be
deleted. All other exceptions cause CatalogJanitor to assume there are references

Test Plan: Unit tests.

Differential Revision: https://reviews.facebook.net/D35829
This commit is contained in:
Elliott Clark 2015-03-24 13:42:29 -07:00
parent 227ace9100
commit e78aeb24e0
1 changed files with 16 additions and 3 deletions

View File

@ -367,14 +367,27 @@ public class CatalogJanitor extends ScheduledChore {
Path rootdir = this.services.getMasterFileSystem().getRootDir(); Path rootdir = this.services.getMasterFileSystem().getRootDir();
Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable()); Path tabledir = FSUtils.getTableDir(rootdir, daughter.getTable());
Path daughterRegionDir = new Path(tabledir, daughter.getEncodedName());
HRegionFileSystem regionFs = null; HRegionFileSystem regionFs = null;
try {
if (!FSUtils.isExists(fs, daughterRegionDir)) {
return new Pair<Boolean, Boolean>(Boolean.FALSE, Boolean.FALSE);
}
} catch (IOException ioe) {
LOG.warn("Error trying to determine if daughter region exists, " +
"assuming exists and has references", ioe);
return new Pair<Boolean, Boolean>(Boolean.TRUE, Boolean.TRUE);
}
try { try {
regionFs = HRegionFileSystem.openRegionFromFileSystem( regionFs = HRegionFileSystem.openRegionFromFileSystem(
this.services.getConfiguration(), fs, tabledir, daughter, true); this.services.getConfiguration(), fs, tabledir, daughter, true);
} catch (IOException e) { } catch (IOException e) {
LOG.warn("Daughter region does not exist: " + daughter.getEncodedName() LOG.warn("Error trying to determine referenced files from : " + daughter.getEncodedName()
+ ", parent is: " + parent.getEncodedName()); + ", to: " + parent.getEncodedName() + " assuming has references", e);
return new Pair<Boolean, Boolean>(Boolean.FALSE, Boolean.FALSE); return new Pair<Boolean, Boolean>(Boolean.TRUE, Boolean.TRUE);
} }
boolean references = false; boolean references = false;