HDFS-3848. A Bug in recoverLeaseInternal method of FSNameSystem class. Contributed by Hooman Peiro Sajjad and Chen He.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1604011 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a3908b89f7
commit
0da148dae7
@ -670,6 +670,9 @@ Release 2.5.0 - UNRELEASED
|
|||||||
HDFS-6563. NameNode cannot save fsimage in certain circumstances when
|
HDFS-6563. NameNode cannot save fsimage in certain circumstances when
|
||||||
snapshots are in use. (atm)
|
snapshots are in use. (atm)
|
||||||
|
|
||||||
|
HDFS-3848. A Bug in recoverLeaseInternal method of FSNameSystem class
|
||||||
|
(Hooman Peiro Sajjad and Chen He via kihwal)
|
||||||
|
|
||||||
BREAKDOWN OF HDFS-2006 SUBTASKS AND RELATED JIRAS
|
BREAKDOWN OF HDFS-2006 SUBTASKS AND RELATED JIRAS
|
||||||
|
|
||||||
HDFS-6299. Protobuf for XAttr and client-side implementation. (Yi Liu via umamahesh)
|
HDFS-6299. Protobuf for XAttr and client-side implementation. (Yi Liu via umamahesh)
|
||||||
|
@ -2584,10 +2584,10 @@ private void recoverLeaseInternal(INodeFile fileInode,
|
|||||||
// We found the lease for this file. And surprisingly the original
|
// We found the lease for this file. And surprisingly the original
|
||||||
// holder is trying to recreate this file. This should never occur.
|
// holder is trying to recreate this file. This should never occur.
|
||||||
//
|
//
|
||||||
|
|
||||||
if (!force && lease != null) {
|
if (!force && lease != null) {
|
||||||
Lease leaseFile = leaseManager.getLeaseByPath(src);
|
Lease leaseFile = leaseManager.getLeaseByPath(src);
|
||||||
if ((leaseFile != null && leaseFile.equals(lease)) ||
|
if (leaseFile != null && leaseFile.equals(lease)) {
|
||||||
lease.getHolder().equals(holder)) {
|
|
||||||
throw new AlreadyBeingCreatedException(
|
throw new AlreadyBeingCreatedException(
|
||||||
"failed to create file " + src + " for " + holder +
|
"failed to create file " + src + " for " + holder +
|
||||||
" for client " + clientMachine +
|
" for client " + clientMachine +
|
||||||
|
@ -153,6 +153,15 @@ public void testImmediateRecoveryOfLease() throws Exception {
|
|||||||
verifyFile(dfs, filepath1, actual, size);
|
verifyFile(dfs, filepath1, actual, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLeaseRecoverByAnotherUser() throws Exception {
|
||||||
|
byte [] actual = new byte[FILE_SIZE];
|
||||||
|
cluster.setLeasePeriod(SHORT_LEASE_PERIOD, LONG_LEASE_PERIOD);
|
||||||
|
Path filepath = createFile("/immediateRecoverLease-x", 0, true);
|
||||||
|
recoverLeaseUsingCreate2(filepath);
|
||||||
|
verifyFile(dfs, filepath, actual, 0);
|
||||||
|
}
|
||||||
|
|
||||||
private Path createFile(final String filestr, final int size,
|
private Path createFile(final String filestr, final int size,
|
||||||
final boolean triggerLeaseRenewerInterrupt)
|
final boolean triggerLeaseRenewerInterrupt)
|
||||||
throws IOException, InterruptedException {
|
throws IOException, InterruptedException {
|
||||||
@ -196,7 +205,7 @@ private FileSystem getFSAsAnotherUser(final Configuration c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void recoverLeaseUsingCreate(Path filepath)
|
private void recoverLeaseUsingCreate(Path filepath)
|
||||||
throws IOException, InterruptedException {
|
throws IOException, InterruptedException {
|
||||||
FileSystem dfs2 = getFSAsAnotherUser(conf);
|
FileSystem dfs2 = getFSAsAnotherUser(conf);
|
||||||
for(int i = 0; i < 10; i++) {
|
for(int i = 0; i < 10; i++) {
|
||||||
AppendTestUtil.LOG.info("i=" + i);
|
AppendTestUtil.LOG.info("i=" + i);
|
||||||
@ -216,6 +225,20 @@ private void recoverLeaseUsingCreate(Path filepath)
|
|||||||
fail("recoverLeaseUsingCreate failed");
|
fail("recoverLeaseUsingCreate failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void recoverLeaseUsingCreate2(Path filepath)
|
||||||
|
throws Exception {
|
||||||
|
FileSystem dfs2 = getFSAsAnotherUser(conf);
|
||||||
|
int size = AppendTestUtil.nextInt(FILE_SIZE);
|
||||||
|
DistributedFileSystem dfsx = (DistributedFileSystem) dfs2;
|
||||||
|
//create file using dfsx
|
||||||
|
Path filepath2 = new Path("/immediateRecoverLease-x2");
|
||||||
|
FSDataOutputStream stm = dfsx.create(filepath2, true, BUF_SIZE,
|
||||||
|
REPLICATION_NUM, BLOCK_SIZE);
|
||||||
|
assertTrue(dfsx.dfs.exists("/immediateRecoverLease-x2"));
|
||||||
|
try {Thread.sleep(10000);} catch (InterruptedException e) {}
|
||||||
|
dfsx.append(filepath);
|
||||||
|
}
|
||||||
|
|
||||||
private void verifyFile(FileSystem dfs, Path filepath, byte[] actual,
|
private void verifyFile(FileSystem dfs, Path filepath, byte[] actual,
|
||||||
int size) throws IOException {
|
int size) throws IOException {
|
||||||
AppendTestUtil.LOG.info("Lease for file " + filepath + " is recovered. "
|
AppendTestUtil.LOG.info("Lease for file " + filepath + " is recovered. "
|
||||||
|
Loading…
Reference in New Issue
Block a user