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/12/01 20:49:04 UTC
hadoop git commit: HADOOP-11333. Fix deadlock in DomainSocketWatcher
when the notification pipe is full (zhaoyunjiong via cmccabe) (cherry picked
from commit 86e3993def01223f92b8d1dd35f6c1f8ab6033f5)
Repository: hadoop
Updated Branches:
refs/heads/branch-2 c7bd22974 -> f6d1bf5ed
HADOOP-11333. Fix deadlock in DomainSocketWatcher when the notification pipe is full (zhaoyunjiong via cmccabe)
(cherry picked from commit 86e3993def01223f92b8d1dd35f6c1f8ab6033f5)
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/f6d1bf5e
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/f6d1bf5e
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/f6d1bf5e
Branch: refs/heads/branch-2
Commit: f6d1bf5ed1cf647d82e676df15587de42b1faa42
Parents: c7bd229
Author: Colin Patrick Mccabe <cm...@cloudera.com>
Authored: Mon Dec 1 11:42:10 2014 -0800
Committer: Colin Patrick Mccabe <cm...@cloudera.com>
Committed: Mon Dec 1 11:48:53 2014 -0800
----------------------------------------------------------------------
hadoop-common-project/hadoop-common/CHANGES.txt | 3 +++
.../apache/hadoop/net/unix/DomainSocketWatcher.java | 15 +++++++++++++++
2 files changed, 18 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d1bf5e/hadoop-common-project/hadoop-common/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt
index 3facb02..788bf31 100644
--- a/hadoop-common-project/hadoop-common/CHANGES.txt
+++ b/hadoop-common-project/hadoop-common/CHANGES.txt
@@ -113,6 +113,9 @@ Release 2.7.0 - UNRELEASED
HADOOP-11257. Update "hadoop jar" documentation to warn against using it
for launching yarn jars (iwasakims via cmccabe)
+ HADOOP-11333. Fix deadlock in DomainSocketWatcher when the notification
+ pipe is full (zhaoyunjiong via cmccabe)
+
Release 2.6.0 - 2014-11-18
INCOMPATIBLE CHANGES
http://git-wip-us.apache.org/repos/asf/hadoop/blob/f6d1bf5e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java
----------------------------------------------------------------------
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java
index 95ef30d..0172f6b 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/unix/DomainSocketWatcher.java
@@ -103,6 +103,7 @@ public final class DomainSocketWatcher implements Closeable {
public boolean handle(DomainSocket sock) {
assert(lock.isHeldByCurrentThread());
try {
+ kicked = false;
if (LOG.isTraceEnabled()) {
LOG.trace(this + ": NotificationHandler: doing a read on " +
sock.fd);
@@ -228,6 +229,14 @@ public final class DomainSocketWatcher implements Closeable {
* Whether or not this DomainSocketWatcher is closed.
*/
private boolean closed = false;
+
+ /**
+ * True if we have written a byte to the notification socket. We should not
+ * write anything else to the socket until the notification handler has had a
+ * chance to run. Otherwise, our thread might block, causing deadlock.
+ * See HADOOP-11333 for details.
+ */
+ private boolean kicked = false;
public DomainSocketWatcher(int interruptCheckPeriodMs) throws IOException {
if (loadingFailureReason != null) {
@@ -348,8 +357,14 @@ public final class DomainSocketWatcher implements Closeable {
*/
private void kick() {
assert(lock.isHeldByCurrentThread());
+
+ if (kicked) {
+ return;
+ }
+
try {
notificationSockets[0].getOutputStream().write(0);
+ kicked = true;
} catch (IOException e) {
if (!closed) {
LOG.error(this + ": error writing to notificationSockets[0]", e);