Le 24/06/16 à 13:10, Alexander Christian a écrit : > Hi there, > > I developed an RPC library called "SIMON", based on Apache MINA > 2.0.13, using ProtocolCodecFactory. This is working fine since many > years now. > > Today I faced an issue, which I - at the moment - would say is caused > by MINA. I'll try to explain:
First, what has changed recently ? Java version ? Faster computer ? > > After running the problematic example code that makes use of my lib, > it takes some time until client AND server prints the following message: > > ----- > M�r 17, 2016 3:52:31 PM > org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor run > WARNUNG: Create a new selector. Selected is 0, delta = 0 This is a workaround. at some point, dur to a bug in the JVM, the select() call returns immediately but with 0 selected keys. Obviously, that will loop consuming 100% CPU. In this case, we simply ditch the selector, recreate a new one and register all the selectionKeys to this new selector. One user has suggested that it *may* happen when you have reached the maximum open files. Can you check that ? > ----- > > > The longer the application runs, the more often (maybe just a feeling) > this messages is logged. And the more ofthen this message is logged, > the closer we're getting to this exception: > > SCHWERWIEGEND: exception Caught. thread=NioProcessor-2 > session=0x00000001. Exception: > org.apache.mina.filter.codec.ProtocolDecoderException: No > appropriate message decoder: 00 00 00 02 00 00 00 36 AC ED 00 <a lot > more bytes>) > at > org.apache.mina.filter.codec.demux.DemuxingProtocolDecoder.doDecode(DemuxingProtocolDecoder.java:176) > at > org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:176) > at > org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:230) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943) > at > org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) > at > org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:535) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:697) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:651) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:640) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) > at > org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1097) > at > org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) > > This is what the example application does: > > // send a "LOOKUP" Message to the server, which responds with a > "LOOPUK_RETURN" message > remoteHandler = (Handler) > nameLookup.lookup(Handler.class.getCanonicalName()); > > ----------------- > for (;;) { > // This sends a single message to the server ("INVOKE"). > // The server executes the requested method (trigger()) > // The trigger() method will send a single message (which > get's answered by client), 100 messages with an delay of 1..100ms > between each (also answered by client) and another single message to > the client (also answered by client). In sum 102 messages > server->client and 102 answers client->server. > // After that, the remotly invoked method returns and server > sends an messages back to the client, before the method returns an > "INVOKE_RETURN" message to the client > remoteHandler.trigger(monitor, System.currentTimeMillis()); > > Thread.sleep(100); > } > ------------------- > > The longer the sleep times on client and in trigger() method on server > is, the longer it takes to get this MINA messages and the longer it > takes until the exception occurs. > > Of course it would be great to have an simple reproducer-example > without the code-overhead with my lib and this error producing sample > application. But I was not yet abe to track down the problem to create > such a simple, minimalistic reproducer. > > My current thoughts: > > 1) I figured out, that the message logged by MINA is related to an > selector() issue. In that case, the selector is dropped and replaced > with a new one. For me it looks like there is an sync-issue with > creating this new instance. That could confuse the stream, so that a > few bytes are missing and the codec cannot continue it's work. But I > did not find this kind of sync-gap... I woudl say, unlikely. The select() is waken up ony when some event to be handled. In this case, the select() woudl return something different than 0. > > 2) The reported message is ALWAYS the same. At least the first 15 > bytes are always the same. At this point, I would question the decoder. > > 3) The issue does not always happen at the same time. It really differs. Well, MINA is fully asynchronous, so you can't expect to behave in a deterministic way. > > 4) If I skip the 100 messages from server back to client while > invoking the remote method, the issue is gone. Again, check teh decoder, or the encoder. > > 5) But in general, this is not a problem. I have tons of code using > this mechanism without any issue. But the timing is different... > > 6) Tested with MINA 2.0.9, 2.0.13 as well as with Win7/64bit/Java8 and > Ubuntu Linux, also with Java8. I would need teh code, or at least a complete description of the protocol. > > > > I would be very glad if someone can give me a hint... > If someone wants to debug this: I can give you an example project that > uses my library (which uses MINA2.0.13). Okie. That would probably be a good idea, because here, it's like pulling information out of thin air...