Author: markt
Date: Tue Sep 29 21:54:39 2015
New Revision: 1705930
URL: http://svn.apache.org/viewvc?rev=1705930&view=rev
Log:
More refactoring to align the dispatch() method between Processors
Modified:
tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java
tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java
tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java?rev=1705930&r1=1705929&r2=1705930&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java Tue Sep 29
21:54:39 2015
@@ -229,6 +229,18 @@ public abstract class AbstractProcessor
public abstract SocketState dispatch(SocketStatus status);
/**
+ * Flush any pending writes. Used during non-blocking writes to flush any
+ * remaining data from a previous incomplete write.
+ *
+ * @return <code>true</code> if data remains to be flushed at the end of
+ * method
+ *
+ * @throws IOException If an I/O error occurs while attempting to flush the
+ * data
+ */
+ protected abstract boolean flushBufferedWrite() throws IOException ;
+
+ /**
* Perform any necessary processing for a non-blocking read before
* dispatching to the adapter.
*/
Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1705930&r1=1705929&r2=1705930&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Tue Sep 29
21:54:39 2015
@@ -623,14 +623,8 @@ public class AjpProcessor extends Abstra
if (status == SocketStatus.OPEN_WRITE && response.getWriteListener()
!= null) {
asyncStateMachine.asyncOperation();
try {
- if (hasDataToWrite()) {
- socketWrapper.flush(false);
- if (hasDataToWrite()) {
- // There is data to write but go via Response to
- // maintain a consistent view of non-blocking state
- response.checkRegisterForWrite();
- return SocketState.LONG;
- }
+ if (flushBufferedWrite()) {
+ return SocketState.LONG;
}
} catch (IOException ioe) {
if (getLog().isDebugEnabled()) {
@@ -646,7 +640,7 @@ public class AjpProcessor extends Abstra
RequestInfo rp = request.getRequestProcessor();
try {
rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);
- if(!getAdapter().asyncDispatch(request, response, status)) {
+ if (!getAdapter().asyncDispatch(request, response, status)) {
setErrorState(ErrorState.CLOSE_NOW, null);
}
} catch (InterruptedIOException e) {
@@ -675,6 +669,20 @@ public class AjpProcessor extends Abstra
}
@Override
+ protected boolean flushBufferedWrite() throws IOException {
+ if (hasDataToWrite()) {
+ socketWrapper.flush(false);
+ if (hasDataToWrite()) {
+ // There is data to write but go via Response to
+ // maintain a consistent view of non-blocking state
+ response.checkRegisterForWrite();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
protected void dispatchNonBlockingRead() {
if (available()) {
super.dispatchNonBlockingRead();
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1705930&r1=1705929&r2=1705930&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Tue Sep 29
21:54:39 2015
@@ -1700,22 +1700,12 @@ public class Http11Processor extends Abs
if (status == SocketStatus.OPEN_WRITE && response.getWriteListener()
!= null) {
asyncStateMachine.asyncOperation();
try {
- if (outputBuffer.hasDataToWrite()) {
- if (outputBuffer.flushBuffer(false)) {
- // The buffer wasn't fully flushed so re-register the
- // socket for write. Note this does not go via the
- // Response since the write registration state at
- // that level should remain unchanged. Once the buffer
- // has been emptied then the code below will call
- // Adaptor.asyncDispatch() which will enable the
- // Response to respond to this event.
- outputBuffer.registerWriteInterest();
- return SocketState.LONG;
- }
+ if (flushBufferedWrite()) {
+ return SocketState.LONG;
}
} catch (IOException ioe) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to write async data.", ioe);
+ if (getLog().isDebugEnabled()) {
+ getLog().debug("Unable to write async data.", ioe);
}
status = SocketStatus.ASYNC_WRITE_ERROR;
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, ioe);
@@ -1735,7 +1725,7 @@ public class Http11Processor extends Abs
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setErrorState(ErrorState.CLOSE_NOW, t);
- log.error(sm.getString("http11processor.request.process"), t);
+ getLog().error(sm.getString("http11processor.request.process"), t);
}
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);
@@ -1762,6 +1752,25 @@ public class Http11Processor extends Abs
}
+ @Override
+ protected boolean flushBufferedWrite() throws IOException {
+ if (outputBuffer.hasDataToWrite()) {
+ if (outputBuffer.flushBuffer(false)) {
+ // The buffer wasn't fully flushed so re-register the
+ // socket for write. Note this does not go via the
+ // Response since the write registration state at
+ // that level should remain unchanged. Once the buffer
+ // has been emptied then the code below will call
+ // Adaptor.asyncDispatch() which will enable the
+ // Response to respond to this event.
+ outputBuffer.registerWriteInterest();
+ return true;
+ }
+ }
+ return false;
+ }
+
+
@Override
public boolean isUpgrade() {
return httpUpgradeHandler != null;
Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1705930&r1=1705929&r2=1705930&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Tue Sep
29 21:54:39 2015
@@ -72,7 +72,6 @@ stream.write=Connection [{0}], Stream [{
stream.outputBuffer.flush.debug=Connection [{0}], Stream [{1}], flushing
output with buffer at position [{2}], writeInProgress [{3}] and closed [{4}]
-streamProcessor.dispatch=Connection [{0}], Stream [{1}], status [{2}]
streamProcessor.httpupgrade.notsupported=HTTP upgrade is not supported within
HTTP/2 streams
streamProcessor.process.loopend=Connection [{0}], Stream [{1}], loop end,
state [{2}], dispatches [{3}]
streamProcessor.process.loopstart=Connection [{0}], Stream [{1}], loop start,
status [{2}], dispatches [{3}]
Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1705930&r1=1705929&r2=1705930&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Tue Sep 29
21:54:39 2015
@@ -402,30 +402,16 @@ public class StreamProcessor extends Abs
@Override
public SocketState dispatch(SocketStatus status) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("streamProcessor.dispatch",
stream.getConnectionId(),
- stream.getIdentifier(), status));
- }
+
if (status == SocketStatus.OPEN_WRITE && response.getWriteListener()
!= null) {
asyncStateMachine.asyncOperation();
try {
- if (stream.getOutputBuffer().flush(false)) {
- // The buffer wasn't fully flushed so re-register the
- // stream for write. Note this does not go via the
- // Response since the write registration state at
- // that level should remain unchanged. Once the buffer
- // has been emptied then the code below will call
- // dispatch() which will enable the
- // Response to respond to this event.
- if (stream.getOutputBuffer().isReady()) {
- // Unexpected
- throw new IllegalStateException();
- }
+ if (flushBufferedWrite()) {
return SocketState.LONG;
}
} catch (IOException ioe) {
- if (log.isDebugEnabled()) {
- log.debug("Unable to write async data.", ioe);
+ if (getLog().isDebugEnabled()) {
+ getLog().debug("Unable to write async data.", ioe);
}
status = SocketStatus.ASYNC_WRITE_ERROR;
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, ioe);
@@ -445,7 +431,7 @@ public class StreamProcessor extends Abs
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
setErrorState(ErrorState.CLOSE_NOW, t);
- log.error(sm.getString("http11processor.request.process"), t);
+ getLog().error(sm.getString("http11processor.request.process"), t);
}
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);
@@ -462,6 +448,26 @@ public class StreamProcessor extends Abs
}
+ @Override
+ protected boolean flushBufferedWrite() throws IOException {
+ if (stream.getOutputBuffer().flush(false)) {
+ // The buffer wasn't fully flushed so re-register the
+ // stream for write. Note this does not go via the
+ // Response since the write registration state at
+ // that level should remain unchanged. Once the buffer
+ // has been emptied then the code below will call
+ // dispatch() which will enable the
+ // Response to respond to this event.
+ if (stream.getOutputBuffer().isReady()) {
+ // Unexpected
+ throw new IllegalStateException();
+ }
+ return true;
+ }
+ return false;
+ }
+
+
public void addDispatch(DispatchType dispatchType) {
synchronized (dispatches) {
dispatches.add(dispatchType);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]