HDFS-2877. If locking of a storage dir fails, it will remove the other NN's lock file on exit. Contributed by Todd Lipcon.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1239879 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5796391773
commit
3f38b5f7aa
|
@ -1554,6 +1554,9 @@ Release 0.22.1 - Unreleased
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
|
||||||
|
HDFS-2877. If locking of a storage dir fails, it will remove the other
|
||||||
|
NN's lock file on exit. (todd)
|
||||||
|
|
||||||
Release 0.22.0 - 2011-11-29
|
Release 0.22.0 - 2011-11-29
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -599,8 +599,12 @@ public abstract class Storage extends StorageInfo {
|
||||||
* @throws IOException if locking fails.
|
* @throws IOException if locking fails.
|
||||||
*/
|
*/
|
||||||
FileLock tryLock() throws IOException {
|
FileLock tryLock() throws IOException {
|
||||||
|
boolean deletionHookAdded = false;
|
||||||
File lockF = new File(root, STORAGE_FILE_LOCK);
|
File lockF = new File(root, STORAGE_FILE_LOCK);
|
||||||
|
if (!lockF.exists()) {
|
||||||
lockF.deleteOnExit();
|
lockF.deleteOnExit();
|
||||||
|
deletionHookAdded = true;
|
||||||
|
}
|
||||||
RandomAccessFile file = new RandomAccessFile(lockF, "rws");
|
RandomAccessFile file = new RandomAccessFile(lockF, "rws");
|
||||||
FileLock res = null;
|
FileLock res = null;
|
||||||
try {
|
try {
|
||||||
|
@ -613,6 +617,12 @@ public abstract class Storage extends StorageInfo {
|
||||||
file.close();
|
file.close();
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
if (res != null && !deletionHookAdded) {
|
||||||
|
// If the file existed prior to our startup, we didn't
|
||||||
|
// call deleteOnExit above. But since we successfully locked
|
||||||
|
// the dir, we can take care of cleaning it up.
|
||||||
|
lockF.deleteOnExit();
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue