HADOOP-11333. Fix deadlock in DomainSocketWatcher when the notification pipe is full (zhaoyunjiong via cmccabe)

(cherry picked from commit 86e3993def)
This commit is contained in:
Colin Patrick Mccabe 2014-12-01 11:42:10 -08:00
parent c7bd22974a
commit f6d1bf5ed1
2 changed files with 18 additions and 0 deletions

View File

@ -113,6 +113,9 @@ Release 2.7.0 - UNRELEASED
HADOOP-11257. Update "hadoop jar" documentation to warn against using it HADOOP-11257. Update "hadoop jar" documentation to warn against using it
for launching yarn jars (iwasakims via cmccabe) 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 Release 2.6.0 - 2014-11-18
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -103,6 +103,7 @@ public final class DomainSocketWatcher implements Closeable {
public boolean handle(DomainSocket sock) { public boolean handle(DomainSocket sock) {
assert(lock.isHeldByCurrentThread()); assert(lock.isHeldByCurrentThread());
try { try {
kicked = false;
if (LOG.isTraceEnabled()) { if (LOG.isTraceEnabled()) {
LOG.trace(this + ": NotificationHandler: doing a read on " + LOG.trace(this + ": NotificationHandler: doing a read on " +
sock.fd); sock.fd);
@ -229,6 +230,14 @@ public final class DomainSocketWatcher implements Closeable {
*/ */
private boolean closed = false; 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 { public DomainSocketWatcher(int interruptCheckPeriodMs) throws IOException {
if (loadingFailureReason != null) { if (loadingFailureReason != null) {
throw new UnsupportedOperationException(loadingFailureReason); throw new UnsupportedOperationException(loadingFailureReason);
@ -348,8 +357,14 @@ public final class DomainSocketWatcher implements Closeable {
*/ */
private void kick() { private void kick() {
assert(lock.isHeldByCurrentThread()); assert(lock.isHeldByCurrentThread());
if (kicked) {
return;
}
try { try {
notificationSockets[0].getOutputStream().write(0); notificationSockets[0].getOutputStream().write(0);
kicked = true;
} catch (IOException e) { } catch (IOException e) {
if (!closed) { if (!closed) {
LOG.error(this + ": error writing to notificationSockets[0]", e); LOG.error(this + ": error writing to notificationSockets[0]", e);