Author: omalley
Date: Fri Mar 4 03:49:35 2011
New Revision: 1077184
URL: http://svn.apache.org/viewvc?rev=1077184&view=rev
Log:
commit 9c3478b489569053636ebc2a7132d4af9ad17056
Author: Devaraj Das <[email protected]>
Date: Fri Feb 19 23:55:25 2010 -0800
HADOOP:6572 from
https://issues.apache.org/jira/secure/attachment/12436421/6572-bp20.patch
+++ b/YAHOO-CHANGES.txt
+ HADOOP-6572. Makes sure that SASL encryption and push to responder
queue for the
+ RPC response happens atomically. (Kan Zhang via ddas)
+
Modified:
hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/ipc/Server.java
Modified:
hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/ipc/Server.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/ipc/Server.java?rev=1077184&r1=1077183&r2=1077184&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/ipc/Server.java
(original)
+++
hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/ipc/Server.java
Fri Mar 4 03:49:35 2011
@@ -1193,17 +1193,23 @@ public abstract class Server {
error = StringUtils.stringifyException(e);
}
CurCall.set(null);
- setupResponse(buf, call,
+ synchronized (call.connection.responseQueue) {
+ // setupResponse() needs to be sync'ed together with
+ // responder.doResponse() since setupResponse may use
+ // SASL to encrypt response data and SASL enforces
+ // its own message ordering.
+ setupResponse(buf, call,
(error == null) ? Status.SUCCESS : Status.ERROR,
value, errorClass, error);
- // Discard the large buf and reset it back to
- // smaller size to freeup heap
- if (buf.size() > MAX_RESP_BUF_SIZE) {
- LOG.warn("Large response size " + buf.size() + " for call " +
+ // Discard the large buf and reset it back to
+ // smaller size to freeup heap
+ if (buf.size() > MAX_RESP_BUF_SIZE) {
+ LOG.warn("Large response size " + buf.size() + " for call " +
call.toString());
- buf = new ByteArrayOutputStream(INITIAL_RESP_BUF_SIZE);
+ buf = new ByteArrayOutputStream(INITIAL_RESP_BUF_SIZE);
+ }
+ responder.doRespond(call);
}
- responder.doRespond(call);
} catch (InterruptedException e) {
if (running) { // unexpected -- log it
LOG.info(getName() + " caught: " +