HDFS-8870. Lease is leaked on write failure. Contributed by Kuhu Shukla.

This commit is contained in:
Kihwal Lee 2016-11-15 14:47:53 -06:00
parent 5af572b644
commit 4fcea8a0c8
2 changed files with 20 additions and 4 deletions

View File

@ -749,8 +749,6 @@ void abort() throws IOException {
b.add(e);
}
}
dfsClient.endFileLease(fileId);
final IOException ioe = b.build();
if (ioe != null) {
throw ioe;
@ -763,6 +761,7 @@ boolean isClosed() {
void setClosed() {
closed = true;
dfsClient.endFileLease(fileId);
getStreamer().release();
}
@ -796,8 +795,6 @@ public void close() throws IOException {
b.add(e);
}
}
dfsClient.endFileLease(fileId);
final IOException ioe = b.build();
if (ioe != null) {
throw ioe;

View File

@ -50,6 +50,11 @@
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyLong;
import org.mockito.Mockito;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.mockito.internal.util.reflection.Whitebox;
import static org.junit.Assert.assertEquals;
@ -202,6 +207,20 @@ public void testNoLocalWriteFlag() throws IOException {
assertEquals(1, 3 - numDataNodesWithData);
}
@Test
public void testEndLeaseCall() throws Exception {
Configuration conf = new Configuration();
DFSClient client = new DFSClient(cluster.getNameNode(0)
.getNameNodeAddress(), conf);
DFSClient spyClient = Mockito.spy(client);
DFSOutputStream dfsOutputStream = spyClient.create("/file2",
FsPermission.getFileDefault(),
EnumSet.of(CreateFlag.CREATE), (short) 3, 1024, null , 1024, null);
DFSOutputStream spyDFSOutputStream = Mockito.spy(dfsOutputStream);
spyDFSOutputStream.closeThreads(anyBoolean());
verify(spyClient, times(1)).endFileLease(anyLong());
}
@AfterClass
public static void tearDown() {
if (cluster != null) {