[jboss-jira] [JBoss JIRA] (AS7-3834) Socket bind for JIoEndpoint fails on shutdown when using link-local IPv6 address
Richard Achmatowicz (JIRA)
jira-events at lists.jboss.org
Mon Feb 20 19:02:36 EST 2012
[ https://issues.jboss.org/browse/AS7-3834?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12669382#comment-12669382 ]
Richard Achmatowicz edited comment on AS7-3834 at 2/20/12 7:02 PM:
-------------------------------------------------------------------
The culprit seems to be in JIoEndpoint.java which tries to open up a client side socket using the link-local address untouched. The code blocks on the socket call when address != null:
{noformat}
/**
* Unlock the accept by using a local connection.
*/
protected void unlockAccept() {
Socket s = null;
try {
// Need to create a connection to unlock the accept();
if (address == null) {
s = new Socket("localhost", port);
} else {
s = new Socket(address, port);
// setting soLinger to a small value will help shutdown the
// connection quicker
s.setSoLinger(true, 0);
}
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("endpoint.debug.unlock", "" + port), e);
}
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
// Ignore
}
}
}
}
{noformat}
was (Author: rachmato):
The culprit is in JIoEndpoint.java which tries to open up a client side socket using the link-local address untouched. The code blocks on the socket call when address != null:
{noformat}
/**
* Unlock the accept by using a local connection.
*/
protected void unlockAccept() {
Socket s = null;
try {
// Need to create a connection to unlock the accept();
if (address == null) {
s = new Socket("localhost", port);
} else {
s = new Socket(address, port);
// setting soLinger to a small value will help shutdown the
// connection quicker
s.setSoLinger(true, 0);
}
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("endpoint.debug.unlock", "" + port), e);
}
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
// Ignore
}
}
}
}
{noformat}
> Socket bind for JIoEndpoint fails on shutdown when using link-local IPv6 address
> --------------------------------------------------------------------------------
>
> Key: AS7-3834
> URL: https://issues.jboss.org/browse/AS7-3834
> Project: Application Server 7
> Issue Type: Bug
> Components: Web
> Affects Versions: 7.1.0.Final
> Environment: Fedora 14
> Reporter: Richard Achmatowicz
> Assignee: Mladen Turk
>
> Start AS 7.1.0.Final with a link local IPv6 address, *specifying* the numeric zone id:
> {noformat}
> [nrla at lenovo ~]$ /sbin/ifconfig
> eth0 Link encap:Ethernet HWaddr F0:DE:F1:40:75:B8
> inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0
> inet6 addr: fe80::f2de:f1ff:fe40:75b8/64 Scope:Link
> inet6 addr: 3ffe:ffff:100:f101::1/64 Scope:Global
> [nrla at lenovo ~]$ ./standalone.sh -Djboss.bind.address=fe80::f2de:f1ff:fe40:75b8%2 -Djboss.bind.address.management=fe80::f2de:f1ff:fe40:75b8%2
> {noformat}
> The server starts up correctly, but it hangs when shutting down:
> {noformat}
> 18:49:20,854 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss AS 7.1.1.Final-SNAPSHOT "Thunder" started in 2169ms - Started 136 of 207 services (70 services are passive or on-demand)
> ^C18:49:22,489 INFO [org.jboss.as.logging] JBAS011503: Restored bootstrap log handlers
> 18:49:22,489 INFO [org.apache.catalina.core.StandardContext] Container org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/] has not been started
> 18:49:22,492 INFO [com.arjuna.ats.jbossatx] ARJUNA032018: Destroying TransactionManagerService
> 18:49:22,493 INFO [com.arjuna.ats.jbossatx] ARJUNA032014: Stopping transaction recovery manager
> [stops here]
> {noformat}
> A stack trace shows that a thread in org.apache.coyote.http11.Http11Protocol is trying to open a socket (as a client) using the link local address:
> {noformat}
> 2012-02-20 18:51:12
> Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode):
> "MSC Shutdown Thread" prio=10 tid=0x00007f32546b0800 nid=0x732b waiting on condition [0x00007f323aeed000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000f6fd9d70> (a java.util.concurrent.CountDownLatch$Sync)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
> at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:207)
> at org.jboss.msc.service.ServiceContainerImpl$ShutdownHookHolder$1$1.run(ServiceContainerImpl.java:129)
> at java.lang.Thread.run(Thread.java:662)
> "SIGINT handler" daemon prio=10 tid=0x00007f3294001800 nid=0x7328 in Object.wait() [0x00007f32bdae3000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000e032d850> (a java.lang.Thread)
> at java.lang.Thread.join(Thread.java:1186)
> - locked <0x00000000e032d850> (a java.lang.Thread)
> at java.lang.Thread.join(Thread.java:1239)
> at java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:79)
> at java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:24)
> at java.lang.Shutdown.runHooks(Shutdown.java:79)
> at java.lang.Shutdown.sequence(Shutdown.java:123)
> at java.lang.Shutdown.exit(Shutdown.java:168)
> - locked <0x00000000d0711640> (a java.lang.Class for java.lang.Shutdown)
> at java.lang.Terminator$1.handle(Terminator.java:35)
> at sun.misc.Signal$1.run(Signal.java:195)
> at java.lang.Thread.run(Thread.java:662)
> "Transaction Reaper Worker 0" daemon prio=10 tid=0x00007f3270150800 nid=0x7327 in Object.wait() [0x00007f323b1f0000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000f696a560> (a java.util.LinkedList)
> at java.lang.Object.wait(Object.java:485)
> at com.arjuna.ats.arjuna.coordinator.TransactionReaper.waitForCancellations(TransactionReaper.java:321)
> - locked <0x00000000f696a560> (a java.util.LinkedList)
> at com.arjuna.ats.internal.arjuna.coordinator.ReaperWorkerThread.run(ReaperWorkerThread.java:65)
> "Transaction Reaper" daemon prio=10 tid=0x00007f3270111800 nid=0x7326 in Object.wait() [0x00007f323b2f1000]
> java.lang.Thread.State: TIMED_WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000f69662d0> (a com.arjuna.ats.arjuna.coordinator.TransactionReaper)
> at com.arjuna.ats.internal.arjuna.coordinator.ReaperThread.run(ReaperThread.java:90)
> - locked <0x00000000f69662d0> (a com.arjuna.ats.arjuna.coordinator.TransactionReaper)
> "http--fe80%3A0%3A0%3A0%3Af2de%3Af1ff%3Afe40%3A75b8%252-8080-Acceptor-0" daemon prio=10 tid=0x00007f3278019800 nid=0x731f runnable [0x00007f323b9f8000]
> java.lang.Thread.State: RUNNABLE
> at java.net.PlainSocketImpl.socketAccept(Native Method)
> at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
> - locked <0x00000000f99ebda8> (a java.net.SocksSocketImpl)
> at java.net.ServerSocket.implAccept(ServerSocket.java:462)
> at java.net.ServerSocket.accept(ServerSocket.java:430)
> at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
> at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:322)
> at java.lang.Thread.run(Thread.java:662)
> "http--fe80%3A0%3A0%3A0%3Af2de%3Af1ff%3Afe40%3A75b8%252-8080-Poller" daemon prio=10 tid=0x00007f3278016000 nid=0x731d in Object.wait() [0x00007f323bbfa000]
> java.lang.Thread.State: TIMED_WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000f9917300> (a org.apache.tomcat.util.net.JIoEndpoint$Poller)
> at org.apache.tomcat.util.net.JIoEndpoint$Poller.run(JIoEndpoint.java:743)
> - locked <0x00000000f9917300> (a org.apache.tomcat.util.net.JIoEndpoint$Poller)
> at java.lang.Thread.run(Thread.java:662)
> "ContainerBackgroundProcessor[StandardEngine[jboss.web]]" daemon prio=10 tid=0x00007f3274098000 nid=0x731c waiting on condition [0x00007f323bcfb000]
> java.lang.Thread.State: TIMED_WAITING (sleeping)
> at java.lang.Thread.sleep(Native Method)
> at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1579)
> at java.lang.Thread.run(Thread.java:662)
> "DestroyJavaVM" prio=10 tid=0x00007f32c4007800 nid=0x72cd waiting on condition [0x0000000000000000]
> java.lang.Thread.State: RUNNABLE
> "MSC service thread 1-8" prio=10 tid=0x00007f327003f000 nid=0x72e3 waiting on condition [0x00007f32bdcfb000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-7" prio=10 tid=0x00007f327003d800 nid=0x72e2 waiting on condition [0x00007f32bddfc000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-6" prio=10 tid=0x00007f327003d000 nid=0x72e1 waiting on condition [0x00007f32bdefd000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-5" prio=10 tid=0x00007f327001b800 nid=0x72e0 runnable [0x00007f32bdffd000]
> java.lang.Thread.State: RUNNABLE
> at java.net.PlainSocketImpl.socketConnect(Native Method)
> at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
> - locked <0x00000000f5715910> (a java.net.SocksSocketImpl)
> at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
> at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
> at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
> at java.net.Socket.connect(Socket.java:529)
> at java.net.Socket.connect(Socket.java:478)
> at java.net.Socket.<init>(Socket.java:375)
> at java.net.Socket.<init>(Socket.java:218)
> at org.apache.tomcat.util.net.JIoEndpoint.unlockAccept(JIoEndpoint.java:1094)
> at org.apache.tomcat.util.net.JIoEndpoint.pause(JIoEndpoint.java:1032)
> at org.apache.coyote.http11.Http11Protocol.pause(Http11Protocol.java:229)
> at org.apache.catalina.connector.Connector.pause(Connector.java:998)
> at org.jboss.as.web.WebConnectorService.stop(WebConnectorService.java:285)
> - locked <0x00000000e0500760> (a org.jboss.as.web.WebConnectorService)
> at org.jboss.msc.service.ServiceControllerImpl$StopTask.stopService(ServiceControllerImpl.java:1911)
> at org.jboss.msc.service.ServiceControllerImpl$StopTask.run(ServiceControllerImpl.java:1874)
> at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-4" prio=10 tid=0x00007f32c4455000 nid=0x72df waiting on condition [0x00007f32c81ff000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-3" prio=10 tid=0x00007f32c4451800 nid=0x72de waiting on condition [0x00007f32c8300000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-2" prio=10 tid=0x00007f3274001000 nid=0x72dd waiting on condition [0x00007f32c8401000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "MSC service thread 1-1" prio=10 tid=0x00007f32c4450000 nid=0x72dc waiting on condition [0x00007f32c8502000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000e028dae8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:662)
> "Reference Reaper" daemon prio=10 tid=0x00007f32c418f800 nid=0x72db in Object.wait() [0x00007f32c87da000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000f9844b40> (a java.lang.ref.ReferenceQueue$Lock)
> at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
> - locked <0x00000000f9844b40> (a java.lang.ref.ReferenceQueue$Lock)
> at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
> at org.jboss.modules.ref.References$ReaperThread.run(References.java:68)
> "Low Memory Detector" daemon prio=10 tid=0x00007f32c40bb000 nid=0x72d9 runnable [0x0000000000000000]
> java.lang.Thread.State: RUNNABLE
> "C1 CompilerThread2" daemon prio=10 tid=0x00007f32c40b8800 nid=0x72d8 waiting on condition [0x0000000000000000]
> java.lang.Thread.State: RUNNABLE
> "C2 CompilerThread1" daemon prio=10 tid=0x00007f32c40b6800 nid=0x72d7 waiting on condition [0x0000000000000000]
> java.lang.Thread.State: RUNNABLE
> "C2 CompilerThread0" daemon prio=10 tid=0x00007f32c40b3800 nid=0x72d6 waiting on condition [0x0000000000000000]
> java.lang.Thread.State: RUNNABLE
> "Signal Dispatcher" daemon prio=10 tid=0x00007f32c40b1800 nid=0x72d5 waiting on condition [0x0000000000000000]
> java.lang.Thread.State: RUNNABLE
> "Finalizer" daemon prio=10 tid=0x00007f32c4095000 nid=0x72d4 in Object.wait() [0x00007f32c8ee1000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000e00b24e8> (a java.lang.ref.ReferenceQueue$Lock)
> at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
> - locked <0x00000000e00b24e8> (a java.lang.ref.ReferenceQueue$Lock)
> at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
> at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
> "Reference Handler" daemon prio=10 tid=0x00007f32c4093000 nid=0x72d3 in Object.wait() [0x00007f32c8fe2000]
> java.lang.Thread.State: WAITING (on object monitor)
> at java.lang.Object.wait(Native Method)
> - waiting on <0x00000000e0098510> (a java.lang.ref.Reference$Lock)
> at java.lang.Object.wait(Object.java:485)
> at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
> - locked <0x00000000e0098510> (a java.lang.ref.Reference$Lock)
> "VM Thread" prio=10 tid=0x00007f32c408c800 nid=0x72d2 runnable
> "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f32c401a800 nid=0x72ce runnable
> "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f32c401c800 nid=0x72cf runnable
> "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f32c401e000 nid=0x72d0 runnable
> "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f32c4020000 nid=0x72d1 runnable
> "VM Periodic Task Thread" prio=10 tid=0x00007f32c40ce000 nid=0x72da waiting on condition
> JNI global references: 1478
> Heap
> PSYoungGen total 68480K, used 31452K [0x00000000f5560000, 0x00000000f9ae0000, 0x0000000100000000)
> eden space 65792K, 43% used [0x00000000f5560000,0x00000000f717e540,0x00000000f95a0000)
> from space 2688K, 98% used [0x00000000f9840000,0x00000000f9ad8c98,0x00000000f9ae0000)
> to space 2688K, 0% used [0x00000000f95a0000,0x00000000f95a0000,0x00000000f9840000)
> PSOldGen total 43712K, used 8146K [0x00000000e0000000, 0x00000000e2ab0000, 0x00000000f5560000)
> object space 43712K, 18% used [0x00000000e0000000,0x00000000e07f4a68,0x00000000e2ab0000)
> PSPermGen total 42368K, used 42286K [0x00000000d0000000, 0x00000000d2960000, 0x00000000e0000000)
> object space 42368K, 99% used [0x00000000d0000000,0x00000000d294ba58,0x00000000d2960000)
> {noformat}
> When opening a link-local address as a client, the zoneid must be first removed. The zoneid is only required when opening a server socket, IIUC.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list