JBossWeb SVN: r2440 - branches/7.4.x/src/main/java/org/apache/coyote/http11.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2014-06-03 07:55:52 -0400 (Tue, 03 Jun 2014)
New Revision: 2440
Modified:
branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java
Log:
Follow up on r2435: should do an initial notification when data is available.
Modified: branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java 2014-06-03 11:36:03 UTC (rev 2439)
+++ branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java 2014-06-03 11:55:52 UTC (rev 2440)
@@ -62,7 +62,7 @@
/**
* Non blocking mode.
*/
- protected boolean available = false;
+ protected boolean available = true;
/**
* NIO end point.
@@ -196,7 +196,7 @@
super.recycle();
bbuf.clear();
channel = null;
- available = false;
+ available = true;
}
/*
@@ -206,7 +206,7 @@
*/
public boolean nextRequest() {
boolean result = super.nextRequest();
- available = false;
+ available = true;
if (nonBlocking) {
semaphore.release();
}
10 years, 9 months
JBossWeb SVN: r2439 - in branches/7.4.x/src/main/java/org/apache/tomcat/websocket: server and 1 other directory.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2014-06-03 07:36:03 -0400 (Tue, 03 Jun 2014)
New Revision: 2439
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
Log:
BZ1100491: Add a little extra sync to avoid corruption, possibly caused by extra onWritePossible notifications.
Modified: branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2014-06-02 20:45:12 UTC (rev 2438)
+++ branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2014-06-03 11:36:03 UTC (rev 2439)
@@ -671,15 +671,18 @@
}
public void write() {
- buffer.clear();
- CoderResult cr = encoder.encode(message, buffer, true);
- if (cr.isError()) {
- throw new IllegalArgumentException(cr.toString());
+ // FIXME: this sync should be useless
+ synchronized (buffer) {
+ buffer.clear();
+ CoderResult cr = encoder.encode(message, buffer, true);
+ if (cr.isError()) {
+ throw new IllegalArgumentException(cr.toString());
+ }
+ isDone = !cr.isOverflow();
+ buffer.flip();
+ endpoint.startMessage(Constants.OPCODE_TEXT, buffer,
+ isDone && isLast, this);
}
- isDone = !cr.isOverflow();
- buffer.flip();
- endpoint.startMessage(Constants.OPCODE_TEXT, buffer,
- isDone && isLast, this);
}
@Override
Modified: branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java 2014-06-02 20:45:12 UTC (rev 2438)
+++ branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java 2014-06-03 11:36:03 UTC (rev 2439)
@@ -93,12 +93,16 @@
while (block || sos.isReady()) {
complete = true;
for (ByteBuffer buffer : buffers) {
- if (buffer.hasRemaining()) {
- complete = false;
- sos.write(buffer.array(), buffer.arrayOffset(),
- buffer.limit());
- buffer.position(buffer.limit());
- break;
+ // FIXME: this sync should be useless, an unwanted onWritePossible
+ // seems to be causing this
+ synchronized (buffer) {
+ if (buffer.hasRemaining()) {
+ complete = false;
+ sos.write(buffer.array(), buffer.arrayOffset(),
+ buffer.limit());
+ buffer.position(buffer.limit());
+ break;
+ }
}
}
if (complete) {
10 years, 9 months
JBossWeb SVN: r2438 - in branches/7.3.x: src/main/java/org/apache/catalina/authenticator and 1 other directories.
by jbossweb-commits@lists.jboss.org
Author: aogburn
Date: 2014-06-02 16:45:12 -0400 (Mon, 02 Jun 2014)
New Revision: 2438
Modified:
branches/7.3.x/
branches/7.3.x/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java
branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
Log:
[BZ-1101472] merge fix from BZ-1027272
Property changes on: branches/7.3.x
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x:2405
+ /branches/7.4.x:2338,2405
Modified: branches/7.3.x/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java
===================================================================
--- branches/7.3.x/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java 2014-06-02 19:40:15 UTC (rev 2437)
+++ branches/7.3.x/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java 2014-06-02 20:45:12 UTC (rev 2438)
@@ -22,20 +22,26 @@
import static org.jboss.web.CatalinaMessages.MESSAGES;
import java.io.IOException;
+import java.security.AccessController;
import java.security.Principal;
+import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
+import org.apache.catalina.Context;
+import org.apache.catalina.Globals;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Manager;
import org.apache.catalina.Realm;
import org.apache.catalina.Session;
import org.apache.catalina.SessionEvent;
import org.apache.catalina.SessionListener;
+import org.apache.catalina.ThreadBindingListener;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.util.LifecycleSupport;
@@ -505,7 +511,15 @@
reverse.remove(sessions[i]);
}
// Invalidate this session
- sessions[i].expire();
+ ClassLoader oldContextClassLoader = null;
+ try {
+ oldContextClassLoader = bindThread(sessions[i]);
+ sessions[i].expire();
+ } finally {
+ if (oldContextClassLoader != null) {
+ unbindThread(sessions[i], oldContextClassLoader);
+ }
+ }
}
// NOTE: Clients may still possess the old single sign on cookie,
@@ -515,6 +529,97 @@
}
+ protected ClassLoader bindThread(Session session) {
+
+ Manager manager = session.getManager();
+ Context context = null;
+ ClassLoader contextClassLoader = null;
+ ThreadBindingListener threadBindingListener = null;
+ if (manager != null && manager.getContainer() != null
+ && manager.getContainer() instanceof Context) {
+ context = (Context) manager.getContainer();
+ }
+ if (context != null) {
+ if (context.getLoader() != null && context.getLoader().getClassLoader() != null) {
+ contextClassLoader = context.getLoader().getClassLoader();
+ }
+ threadBindingListener = context.getThreadBindingListener();
+ }
+ if (threadBindingListener == null || contextClassLoader == null) {
+ return null;
+ }
+
+ if (Globals.IS_SECURITY_ENABLED) {
+ return AccessController.doPrivileged(new PrivilegedBind(contextClassLoader, threadBindingListener));
+ } else {
+ ClassLoader oldContextClassLoader =
+ Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ threadBindingListener.bind();
+ return oldContextClassLoader;
+ }
+
+ }
+
+ protected class PrivilegedBind implements PrivilegedAction<ClassLoader> {
+ private ClassLoader contextClassLoader;
+ private ThreadBindingListener threadBindingListener;
+
+ PrivilegedBind(ClassLoader contextClassLoader, ThreadBindingListener threadBindingListener) {
+ this.contextClassLoader = contextClassLoader;
+ this.threadBindingListener = threadBindingListener;
+ }
+
+ public ClassLoader run() {
+ ClassLoader oldContextClassLoader =
+ Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ threadBindingListener.bind();
+ return oldContextClassLoader;
+ }
+ }
+
+ protected void unbindThread(Session session, ClassLoader oldContextClassLoader) {
+
+ Manager manager = session.getManager();
+ Context context = null;
+ ThreadBindingListener threadBindingListener = null;
+ if (manager != null && manager.getContainer() != null
+ && manager.getContainer() instanceof Context) {
+ context = (Context) manager.getContainer();
+ }
+ if (context != null) {
+ threadBindingListener = context.getThreadBindingListener();
+ }
+ if (threadBindingListener == null) {
+ return;
+ }
+
+ if (Globals.IS_SECURITY_ENABLED) {
+ AccessController.doPrivileged(new PrivilegedUnbind(oldContextClassLoader, threadBindingListener));
+ } else {
+ threadBindingListener.unbind();
+ Thread.currentThread().setContextClassLoader(oldContextClassLoader);
+ }
+
+ }
+
+ protected class PrivilegedUnbind implements PrivilegedAction<Void> {
+ private ClassLoader oldContextClassLoader;
+ private ThreadBindingListener threadBindingListener;
+
+ PrivilegedUnbind(ClassLoader oldContextClassLoader, ThreadBindingListener threadBindingListener) {
+ this.oldContextClassLoader = oldContextClassLoader;
+ this.threadBindingListener = threadBindingListener;
+ }
+
+ public Void run() {
+ threadBindingListener.unbind();
+ Thread.currentThread().setContextClassLoader(oldContextClassLoader);
+ return null;
+ }
+ }
+
/**
* Logout the specified single sign on identifier from all sessions.
*
Property changes on: branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java:2405,2407
+ /branches/7.4.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java:2338,2405,2407
10 years, 9 months
JBossWeb SVN: r2437 - in branches/7.3.x: src/main/java/org/apache/tomcat/util/net and 1 other directory.
by jbossweb-commits@lists.jboss.org
Author: aogburn
Date: 2014-06-02 15:40:15 -0400 (Mon, 02 Jun 2014)
New Revision: 2437
Modified:
branches/7.3.x/
branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
Log:
[BZ-1103891] merge fix to JBWEB-297 NIO concurrency issue
Property changes on: branches/7.3.x
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x:2405
Modified: branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
===================================================================
--- branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java 2014-06-02 19:20:34 UTC (rev 2436)
+++ branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java 2014-06-02 19:40:15 UTC (rev 2437)
@@ -1031,8 +1031,14 @@
@Override
public void run() {
try {
- Handler.SocketState state = ((status == null) ? handler.process(channel) : handler
- .event(channel, status));
+ Handler.SocketState state = null;
+ if (status == null) {
+ state = handler.process(channel);
+ } else {
+ synchronized (channel) {
+ state = handler.event(channel, status);
+ }
+ }
if (state == SocketState.CLOSED) {
closeChannel(channel);
Property changes on: branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java:2407
+ /branches/7.4.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java:2405,2407
10 years, 9 months
JBossWeb SVN: r2436 - branches/7.3.x/src/main/java/org/apache/tomcat/util/net.
by jbossweb-commits@lists.jboss.org
Author: aogburn
Date: 2014-06-02 15:20:34 -0400 (Mon, 02 Jun 2014)
New Revision: 2436
Modified:
branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
Log:
[BZ-1097410] merge NIO EventPoller NPE fix
Modified: branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
===================================================================
--- branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java 2014-06-02 15:36:05 UTC (rev 2435)
+++ branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java 2014-06-02 19:20:34 UTC (rev 2436)
@@ -477,7 +477,7 @@
* successfully else <tt>false</tt>
*/
public boolean processChannel(NioChannel channel, SocketStatus status) {
- if (channel.isClosed()) {
+ if (channel == null || channel.isClosed()) {
return false;
}
try {
Property changes on: branches/7.3.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java:2407
10 years, 9 months
JBossWeb SVN: r2435 - branches/7.4.x/src/main/java/org/apache/coyote/http11.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2014-06-02 11:36:05 -0400 (Mon, 02 Jun 2014)
New Revision: 2435
Modified:
branches/7.4.x/src/main/java/org/apache/coyote/http11/AbstractInternalInputBuffer.java
branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalAprInputBuffer.java
branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java
branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioOutputBuffer.java
Log:
- BZ1103596: Does not fix the real cause, but avoid loop.
- Improve on notifications and input.
Modified: branches/7.4.x/src/main/java/org/apache/coyote/http11/AbstractInternalInputBuffer.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/coyote/http11/AbstractInternalInputBuffer.java 2014-05-30 14:36:37 UTC (rev 2434)
+++ branches/7.4.x/src/main/java/org/apache/coyote/http11/AbstractInternalInputBuffer.java 2014-06-02 15:36:05 UTC (rev 2435)
@@ -242,7 +242,7 @@
request.recycle();
// Copy leftover bytes to the beginning of the buffer
- if (lastValid - pos > 0) {
+ if (lastValid - pos > 0 && pos > 0) {
int npos = 0;
int opos = pos;
while (lastValid - opos > opos - npos) {
Modified: branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalAprInputBuffer.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalAprInputBuffer.java 2014-05-30 14:36:37 UTC (rev 2434)
+++ branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalAprInputBuffer.java 2014-06-02 15:36:05 UTC (rev 2435)
@@ -329,7 +329,7 @@
request.recycle();
// Copy leftover bytes to the beginning of the buffer
- if (lastValid - pos > 0) {
+ if (lastValid - pos > 0 && pos > 0) {
int npos = 0;
int opos = pos;
while (lastValid - opos > opos - npos) {
Modified: branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java 2014-05-30 14:36:37 UTC (rev 2434)
+++ branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioInputBuffer.java 2014-06-02 15:36:05 UTC (rev 2435)
@@ -129,7 +129,9 @@
bbuf.get(buf, pos, nBytes);
lastValid = pos + nBytes;
semaphore.release();
- if (!processor.isProcessing() && processor.getReadNotifications()) {
+ if (/*!processor.isProcessing() && */processor.getReadNotifications()
+ && available) {
+ available = false;
if (!endpoint.processChannel(attachment, SocketStatus.OPEN_READ)) {
endpoint.closeChannel(attachment);
}
@@ -430,26 +432,39 @@
// Reading from client
if (nonBlocking) {
if (semaphore.tryAcquire()) {
- // Prepare the internal input buffer for reading
- prepare();
- try {
- channel.read(bbuf, readTimeout, TimeUnit.MILLISECONDS, channel, this.completionHandler);
- } catch (Exception e) {
- processor.getResponse().setErrorException(e);
- if (CoyoteLogger.HTTP_LOGGER.isDebugEnabled()) {
- CoyoteLogger.HTTP_LOGGER.errorWithNonBlockingRead(e);
+ synchronized (completionHandler) {
+ // Prepare the internal input buffer for reading
+ prepare();
+ boolean available0 = available;
+ available = false;
+ try {
+ channel.read(bbuf, readTimeout, TimeUnit.MILLISECONDS, channel, this.completionHandler);
+ } catch (Exception e) {
+ processor.getResponse().setErrorException(e);
+ if (CoyoteLogger.HTTP_LOGGER.isDebugEnabled()) {
+ CoyoteLogger.HTTP_LOGGER.errorWithNonBlockingRead(e);
+ }
}
+ nRead = lastValid - pos;
+ if (nRead > 0) {
+ available = false;
+ } else {
+ available = available0;
+ }
}
- nRead = lastValid - pos;
- } else if (nRead == 0 && !available) {
- // If there's nothing and flow control is not used, autoblock
- try {
- if (semaphore.tryAcquire(readTimeout, unit))
- semaphore.release();
- } catch (InterruptedException e) {
- // Ignore
+ } else {
+ synchronized (completionHandler) {
+ if (nRead == 0 && !available) {
+ // If there's nothing and flow control is not used, autoblock
+ try {
+ if (semaphore.tryAcquire(readTimeout, unit))
+ semaphore.release();
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ nRead = lastValid - pos;
+ }
}
- nRead = lastValid - pos;
}
} else {
// Prepare the internal input buffer for reading
Modified: branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioOutputBuffer.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioOutputBuffer.java 2014-05-30 14:36:37 UTC (rev 2434)
+++ branches/7.4.x/src/main/java/org/apache/coyote/http11/InternalNioOutputBuffer.java 2014-06-02 15:36:05 UTC (rev 2435)
@@ -209,7 +209,7 @@
response.setLastWrite(nBytes);
leftover.recycle();
semaphore.release();
- if (!processor.isProcessing() && processor.getWriteNotification()) {
+ if (/*!processor.isProcessing() && */processor.getWriteNotification()) {
if (!endpoint.processChannel(attachment, SocketStatus.OPEN_WRITE)) {
endpoint.closeChannel(attachment);
}
@@ -822,6 +822,8 @@
int n = Math.min(leftover.getLength(), bbuf.capacity() - bbuf.position());
bbuf.put(leftover.getBuffer(), leftover.getOffset(), n).flip();
leftover.setOffset(leftover.getOffset() + n);
+ boolean writeNotification = processor.getWriteNotification();
+ processor.setWriteNotification(false);
try {
channel.write(bbuf, writeTimeout, TimeUnit.MILLISECONDS, channel, completionHandler);
} catch (Exception e) {
@@ -830,6 +832,10 @@
CoyoteLogger.HTTP_LOGGER.errorWithNonBlockingWrite(e);
}
}
+ if (writeNotification && bbuf.hasRemaining()) {
+ // Write did not complete inline, possible write notification
+ processor.setWriteNotification(writeNotification);
+ }
}
}
} else {
10 years, 9 months