You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ae...@apache.org on 2016/08/19 20:33:47 UTC
[32/50] [abbrv] hadoop git commit: HDFS-10549. Correctly revoke file
leases when closing files. Contributed by Yiqun Lin.
HDFS-10549. Correctly revoke file leases when closing files. Contributed by Yiqun Lin.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/2aa5e2c4
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/2aa5e2c4
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/2aa5e2c4
Branch: refs/heads/HDFS-7240
Commit: 2aa5e2c40364cf1e90e6af7851801f5eda759002
Parents: c575231
Author: Xiao Chen <xi...@apache.org>
Authored: Wed Aug 17 15:22:42 2016 -0700
Committer: Xiao Chen <xi...@apache.org>
Committed: Wed Aug 17 15:52:38 2016 -0700
----------------------------------------------------------------------
.../java/org/apache/hadoop/hdfs/DFSClient.java | 2 +-
.../org/apache/hadoop/hdfs/DFSOutputStream.java | 22 +++++++++++-
.../hadoop/hdfs/DFSStripedOutputStream.java | 13 +++++++-
.../hadoop/hdfs/TestDistributedFileSystem.java | 35 +++++++++++++++++++-
4 files changed, 68 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/2aa5e2c4/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
index 833b1ee..ad86895 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
@@ -463,7 +463,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
}
/** Stop renewal of lease for the file. */
- void endFileLease(final long inodeId) throws IOException {
+ void endFileLease(final long inodeId) {
getLeaseRenewer().closeFile(inodeId, this);
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/2aa5e2c4/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java
index 93aee0e..a73ab95 100755
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOutputStream.java
@@ -57,6 +57,7 @@ import org.apache.hadoop.hdfs.server.namenode.RetryStartFileException;
import org.apache.hadoop.hdfs.server.namenode.SafeModeException;
import org.apache.hadoop.hdfs.util.ByteArrayManager;
import org.apache.hadoop.io.EnumSetWritable;
+import org.apache.hadoop.io.MultipleIOException;
import org.apache.hadoop.ipc.RemoteException;
import org.apache.hadoop.security.AccessControlException;
import org.apache.hadoop.security.token.Token;
@@ -732,6 +733,7 @@ public class DFSOutputStream extends FSOutputSummer
* resources associated with this stream.
*/
void abort() throws IOException {
+ final MultipleIOException.Builder b = new MultipleIOException.Builder();
synchronized (this) {
if (isClosed()) {
return;
@@ -740,9 +742,19 @@ public class DFSOutputStream extends FSOutputSummer
new IOException("Lease timeout of "
+ (dfsClient.getConf().getHdfsTimeout() / 1000)
+ " seconds expired."));
- closeThreads(true);
+
+ try {
+ closeThreads(true);
+ } catch (IOException e) {
+ b.add(e);
+ }
}
+
dfsClient.endFileLease(fileId);
+ final IOException ioe = b.build();
+ if (ioe != null) {
+ throw ioe;
+ }
}
boolean isClosed() {
@@ -775,13 +787,21 @@ public class DFSOutputStream extends FSOutputSummer
*/
@Override
public void close() throws IOException {
+ final MultipleIOException.Builder b = new MultipleIOException.Builder();
synchronized (this) {
try (TraceScope ignored = dfsClient.newPathTraceScope(
"DFSOutputStream#close", src)) {
closeImpl();
+ } catch (IOException e) {
+ b.add(e);
}
}
+
dfsClient.endFileLease(fileId);
+ final IOException ioe = b.build();
+ if (ioe != null) {
+ throw ioe;
+ }
}
protected synchronized void closeImpl() throws IOException {
http://git-wip-us.apache.org/repos/asf/hadoop/blob/2aa5e2c4/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedOutputStream.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedOutputStream.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedOutputStream.java
index 502e0a5..d5d0dfb 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedOutputStream.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedOutputStream.java
@@ -798,6 +798,7 @@ public class DFSStripedOutputStream extends DFSOutputStream {
@Override
void abort() throws IOException {
+ final MultipleIOException.Builder b = new MultipleIOException.Builder();
synchronized (this) {
if (isClosed()) {
return;
@@ -808,9 +809,19 @@ public class DFSStripedOutputStream extends DFSOutputStream {
+ (dfsClient.getConf().getHdfsTimeout() / 1000)
+ " seconds expired."));
}
- closeThreads(true);
+
+ try {
+ closeThreads(true);
+ } catch (IOException e) {
+ b.add(e);
+ }
}
+
dfsClient.endFileLease(fileId);
+ final IOException ioe = b.build();
+ if (ioe != null) {
+ throw ioe;
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/hadoop/blob/2aa5e2c4/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
index 50f9f36..69248d9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
@@ -71,6 +71,7 @@ import org.apache.hadoop.fs.StorageStatistics.LongStatistic;
import org.apache.hadoop.fs.StorageType;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hdfs.client.HdfsClientConfigKeys;
+import org.apache.hadoop.hdfs.client.impl.LeaseRenewer;
import org.apache.hadoop.hdfs.DFSOpsCountStatistics.OpType;
import org.apache.hadoop.hdfs.net.Peer;
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
@@ -96,7 +97,6 @@ import org.junit.Assert;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.internal.util.reflection.Whitebox;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1373,4 +1373,37 @@ public class TestDistributedFileSystem {
}
}
+ @Test
+ public void testDFSCloseFilesBeingWritten() throws Exception {
+ Configuration conf = getTestConfiguration();
+ MiniDFSCluster cluster = null;
+ try {
+ cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build();
+ DistributedFileSystem fileSys = cluster.getFileSystem();
+
+ // Create one file then delete it to trigger the FileNotFoundException
+ // when closing the file.
+ fileSys.create(new Path("/test/dfsclose/file-0"));
+ fileSys.delete(new Path("/test/dfsclose/file-0"), true);
+
+ DFSClient dfsClient = fileSys.getClient();
+ // Construct a new dfsClient to get the same LeaseRenewer instance,
+ // to avoid the original client being added to the leaseRenewer again.
+ DFSClient newDfsClient =
+ new DFSClient(cluster.getFileSystem(0).getUri(), conf);
+ LeaseRenewer leaseRenewer = newDfsClient.getLeaseRenewer();
+
+ dfsClient.closeAllFilesBeingWritten(false);
+ // Remove new dfsClient in leaseRenewer
+ leaseRenewer.closeClient(newDfsClient);
+
+ // The list of clients corresponding to this renewer should be empty
+ assertEquals(true, leaseRenewer.isEmpty());
+ assertEquals(true, dfsClient.isFilesBeingWrittenEmpty());
+ } finally {
+ if (cluster != null) {
+ cluster.shutdown();
+ }
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org