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 cm...@apache.org on 2014/03/03 04:58:38 UTC
svn commit: r1573433 - in
/hadoop/common/trunk/hadoop-common-project/hadoop-common/src:
main/java/org/apache/hadoop/io/nativeio/
main/java/org/apache/hadoop/net/unix/
test/java/org/apache/hadoop/io/nativeio/
Author: cmccabe
Date: Mon Mar 3 03:58:37 2014
New Revision: 1573433
URL: http://svn.apache.org/r1573433
Log:
HDFS-5950. The DFSClient and DataNode should use shared memory segments to communicate short-circuit information (cmccabe)
Modified:
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/SharedFileDescriptorFactory.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java
hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/nativeio/TestSharedFileDescriptorFactory.java
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/SharedFileDescriptorFactory.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/SharedFileDescriptorFactory.java?rev=1573433&r1=1573432&r2=1573433&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/SharedFileDescriptorFactory.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/SharedFileDescriptorFactory.java Mon Mar 3 03:58:37 2014
@@ -66,14 +66,18 @@ public class SharedFileDescriptorFactory
/**
* Create a shared file descriptor which will be both readable and writable.
*
+ * @param info Information to include in the path of the
+ * generated descriptor.
* @param length The starting file length.
*
* @return The file descriptor, wrapped in a FileInputStream.
* @throws IOException If there was an I/O or configuration error creating
- * the descriptor.
+ * the descriptor.
*/
- public FileInputStream createDescriptor(int length) throws IOException {
- return new FileInputStream(createDescriptor0(prefix, path, length));
+ public FileInputStream createDescriptor(String info, int length)
+ throws IOException {
+ return new FileInputStream(
+ createDescriptor0(prefix + info, path, length));
}
/**
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java?rev=1573433&r1=1573432&r2=1573433&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java Mon Mar 3 03:58:37 2014
@@ -81,7 +81,7 @@ public final class DomainSocketWatcher i
*/
private static native void anchorNative();
- interface Handler {
+ public interface Handler {
/**
* Handles an event on a socket. An event may be the socket becoming
* readable, or the remote end being closed.
@@ -228,9 +228,9 @@ public final class DomainSocketWatcher i
if (loadingFailureReason != null) {
throw new UnsupportedOperationException(loadingFailureReason);
}
- notificationSockets = DomainSocket.socketpair();
- this.interruptCheckPeriodMs = interruptCheckPeriodMs;
Preconditions.checkArgument(interruptCheckPeriodMs > 0);
+ this.interruptCheckPeriodMs = interruptCheckPeriodMs;
+ notificationSockets = DomainSocket.socketpair();
watcherThread.start();
}
@@ -241,8 +241,8 @@ public final class DomainSocketWatcher i
*/
@Override
public void close() throws IOException {
+ lock.lock();
try {
- lock.lock();
if (closed) return;
LOG.info(this + ": closing");
closed = true;
@@ -266,15 +266,17 @@ public final class DomainSocketWatcher i
* called any time after this function is called.
*/
public void add(DomainSocket sock, Handler handler) {
+ lock.lock();
try {
- lock.lock();
checkNotClosed();
Entry entry = new Entry(sock, handler);
try {
sock.refCount.reference();
- } catch (ClosedChannelException e) {
- Preconditions.checkArgument(false,
- "tried to add a closed DomainSocket to " + this);
+ } catch (ClosedChannelException e1) {
+ // If the socket is already closed before we add it, invoke the
+ // handler immediately. Then we're done.
+ handler.handle(sock);
+ return;
}
toAdd.add(entry);
kick();
@@ -300,8 +302,8 @@ public final class DomainSocketWatcher i
* @param sock The socket to remove.
*/
public void remove(DomainSocket sock) {
+ lock.lock();
try {
- lock.lock();
checkNotClosed();
toRemove.put(sock.fd, sock);
kick();
@@ -328,7 +330,9 @@ public final class DomainSocketWatcher i
try {
notificationSockets[0].getOutputStream().write(0);
} catch (IOException e) {
- LOG.error(this + ": error writing to notificationSockets[0]", e);
+ if (!closed) {
+ LOG.error(this + ": error writing to notificationSockets[0]", e);
+ }
}
}
Modified: hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/nativeio/TestSharedFileDescriptorFactory.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/nativeio/TestSharedFileDescriptorFactory.java?rev=1573433&r1=1573432&r2=1573433&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/nativeio/TestSharedFileDescriptorFactory.java (original)
+++ hadoop/common/trunk/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/nativeio/TestSharedFileDescriptorFactory.java Mon Mar 3 03:58:37 2014
@@ -44,7 +44,8 @@ public class TestSharedFileDescriptorFac
path.mkdirs();
SharedFileDescriptorFactory factory =
new SharedFileDescriptorFactory("woot_", path.getAbsolutePath());
- FileInputStream inStream = factory.createDescriptor(4096);
+ FileInputStream inStream =
+ factory.createDescriptor("testReadAndWrite", 4096);
FileOutputStream outStream = new FileOutputStream(inStream.getFD());
outStream.write(101);
inStream.getChannel().position(0);