Date: Fri, 27 Jun 2014 14:45:00 -0400 From: Jung-uk Kim <jkim@FreeBSD.org> To: Dawid Weiss <dawid.weiss@gmail.com>, freebsd-java@freebsd.org Subject: Re: A call to ServerSocketChannel.accept() cannot be interrupted. Message-ID: <53ADBBAC.6060207@FreeBSD.org> In-Reply-To: <53ACACC1.4020102@FreeBSD.org> References: <CAM21Rt9aqGbTjXQk7GZAdADJh2w=AiFJ4j1hMhtkXDz6LxUKeg@mail.gmail.com> <53ACACC1.4020102@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 2014-06-26 19:29:05 -0400, Jung-uk Kim wrote: 2014? 6? 26? 19:29, Jung-uk Kim ? ?:> On 2014-06-26 17:07:13 - -0400, Dawid Weiss wrote: >> Hi there, > >> I am an Apache Lucene committer. We've encountered a problem on >> one of our test machines and I wondered if it's something known. > >> The machine is: > >> FreeBSD 9.1-RELEASE-p3 FreeBSD 9.1-RELEASE-p3 #0 r250118: Tue >> Apr 30 22:06:26 UTC 2013 > >> running: > >> openjdk version "1.7.0_60" OpenJDK Runtime Environment (build >> 1.7.0_60-b19) OpenJDK 64-Bit Server VM (build 24.60-b09, mixed >> mode) > >> The problem is actually with Jetty; it creates a connector with a >> thread pool, where each thread calls a blocking >> ServerSocketChannel#accept(). Once you close the pool it >> attempts to terminate those threads and fails to do so -- and >> indeed, you can't break out from accept, not via interrupt(), not >> via closing the acquired ServerSocketChannel. The documentation >> of accept() states ClosedByInterruptException should be thrown if >> the thread is interrupted and indeed, this is the behavior on >> Linux and Windows. > >> A test case and more verbose problem description is here: >> https://issues.apache.org/jira/browse/SOLR-6204 > >>> From what I've diagnosed so far this seems to be an incomplete >> implementation problem. ServerSocketChannel attempts to signal >> the thread waiting on the socket (on Linux) via >> NativeThread.java, but in the native code (the only one I could >> find in ports) it's defined as: > >> JNIEXPORT jlong JNICALL >> Java_sun_nio_ch_NativeThread_current(JNIEnv *env, jclass cl) { >> #ifdef __linux__ return (long)pthread_self(); #else return -1; >> #endif } > >> JNIEXPORT void JNICALL >> Java_sun_nio_ch_NativeThread_signal(JNIEnv *env, jclass cl, jlong >> thread) { #ifdef __linux__ if (pthread_kill((pthread_t)thread, >> INTERRUPT_SIGNAL)) JNU_ThrowIOExceptionWithLastError(env, "Thread >> signal failed"); #endif > >> Which would indicate a no-op call. And indeed, I recompiled >> ServerSocketChannel with some debugging sysouts and the >> NativeThread.current() call returns -1. > >> Thoughts? > > Can you please try this patch? > > https://svn.redports.org/jkim/java/openjdk7/files/patch-src-solaris-native-sun-nio-ch-NativeThread.c I > just committed it. http://svnweb.freebsd.org/changeset/ports/359595 At least, it passed your test case in the PR. ;-) Thanks! Jung-uk Kim -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBAgAGBQJTrburAAoJEHyflib82/FGok8H/3Q4uTaQD76zQct7cQSkL6xH me42dXU4SgM6sH+VWBPqyi0ZMxvcYPyf4lx3tZSgM6CO9EeC8GEVBUq7w8X8ciQw xyIRwOyO3YcaQYJ3b4E6kO55ybRGbfIH+/ZTHwQ8nRVya3s1ZF6jnUKdWypz19h8 9EqqARhIf2g5LqzFR73QibhdMtDlwRe6+pXxv6WaHVijhVmy4wbVC6f8aAyxPycs cmGeVnRQa+0pqZGFsbh62HS/7yEW8PrqNC2D0OunwA/hWQwopFOc7QbW0gzTYPv/ 74j1krlSpbgxo1LATVUsvpLbVQcIwcFtj0eMfslVmCg9FtZUl52Q2sVA68FAGyU= =amiL -----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53ADBBAC.6060207>