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:
parent
227ace9100
commit
e78aeb24e0
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue