Re: re : Server Crash
I retract my previous statement after pulling the source for CircularQueue. Guess I'm used to doing illegal things in Java I forget that most code isn't like that. On Thu, Apr 27, 2017 at 8:38 AM, Jon V. <sybersn...@gmail.com> wrote: > It looks like a Mina crash to me. Probably some kind of Unsafe access. > > Can you tell us the exact version of Mina? > > On Thu, Apr 27, 2017 at 8:20 AM, Emmanuel Lécharny <elecha...@gmail.com> > wrote: > >> Hi ! >> >> >> seems like I have hard time moderating your message to the users >> mailinglist... Never mind. here is a copy : >> >> >> > We have a standalone application. It crashed suddenly. The log contains >> a >> > class which is found in mina-core jar file. I have attached the crash >> > report. Please let me know if you could find out any root cause for the >> > crash. Thank you. server_crash_report.txt >> > >> <http://apache-mina.10907.n7.nabble.com/file/n52619/server_c >> rash_report.txt> >> >> First of all, this is a JVM crash, not a MINA crash The fact that the >> crash occurred while the exacution was in a mina call is incidental. >> >> I would strongly to switch to a more recent version of Java, the one you >> use is quite antiquated and not supported anymore (4 years old, the last >> supported Java 6 version from Oracle, which has issued 16 released for Java >> 6). >> >> Java 8 is the current version, Java 7 has been EOLed 2 years ago. >> >> >> -- >> Emmanuel Lecharny >> >> Symas.com >> directory.apache.org >> >> >
Re: Why are high ports used by SFTP server implementation?
I’ll try to simplify; TCP (the protocol) can have up to 0x ports or 65535 Ports only need to be reserved for server services and outbound connections. They both use the same pool size of 65535. Each OS type allocates different range for user-space applications. For linux its around 32768 ports. When creating outbound connections the OS will randomly select an unused port. This is this high port number. A connected TCP socket looks like this: local:45223 (ephemeral) <-> remote:22 (fixed) What you are seeing is the port number of the client. That number is allocated on their machine and not the server. Look up TCP on Wikipedia. On Tue, Feb 23, 2016 at 8:52 PM, David Hofferwrote: > Hum, that's not entirely clear to me. The first link says... > > 'A TCP/IPv4 connection consists of two endpoints, and each endpoint > consists of an IP address and a port number. Therefore, when a client user > connects to a server computer, an established connection can be thought of > as the 4-tuple of (server IP, server port, client IP, client port). > Usually three of the four are readily known -- client machine uses its own > IP address and when connecting to a remote service, the server machine's IP > address and service port number are required. > > What is not immediately evident is that when a connection is established > that the client side of the connection uses a port number. Unless a client > program explicitly requests a specific port number, the port number used is > an *ephemeral* port number. Ephemeral ports are temporary ports assigned > by a machine's IP stack, and are assigned from a designated range of ports > for this purpose. > In our case the server is configured to listen on port 22 and the client > connects to port 22 so isn't that fixing the port on both sides at port > 22? Are you saying that although port 22 is the logical port used on both > systems, that in reality a different port is used on the client to connect > to the server? We are using SSH only here I understand that only used port > 22. > > Regarding the second link is that for FTP or also for SFTP? I know FTP > uses passive ports and so does FTPS but we are only using SFTP, e.g. file > transfer as part of SSH. > > Do those links really describe my situation? Or are those high ports > created on the server so it can hand off work so it can listen on 22 > again? E.g. is it using separate ports to communicate with clients instead > of multiple threads on same port? > > Its not clear to me yet, trying to understand. > > -Dave > > > > > On Tue, Feb 23, 2016 at 4:32 PM, Chad Beaulac wrote: > > > Hey Dave, > > > > Listener servers hand off to ephemeral ports. > > http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html > > You need ephemeral ports so a server can start listening on port 22 again > > while something else is happening. > > > > Look here for some configuration options. > > > https://mina.apache.org/ftpserver-project/configuration_passive_ports.html > > > > -Chad > > > > > > On Tue, Feb 23, 2016 at 3:09 PM, David Hoffer > wrote: > > > > > We are using SSHD in an application to create an embedded SFTP server > > which > > > works fine. Our clients connect on port 22 and we don't have any issue > > > with that. > > > > > > The problem/question is that our IA folks are complaining that our app > > also > > > listens on what appear to be random high ports. E.g. I see this in our > > > logs. > > > > > > Session username@/127.0.0.1:58118 authenticated > > > Server session created from /127.0.0.1:58132 > > > Server session created from /127.0.0.1:58139 > > > Server session created from /127.0.0.1:58157 > > > > > > I see these later log statements are coming from IoSession in > > > ServerSessionImpl but I don't call this in my code so must be part of > the > > > SSHD/MINA framework. > > > > > > Why are these high ports being used and do we need them? If not needed > > for > > > SFTP server how can I disable? If they are needed, why and can I > control > > > the exact ports that are used? > > > > > > -Dave > > > > > >
Re: one question with max connections
Probably creating the connections too quickly? make the TCP backlog larger. Default is 10 I believe; I use 100 in production. On Wed, Feb 17, 2016 at 6:44 AM, Liu, Li (Nokia - CN/Hangzhou) < li@nokia.com> wrote: > Hi Mina > > I try to use Mina to handle multiple TCP’s connections > > But there are some connections that cannot be handled by Mina under lots > of connections was opened as below : > Eg, I try to open 400 TCP’s connections, there are always losing 4 or 5 > connections > > > > [root@twslave2 test]# netstat -natp | grep 62397 > tcp *22* 0 :::10.70.81.114:65534 ::: > 10.70.81.106:62397 ESTABLISHED - > [root@twslave2 test]# netstat -natp | grep 62398 > tcp 22 0 :::10.70.81.114:65534 :::10.70.81.106:62398 > ESTABLISHED - > [root@twslave2 test]# netstat -natp | grep 62399 > tcp 22 0 :::10.70.81.114:65534 :::10.70.81.106:62399 > ESTABLISHED - > [root@twslave2 test]# netstat -natp | grep 62400 > tcp 22 0 :::10.70.81.114:65534 :::10.70.81.106:62400 > ESTABLISHED - > [root@twslave2 test]# netstat -natp | grep 62401 > tcp 22 0 :::10.70.81.114:65534 :::10.70.81.106:62401 > ESTABLISHED - > [root@twslave2 test]# netstat -natp | grep 62396 > tcp0 0 :::10.70.81.114:65534 :::10.70.81.106:62396 > * ESTABLISHED 12152/java* > [root@twslave2 test]# > > Can you tell me why? > >
Re: Deadlock when using SslFilter and ProxyFilter together
I would have thought the reason SSL Filter needs to be before Proxy is because the SSL handshaking from the client side would get proxied away from the SSL Filter. On Wed, Feb 10, 2016 at 12:57 PM, Emmanuel Lécharnywrote: > Le 10/02/16 18:16, Norbert Irmer a écrit : > >> Ok, but you can insert teh SslFilter *before* the proxyFilter. Once you > >> get the ProxyConnector instance, get the connector and do : > > > > Well, I am using a patched QuickFixJ version, in which the control flow > is a bit different. > > > > Here is an excerpt from the code they are using: > > > > > > CompositeIoFilterChainBuilder ioFilterChainBuilder = new > CompositeIoFilterChainBuilder( > > userIoFilterChainBuilder); > > > > boolean useProxy = proxyType != null && proxyPort > 0 && > > socketAddresses[0] instanceof > InetSocketAddress; > > > > > > SslFilter sslFilter = null; > > if (sslEnabled) { > > boolean autoStart = !useProxy; > > sslFilter = installSslFilter(ioFilterChainBuilder, > autoStart); > > } > > > > > ioFilterChainBuilder.addLast(FIXProtocolCodecFactory.FILTER_NAME, > > new ProtocolCodecFilter(new > FIXProtocolCodecFactory())); > > > > if (useProxy) { > > SocketConnector socketConnector = new > NioSocketConnector(); > > > socketConnector.setFilterChainBuilder(ioFilterChainBuilder); > > ioConnector = ProtocolFactory.createIoProxyConnector( > socketConnector, > > (InetSocketAddress) socketAddresses[0], new > InetSocketAddress(proxyHost, > > proxyPort), proxyType, proxyVersion, > proxyUser, proxyPassword, > > proxyDomain, proxyWorkstation); > > } else { > > ioConnector = > ProtocolFactory.createIoConnector(socketAddresses[0]); > > ioConnector.setFilterChainBuilder(ioFilterChainBuilder); > > } > > > > ioHandler = new InitiatorIoHandler(fixSession, sslFilter, > networkingOptions, eventHandlingStrategy); > > } > > > > private SslFilter installSslFilter(CompositeIoFilterChainBuilder > ioFilterChainBuilder, > >boolean autoStart) > > throws GeneralSecurityException { > > SslFilter sslFilter = new > SslFilter(SSLContextFactory.getInstance(keyStoreName, > > keyStorePassword.toCharArray()), autoStart); > > if (enableProtocole != null) > > sslFilter.setEnabledProtocols(enableProtocole); > > if (cipherSuites != null) > > sslFilter.setEnabledCipherSuites(cipherSuites); > > sslFilter.setUseClientMode(true); > > ioFilterChainBuilder.addLast(SSLSupport.FILTER_NAME, > sslFilter); > > return sslFilter; > > } > > > > > > Sure, with a lot of time, I could possibly rewrite the code, to swap the > positions of the filters in the filterchain. > > > > But I see little sense in it, since the code is working. The only > problem I have, is that I get this deadlock after a few minutes or so. > How can you say the code is working when you get a deadlock ? > > As Jon said, having the ProcyFilter *before* the SSLFilter in the chain > is not the right thing. The reason being that you may perfectly get > fragmented TCP buffers, and the proxy might not be able to deal with > de-fragmentation when it comes to encrypted data. > > I suggest that you patch teh code to first call the installSslFilter > method after the proxy has been created, and in the > installSslFiltermethod, use addFirst() instead of addLast(). > > Otherwise, you can also check with the latest trunk revision I built > today to see if it's any better (on http://people.apache.org/~elecharny) > >
Re: Deadlock when using SslFilter and ProxyFilter together
Its my understanding that Read and Write operations are thread-safe and should never cause deadlocks. (not sure why there are locks in those filters) Also, I don’t think SSL should be after Proxy. You cannot initiate an SSL session if you proxy the setup routine. What is the goal in this setup? Please send us the deadlock thread trace.(You can get it from VisualVM) On Tue, Feb 9, 2016 at 11:59 AM, Norbert Irmerwrote: > Hello, > > I detected a deadlock when using Proxies and Ssl together. > > The SslFilter and the ProxyFilzter both have synchronized blocks, and when > sending > and receiving messages you get deadlocks. > > The SslFilter hangs in "sslLock.lock()" in > "SslHandler.flushScheduledEvents()", > while the ProxyFilter hangs in "synchronized(handler)" in > "ProxyFilter.writeData". > > That sending and receiving messages with both filters simultaneously leads > to a deadlock > is clear, since both filters have locks and data flow direction is > reversed when reading and writing: > > Read direction: Socket --> ProxyFilter ---> SslFilter --> > FixProtocol --> Application > Write direction: Socket <-- ProxyFilter <--- SslFilter <-- > FixProtocol <-- Application > > > >
Re: Can we get message attempted to write
After the message is converted to ByteBuffer is the WriteRequest triggered or it a child WriteRequest created for the ByteBuffer? That would define if this kind of callback would be possible. On Tue, Feb 2, 2016 at 7:35 AM, Emmanuel Lécharnywrote: > Le 02/02/16 12:10, Abhijit Bhatode a écrit : > > Hi, > > > > We are using MINA 2.0 M1. > You should switch to 2.0.11 which has been released last wek... 2.0.0-M1 > is 8 years old ! > > > Is there a way to get details of message when an > > exception occurs during write? > > It depends... > > There are many potential exception you can get, and I suspect you wnat > to get some information in the exceptionCaught() method in your IoHandler. > > If you are lucky, the message is still in the write queue. You can get > it by using : > > WriteRequest writeRequest = session.getWriteRequestQueue().poll( > session ); > > if (writeRequest != null) { > Object message = writeRequest.getMessage(); > } > > Otherwise, check the cause. > > One other possibility is to store in your session the messages that you > are sending before writing them, and in the exceptionCaught() method, > you can most certainly check on the session to see what is the message > that was the cause. This is, again, not guaranteed, because you may have > many messages waiting to be sent when you get the exception. > > > Keep in mind that this is asynchonous, so the exceptionCaught event can > be received way after you tried to write a message. > > Last, not least, you will receive a messageSent() event for every single > message that has successfully sent. You can also use this information to > detect what is the message causing the problem. > > > In any case, as I said, there are many reson why you would receive an > exception, and a lot of them might be totally disconnect to the fact > that you tried to write a message. > > > Wht is your use case ? > > >
Re: SslFilter with autoStart=false
I understand the tendency for defensive style design. Auto start option should probably be removed from the SSL Filter. If OP wishes to construct the chain at Open() time then calling SSL Filter.open() manually should initiate the handshake. @Override public void proxySessionOpened(IoSession session) throws Exception { log.info("proxySessionOpened called"); if (sslFilter != null) { IoFilter.NextFilter nextFilter = session.getFilterChain(). getNextFilter(sslFilter); sslFilter.sessionOpened(next, session) } } This seems to me more like a fundamental flow problem of filter modifications than a design issue with SSL filter. On Thu, Jan 28, 2016 at 10:45 AM, Emmanuel Lécharny <elecha...@gmail.com> wrote: > Le 28/01/16 15:37, Jon V. a écrit : > > Sorry, I hit enter and my email sent. > > > > IoFilterChain filterChain = session.getFilterChain(); > > > > if (filterChain == null) { > > throw new SSLException("No filter chain"); > > } > > > > > > This isn’t necessary. I think we need to know more about OPs goals > before > > adding hacky workarounds. > > Hmm, yeah, it's probably over-protective. > > With respect to such check, I should first have added a if (session == > null), and not having such a check makes teh second check a bit spurious. > > We can drop it and only have : > > public void initiateHandshake(IoSession session) throws SSLException { > IoFilter.NextFilter nextFilter = > session.getFilterChain().getNextFilter(SslFilter.class); > > if (nextFilter == null) { > throw new SSLException("No SSL next filter in the chain"); > } > > initiateHandshake(nextFilter, session); > } > > For teh same reason, I don't see any use case where we can't have a > nextFilter, so the if (nextFilter == null) is also spurious. > > > I may have been hit too many times by pervasive NPE, and I try to catch > them before they happen... >
Re: SslFilter with autoStart=false
Sounds to me like someone has a secondary filterchain they are trying to prime artificially. So then maybe this isn’t necessary? On Thu, Jan 28, 2016 at 9:34 AM, Emmanuel Lécharny <elecha...@gmail.com> wrote: > Le 28/01/16 15:30, Jon V. a écrit : > > In what scenario would the SSL filter be attached but the session has no > > filterchain > > None that I know. > > It would not make any sense. >
Re: SslFilter with autoStart=false
Sorry, I hit enter and my email sent. IoFilterChain filterChain = session.getFilterChain(); if (filterChain == null) { throw new SSLException("No filter chain"); } This isn’t necessary. I think we need to know more about OPs goals before adding hacky workarounds. On Thu, Jan 28, 2016 at 9:37 AM, Jon V. <sybersn...@gmail.com> wrote: > Sounds to me like someone has a secondary filterchain they are trying to > prime artificially. > > So then maybe this isn’t necessary? > > > > On Thu, Jan 28, 2016 at 9:34 AM, Emmanuel Lécharny <elecha...@gmail.com> > wrote: > >> Le 28/01/16 15:30, Jon V. a écrit : >> > In what scenario would the SSL filter be attached but the session has no >> > filterchain >> >> None that I know. >> >> It would not make any sense. >> > >
Re: SslFilter with autoStart=false
In what scenario would the SSL filter be attached but the session has no filterchain On Thu, Jan 28, 2016 at 7:40 AM, Emmanuel Lécharnywrote: > Le 28/01/16 13:33, Norbert Irmer a écrit : > > Your idea, adding a method "public void initiateHandshake(IoSession > session)" to the SslFilter class, > > would be perfectly fine for me. > > > > I just tested it, and it works fine. Only thing, perhaps, is, that I > don't know, if session.getFilterChain > > can return null, so perhaps some null pointer handling is necessary. > > > > > Yes, actually, I have a better implementation that tests corner cases : > > public void initiateHandshake(IoSession session) throws SSLException { > IoFilterChain filterChain = session.getFilterChain(); > > if (filterChain == null) { > throw new SSLException("No filter chain"); > } > > IoFilter.NextFilter nextFilter = > filterChain.getNextFilter(SslFilter.class); > > if (nextFilter == null) { > throw new SSLException("No SSL next filter in the chain"); > } > > initiateHandshake(nextFilter, session); > } > > > This is what I'm going to commit. >
Mina workflow
Its been a while since I’ve used Mina and I forgot how the processor model works. Can anyone confirm the diagram is correct?
Re: where is ssl filter source code?
Here https://git1-us-west.apache.org/repos/asf?p=mina.git;a=summary You can choose which HEAD you want. trunk is 2 years old so I wouldn’t look at that. Here is the “2.0” HEAD https://git1-us-west.apache.org/repos/asf?p=mina.git;a=tree;h=refs/heads/2.0;hb=refs/heads/2.0 Its 4 days old. On Tue, Dec 22, 2015 at 2:06 PM, Vic Cekvenichwrote: > Hi Emanuel, > Yes that works and matches source. > The magic is switching to that proper branch. > > I like to look under the hood. > Cheers, > Vic > > > On Tue, Dec 22, 2015 at 1:46 AM, Emmanuel Lécharny > wrote: > > > Le 22/12/15 05:30, Vic Cekvenich a écrit : > > > Hi Ben, I think I should check first, before I say things are missing. > > > And it does appear that way. For example there are packages such as > > > sslfilter under filter that show up in docs, yet when you check out the > > > source code and search for those files, they are not there. > > > > > > It is my understanding that this mail list is for the mina project, so > I > > > guess I'm contacting the mina project that: there is missing source > code > > > that is documented on www in snippets and mina is an open source > project. > > > I would very much like to access the full source code documented - as > > > linked by Emanuel: > > > http://mina.apache.org/mina-project/xref/org/apache/mina/filter > > > Cheers, > > > Vic > > > > We use git at MINA. Youc an get the full sources doing : > > > > git clone http://git-wip-us.apache.org/repos/asf/mina.git mina > > > > Now, what you get is the *full* MINA repo, and that includes MINA 3.0, > > probably not what you want. Here is what you get when you run this > command > > : > > > > $ git tag > > 0.8.3 > > 0.8.4 > > ... > > 2.0.5 > > 2.0.6 > > 2.0.7 > > 2.0.8 > > 2.0.9 > > 3.0.0-M1 > > 3.0.0-M2 > > mina-parent-3.0.0-M1 > > > > > > You need to checkout the MINA 2.0.10 tag : > > > > $ git checkout -b 2.0.10 2.0.10 > > Switched to a new branch '2.0.10' > > > > > > That will allow you to see the full source used by this tag, and to > > retreive the file you are looking at : > > > > $ find . -name SslFilter.java > > ./mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java > > > > I'll update the http://mina.apache.org/mina-project/sources.html page to > > reflect that. > > > > Thanks ! > > > > >
Re: where is ssl filter source code?
Here is the browser for the filters package https://git1-us-west.apache.org/repos/asf?p=mina.git;a=tree;f=mina-core/src/main/java/org/apache/mina/filter;hb=d0263e8a00cf6e60d18317d1e8899554c53083bc On Tue, Dec 22, 2015 at 4:46 AM, Emmanuel Lécharnywrote: > Le 22/12/15 05:30, Vic Cekvenich a écrit : > > Hi Ben, I think I should check first, before I say things are missing. > > And it does appear that way. For example there are packages such as > > sslfilter under filter that show up in docs, yet when you check out the > > source code and search for those files, they are not there. > > > > It is my understanding that this mail list is for the mina project, so I > > guess I'm contacting the mina project that: there is missing source code > > that is documented on www in snippets and mina is an open source project. > > I would very much like to access the full source code documented - as > > linked by Emanuel: > > http://mina.apache.org/mina-project/xref/org/apache/mina/filter > > Cheers, > > Vic > > We use git at MINA. Youc an get the full sources doing : > > git clone http://git-wip-us.apache.org/repos/asf/mina.git mina > > Now, what you get is the *full* MINA repo, and that includes MINA 3.0, > probably not what you want. Here is what you get when you run this command > : > > $ git tag > 0.8.3 > 0.8.4 > ... > 2.0.5 > 2.0.6 > 2.0.7 > 2.0.8 > 2.0.9 > 3.0.0-M1 > 3.0.0-M2 > mina-parent-3.0.0-M1 > > > You need to checkout the MINA 2.0.10 tag : > > $ git checkout -b 2.0.10 2.0.10 > Switched to a new branch '2.0.10' > > > That will allow you to see the full source used by this tag, and to > retreive the file you are looking at : > > $ find . -name SslFilter.java > ./mina-core/src/main/java/org/apache/mina/filter/ssl/SslFilter.java > > I'll update the http://mina.apache.org/mina-project/sources.html page to > reflect that. > > Thanks ! > >
Re: ProtocolCodecFilter threading model
You also cannot process a linear buffer simultaneously. TCP is linear and reading the messages must be linear. After you have a list of messages then you may execute them in parallel but the line decoding of the buffer must be single threaded. The decoder operates on an inbound buffer and multi-threading this process will cause the buffers to complete out of order. There is also no guarantee that the inbound buffer contains a complete message. In this scenario the tail end of a message could be processed before the previous part which makes the whole thing totally broken without locks and locks would just eat more cpu with zero gain. On Oct 7, 2015 2:53 PM, "Emmanuel Lécharny"wrote: > Le 07/10/15 20:44, Марат Гайнуллин a écrit : > > Dear sirs! > > I am happy to know, that DIRMINA-1013 has been fixed. > > I have a question. I think, that while decoding TCP messages in separate > > sessions, server SHOULD do it in parallel. Why your last comment on > > DIRMINA-934 was about not to put executor filter before decoder in TCP? > Because doing so will put your server atrisk. Note that you already have > more than one thread processing incoming messages (IoProcessors) and TCP > does not guarantee you that a message will be delivered in one piece. > Now, let's assume you have an exectir *before* the decoder : then for > one specific session, more than one thread might be used to decode a > message, which means that potentially, for fragmented messages, more > than one thread will be in charge of decoding fration of a message. this > simply does not fly... > > For separate sessions, there is absolutely no problem, because each > session might be handled by a different IoProcessor. > > Performance wise, you might object that while a message is being > decoded, then another session could be blocked because the thread is > busy decoding (as the two sessions are handled by the same IoProcessor > thread). that would be true, except that when an IoProcessor thread is > busy decoding, it uses 100% of the CPU of the core it run on, so there > is no 'room' for some other exacution. So having an executor before the > decoder is simply useless, unless you haven't declared as many > IoProcessors as you have core on your server. > > The only case where it's annoying is when your decoder is accessing > external resources and has to wait for them : unlikely... > Hope it helps ! > >
Re: ProtocolCodecFilter threading model
It would use more memory and since there is already 2x IoProcessors for cpu cores there would be no speedup. In fact it would lead to more memory fragmentation/cache misses and require one thread for every session. Basically, it would be a bad idea. On Oct 7, 2015 3:36 PM, "Марат Гайнуллин" <mgaynul...@altsoft.biz> wrote: > Dear sirs! > It is completely clear for me, that decoding of a buffer must be linear > and tcp messages fragments must be decoded in a serial manner. My question > is about different thing. Why not to decode SEPARATE sessions' data streams > in parallel? > 7 окт. 2015 г. 10:18 PM пользователь "Jon V." <sybersn...@gmail.com> > написал: > > > You also cannot process a linear buffer simultaneously. TCP is linear > and > > reading the messages must be linear. After you have a list of messages > > then you may execute them in parallel but the line decoding of the buffer > > must be single threaded. The decoder operates on an inbound buffer and > > multi-threading this process will cause the buffers to complete out of > > order. There is also no guarantee that the inbound buffer contains a > > complete message. In this scenario the tail end of a message could be > > processed before the previous part which makes the whole thing totally > > broken without locks and locks would just eat more cpu with zero gain. > > On Oct 7, 2015 2:53 PM, "Emmanuel Lécharny" <elecha...@gmail.com> wrote: > > > > > Le 07/10/15 20:44, Марат Гайнуллин a écrit : > > > > Dear sirs! > > > > I am happy to know, that DIRMINA-1013 has been fixed. > > > > I have a question. I think, that while decoding TCP messages in > > separate > > > > sessions, server SHOULD do it in parallel. Why your last comment on > > > > DIRMINA-934 was about not to put executor filter before decoder in > TCP? > > > Because doing so will put your server atrisk. Note that you already > have > > > more than one thread processing incoming messages (IoProcessors) and > TCP > > > does not guarantee you that a message will be delivered in one piece. > > > Now, let's assume you have an exectir *before* the decoder : then for > > > one specific session, more than one thread might be used to decode a > > > message, which means that potentially, for fragmented messages, more > > > than one thread will be in charge of decoding fration of a message. > this > > > simply does not fly... > > > > > > For separate sessions, there is absolutely no problem, because each > > > session might be handled by a different IoProcessor. > > > > > > Performance wise, you might object that while a message is being > > > decoded, then another session could be blocked because the thread is > > > busy decoding (as the two sessions are handled by the same IoProcessor > > > thread). that would be true, except that when an IoProcessor thread is > > > busy decoding, it uses 100% of the CPU of the core it run on, so there > > > is no 'room' for some other exacution. So having an executor before the > > > decoder is simply useless, unless you haven't declared as many > > > IoProcessors as you have core on your server. > > > > > > The only case where it's annoying is when your decoder is accessing > > > external resources and has to wait for them : unlikely... > > > Hope it helps ! > > > > > > > > >
Re: Memory leak
Emmanuel is correct. You have to manage that backlog. Mina provides write request handlers so you get notifications when the data is written. If you detect that data isn't writing you should take steps to mitigate sending data to that session. On Sep 1, 2015 12:01 PM, "Emmanuel Lécharny"wrote: > Le 01/09/15 17:26, Leonardo D'Alimonte a écrit : > > Hello Emmanuel, > > actually it seems as if the Queue data structure continues to > > increase..message after message. > > We cannot check if the our device receive the message, the implemented > > protocol doesn't allow this, do you mean checking if the session goes in > an > > IDLE state? I can add override of method "sessionIdle(IoSession, > > IdleStatus) to our HandlerAdapter.. > > If the remote device brutally disconnected from the server, you will > *not* be able to know about it. That means you will keep sending data to > this inexistant client, and as this client is not there to read those > messages, they will just accumulate in memory. > > You have to manage the idle state of your sessions : after a delay, you > might want to kill the session, which will remove all the pending messages. > > Another option : when you send a message to a client, you know it has > been actually sent when you receive the messageSent event. If you don't > get this event, that means your client is not reading the messages. A > smart way to mitigate what we call 'slow readers' is to check that each > message written into a session has been sent and if not, kill the > session (or kill it after a number of written messages for which you > havent received a messageSent event). > >
Re: EOFException when file gets modified during sendFile
Maybe the file should be locked until send is complete. Really shouldn't allow sending of a file while it is being modified. On May 15, 2015 5:31 PM, Charlie Kim charl...@yahoo-inc.com.invalid wrote: Hi there, I'm seeing EOFException when file gets modified during sendFile command. Here is the scenario. Client receives the size of the file as 1000. Then, before inputstream is read, file gets modified which the file size becomes greater that what it was specified and this causes read to fail. debug2: exec request accepted on channel 0 Sink: C0644 1000 foo.txt debug2: channel 0: read=0 rfd 5 len 0 debug2: channel 0: read failed debug2: channel 0: close_read debug2: channel 0: input open - drain debug2: channel 0: ibuf empty here is the code that writes the length. https://github.com/apache/mina-sshd/blob/master/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java#L505 Could we use available() method of an InputStream and use that instead when writing C0644 1000 foo.txt?I've tried this workaround and seems to work for me. Thanks
Re: How to debug ghost sessions
Ghost sessions are a result of a broken TCP connection. It is possible that the client lost internet connection and was unable to correctly terminate the TCP session. Therefore, your application will never get a TCP close until the default idleness timer invokes or you use Mina's internal idleness to close sessions. On Mon, May 11, 2015 at 2:33 AM, 白玉雄 ba...@17car.com.cn wrote: Hi, I print all attributes of a bug session as follow, Mina processes the last request at 2015-05-11 01:58:34, then stucked and no request is processed afterwards. namevalue getWrittenBytesThroughput0.0 getLastIoTime2015-05-11 02:23:11 getReadBytes5971 getReadBytesThroughput0.0 isConnectedtrue getLastWriterIdleTime2015-05-11 01:58:34 isWriterIdlefalse getReaderIdleCount0 getLocalAddress/xx.xx.xx.xx: getWriterIdleCount0 getWrittenMessagesThroughput0.0 ID3233 getServiceAddress/0.0.0.0:x getReadMessages30 getLastReadTime2015-05-11 02:08:48 isSecuredfalse isReaderIdlefalse getLastReaderIdleTime2015-05-11 01:58:34 getWrittenBytes2221 getRemoteAddress/xx.xx.xx.xx:x getReadMessagesThroughput0.0 isBothIdlefalse isReadSuspendedfalse getScheduledWriteMessages-39 getLastWriteTime2015-05-11 02:23:11 getCreationTime2015-05-11 01:58:34 getBothIdleCount0 getLastBothIdleTime2015-05-11 01:58:34 isWriteSuspendedfalse isClosingfalse getWrittenMessages39 -- Original -- From: 白玉雄ba...@17car.com.cn; Date: Wed, May 6, 2015 02:47 PM To: usersusers@mina.apache.org; Subject: Re: How to debug ghost sessions I am sure that idle event is fired. After no heartbeat for 900 seconds , session was closed by server. -- Original -- From: Emmanuel Lécharnyelecha...@gmail.com; Date: Wed, May 6, 2015 02:31 PM To: usersusers@mina.apache.org; Subject: Re: How to debug ghost sessions Le 06/05/15 05:24, 白玉雄 a écrit : Hi all, My mina server neither process session request nor disconnect the session as idle. and this happens only on few of sessions, most of them works well. Some Code: public void run(int port) throws IOException { this.acceptor = new NioSocketAcceptor(); this.acceptor.setReuseAddress(true); this.acceptor.getFilterChain().addLast(codec,new ProtocolCodecFilter(new ClwMessageProtocolCodecFactory())); this.acceptor.getFilterChain().addLast(logger, new LoggingFilter()); this.acceptor.getFilterChain().addLast(threadPool, new ExecutorFilter(new UnorderedThreadPoolExecutor(PropertiesHander.getInt(MAXIMUM_POOL_SIZE, 16; this.acceptor.getSessionConfig().setReadBufferSize(512); this.acceptor.getSessionConfig().setReceiveBufferSize(512); // set idle time, default 900 seconds this.acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,PropertiesHander.getInt(SESSION_IDLE_TIME,900)); this.acceptor.setHandler(ioHandler); this.acceptor.bind(new InetSocketAddress(port)); LOGGER.info(Socket server Listening on port + PropertiesHander.getInt(SERVER_PORT, port)); } Some phenomenons: 1、The ghost session can be found by this.acceptor.getManagedSessions().get(sessionId) 2、If force the client disconnect from server and reconnect again, the client now works well and request was processed normally. It seems that the session was stucked. Question: Why this happens No idea... You aren't providing enough information to know what's going on. and How to reappear and debug this? Setting the idle time is good, but at some point you must check the event that is fired when teh session has been idle for 900 seconds. Are you doing that ?
Re: How to Detect Wired Network Disconnect in Apache Mina
Write and read is only the real way to detect disconnect. Sockets can be valid and live on after a disconnect and reconnect. When a network cable is removed, you may get a disconnect after the OS internal timeout. Otherwise you have to rely on your own idleness timer. On Apr 17, 2015 6:28 AM, Nikunj Patel aang...@gmail.com wrote: Dear Sir, I have develop MINA Client which is connected to remote server. I am trying to detect Wired Network Disconnect in that but it is not identify it. Also session.write is not generating any exception. Before submit if i check with session.isConnected then also it return true. Can any one help me how I can detect such network disconnection in Apache Mina. -- Regards, Nikunj Patel.
Re: How to Detect Wired Network Disconnect in Apache Mina
I forget how Mina handles it but SocketChannel write and read both generate exceptions to alert of disconnect. Mina may abstract that somehow. On Apr 17, 2015 8:38 AM, Nikunj Patel aang...@gmail.com wrote: Is there any way where session.write() can generate any exception and base on that we can take decision. On Fri, Apr 17, 2015 at 6:00 PM, Jon V. sybersn...@gmail.com wrote: Write and read is only the real way to detect disconnect. Sockets can be valid and live on after a disconnect and reconnect. When a network cable is removed, you may get a disconnect after the OS internal timeout. Otherwise you have to rely on your own idleness timer. On Apr 17, 2015 6:28 AM, Nikunj Patel aang...@gmail.com wrote: Dear Sir, I have develop MINA Client which is connected to remote server. I am trying to detect Wired Network Disconnect in that but it is not identify it. Also session.write is not generating any exception. Before submit if i check with session.isConnected then also it return true. Can any one help me how I can detect such network disconnection in Apache Mina. -- Regards, Nikunj Patel. -- Regards, Nikunj Patel.
Re: Virtual IP Load Balancer
This is not the correct place to discuss this. Maybe try stack overflow. On Wed, Mar 25, 2015 at 4:59 AM, rkreddy.bogati rkreddy.bog...@gmail.com wrote: @Ukslim, Thanks for your response. Let me explain the details requirement. I have one IP Address (that is not connected to any physical machine), which will receive the request. As soon as request receives it should delegate that request to the given IP Addresses (those are attached to any Physical machine) by Round-robin algorithm. To achieve this I would like to use Open source tool which suites my requirement. Note:- This requirement for Web-Application developed on JAVA/J2EE platform. -- View this message in context: http://apache-mina.10907.n7.nabble.com/Virtual-IP-Load-Balancer-tp46678p46698.html Sent from the Apache MINA User Forum mailing list archive at Nabble.com.
Re: Virtual IP Load Balancer
Should have said Stack Exchange. Meant it in a generic sense. On Mar 25, 2015 9:18 AM, John Hartnup john.hart...@gmail.com wrote: Neither is Stack Overflow the place to discuss it. http://serverfault.com/ or maybe http://superuser.com/ might be OK. I think my suggestion of haproxy will do the job. On Wed, Mar 25, 2015 at 1:06 PM Jon V. sybersn...@gmail.com wrote: This is not the correct place to discuss this. Maybe try stack overflow. On Wed, Mar 25, 2015 at 4:59 AM, rkreddy.bogati rkreddy.bog...@gmail.com wrote: @Ukslim, Thanks for your response. Let me explain the details requirement. I have one IP Address (that is not connected to any physical machine), which will receive the request. As soon as request receives it should delegate that request to the given IP Addresses (those are attached to any Physical machine) by Round-robin algorithm. To achieve this I would like to use Open source tool which suites my requirement. Note:- This requirement for Web-Application developed on JAVA/J2EE platform. -- View this message in context: http://apache-mina.10907.n7.nabble.com/Virtual-IP-Load- Balancer-tp46678p46698.html Sent from the Apache MINA User Forum mailing list archive at Nabble.com.
Re: question
This isn't necessarily something that would be the responsibility of Mina. Just as you developed your own game server, you will have to add any kind of clustering features yourself. On Mar 24, 2015 11:16 AM, antares anta...@virtuasport.it wrote: Hi Folks, i created a game server and i would like to have a suggestion about to sharing sessions between other game server instances. In other words something about clusterizing is that possible ? Thanks Francesco
Re: Mina server not responsive
Glad you figured it out. On Mar 22, 2015 6:39 PM, Jianbao (Jim) Tao jianbao@gmail.com wrote: Thank you, Jon and Emmanuel. I tried adding a logging filter and all. I finally found the root cause by taking a thread dump. It was due to a deadlock in our business logic code. I tried upgrading Mina version. However, I ran into a roadblock where Mina seemed somehow not receiving new data after the first chunk. It wasn't a priority to upgrade Mina at the time so I stopped investigating further. Maybe I will bring this here in the future. Best regards, Jim On Sat, Mar 21, 2015 at 5:10 PM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 21/03/15 20:01, Jianbao (Jim) Tao a écrit : Hi, I am facing a issue as follows. We have a proxy server developed with Mina. Recently after some changes in the business logic that hardly seem relevant, the server starts to show a random behavior frequently, in which it will simply not respond to any request. I used curl to manually verify. It appears that the sever is able to accept connection, but it doesn't seem to accept any data as I cannot see any logs on the server side. The version we are using is mina-core 2.0.0-M6. Right now I am running out of ideas to debug this issue. So, can anyone offer some advice about what I can try to investigate this issue? If you need more details to understand the issue, please, please let me know. I will do my best to provide them. I'll suggest you switch first to the latest MINA version (2.0.9). Regarding your issue, we can't tell anything with the provided infos. What I would suggest is that you add a Logger filter to see if the server is actually receiving the messages.
Re: Mina server not responsive
We are going to need a lot more. I would first use visual VM and figure if any threads are running 100% and grab stack traces. On Mar 21, 2015 3:03 PM, Jianbao (Jim) Tao jianbao@gmail.com wrote: Hi, I am facing a issue as follows. We have a proxy server developed with Mina. Recently after some changes in the business logic that hardly seem relevant, the server starts to show a random behavior frequently, in which it will simply not respond to any request. I used curl to manually verify. It appears that the sever is able to accept connection, but it doesn't seem to accept any data as I cannot see any logs on the server side. The version we are using is mina-core 2.0.0-M6. Right now I am running out of ideas to debug this issue. So, can anyone offer some advice about what I can try to investigate this issue? If you need more details to understand the issue, please, please let me know. I will do my best to provide them. Many thanks. Best regards, Jim
Re: Session Sharing between applications
I am going to take a little leap and say that Java is probably not the best to develop a proxy application. Mina's design is also more optimized for request response type situations and may introduce some unnecessary latency into the proxy. Otherwise, it is just as Emmanuel said. You write all the received data into the other IoSession. On Mar 21, 2015 8:15 PM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 21/03/15 17:33, Nikunj Patel a écrit : Dear All, I am going to develop network application using apache mina where application continually connected to remote server and also open port for client connection. When any client send message it will pass to remote server and response received from remote server it will pass to respective client which request has sent. My TCP Server must keep live connection with remote tcp server. architecture would be like TCP Client1 -- TCP Server -- Remote TCP Server TCP Client2 . . TCP Clientn I have no idea how I can response back to tcp client when response received from remote tcp server. Please find attached my sample application for your reference and guide me how can I achieve it. The attachement didn't make it. Regardless, you are just writing a proxy server. I suppose that your proxy send a request to the remote server when it receives a message from your client, so sending back a response to this client when your server receives the response from the remote server is as simple as writing the response into the client session.
Re: Is IoSession.write() thread-safe in mina trunk branch?
It is my understanding that the write is occurring on the the selector loop. This occurs on the same selector loop every time and therefore is thread-safe. When you call write the params are encapsulated and triggered for execution on the select loop. It does not occur in the same stack as the caller of write() On Aug 16, 2014 2:45 PM, Jens Reimann ct...@dentrassi.de wrote: Yes, but the call to write() can originate from any thread and thus is not thread safe. All handlers in the write call get called unsynchronized. This also causes issues at other locations like the gzip filter. There are two options, synchronize write calls yourself by surrounding calls to write() with a mutex lock or semaphore. Or, if you cannot synchronize all write calls (e.g. when you use the Heartbeat filter, which calls write on its own) you need to use the ExecutorFilter (I think that was the name). This can be used to force read and write calls to a specific thread. Jens On Aug 16, 2014 8:18 PM, Emmanuel Lecharny elecha...@apache.org wrote: From the top of my head (I'm in a bus atm), each session has its own chain of filter, thus its own instance. The variable is not shared, and the session is always handled by the same IoPricessor, so the same thread. That should be thread safe unless you start doing weird things with an executor. Le 16 août 2014 18:06, Kai ZHANG longb...@gmail.com a écrit : Hi, I am a beginer of Mina. I read the api doc located at: /http://mina.apache.org/mina-project/apidocs/org/apache/ mina/core/session/IoSession.html/ It says that IoSession is thread-safe. But when I read the source of mina trunk branch. I found the IoSession.write() method may be not thread-safe. The java source file is : /./core/src/main/java/org/apache/mina/session/AbstractIoSession.java/ Here is the method calling chain: AbstractIoSession.write() - AbstractIoSession.doWriteWithFuture - AbstractIoSession.processMessageWriting() - AbstractIoFilter.messageWriting() - AbstractIoSession.callWriteNextFilter() The code which is thread-safe reside in AbstractIoSession.callWriteNextFilter(), here is the code: /** * process session message received event using the filter chain. To be called by the session {@link SelectorLoop} . * * @param message the received message */ @Override public void callWriteNextFilter(WriteRequest message) { if (IS_DEBUG) { LOG.debug(calling next filter for writing for message '{}' position : {}, message, writeChainPosition); } /writeChainPosition--;/ if (writeChainPosition 0 || chain.length == 0) { // end of chain processing enqueueWriteRequest(message); } else { chain[writeChainPosition].messageWriting(this, message, this); } /writeChainPosition++;/ } Here the variable writeChainPosition is not thread-safe, If more than one thread call IoSession.write() concurrently, the writeChainPosition may have race condition. The result is some of the IoFilter may be skipped or called twice, and the message data passed down the filter chain may be broken. Could you tell me if my understanding is correct? Is IoSession.write() method designed to be thread-safe or should I use a lock for every concurrent IoSession.write() operation?
Re: Performance issue - NioSocketAcceptor
Yes, if the iohandle is blocking the execution then that would obviously do it That said I am not sure how the reactor threading in Mina would handle very small messages sent in a way that prevents the data from aggregating. Difference is 20k individual triggers or 1k triggers for the same number of messages. On Aug 15, 2014 2:00 AM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 15/08/14 05:41, Jon V. a écrit : Emmanuel, is there a line test tool for Mina? I ask because seems like the Jedi Jin here has a throughput problem. Something like http://blog.softlayer.com/2011/using-iperf-to-troubleshoot-speedthroughput-issues should do the trick. But here, with the client and the server o the same machine, I doubt the network could be the probelm. Jin, Have you tried benchmarking your code directly? In all reality I process 30k sockets and 500mb/s using raw TCP in java so if there is a problem it is either your code or Mina. It's crystal clear that it's not a MINA problem per se. I'm able to saturate a 10Mb/s network with more than 20 000 messages per second on my computer on my LDAP server using MINA. One of the possible reasons : the server IoHandler is doing weird things (like waiting for an external resource before releasing the thread). Typical use case : sendinhg the received data to a remote data base. So bottom line : what do you do on the server side with the data you receive ?
Re: Performance issue - NioSocketAcceptor
Emmanuel, is there a line test tool for Mina? I ask because seems like the Jedi Jin here has a throughput problem. Jin, Have you tried benchmarking your code directly? In all reality I process 30k sockets and 500mb/s using raw TCP in java so if there is a problem it is either your code or Mina. Hi there, I am using Apache Mina to develop a TCP server that handles incoming XML messages. There is around 60 to 80 concurrent messages sending to TCP server per minute. If the messages below 60 the TCP server is working fine and there is no delay receiving the request but problem arises when more than 60. The problem is the messages didn't reach/receive on time. From the log file I can see the messages are accumulated some where and after a while (between 10 to 30 seconds) all accumulated messages release to TCP server. Messages reach server on time is very critical in my application. I try to fine tune the NioSocketAcceptor number of thread, increase read buffer size, increase io buffer size but all do not help. I executed a stress test on my local machine using Jmeter with same throughput and the result is still negative. When NioSocketAcceptor starts accumulating messages I can see Jmeter is throwing: jmeter.protocol.tcp.sampler.TCPSampler: java.net.SocketException: Software caused connection abort: socket write error. To me this look like NioSocketAcceptor is blocking the messages. After a while it back to normal again. Please take note the JMeter and TCP Server are running on the same machine - this is to isolate network factor when doing testing. From the result, seem like it is not something related to network so now I am just focus on fine tuning the NioSocketAcceptor. Below is my codes. I will be grateful if anyone can tell me what is going on internally. I have been stuck in this problem for few months but still can't find any solution. IoAcceptor acceptor = new NioSocketAcceptor(); // Handle the incoming XML message PMMessageHandler pmMessageHandler = new PMMessageHandler(); // Initialise Spring configuration PMUtils pmUtils = PMUtils.getInstance(); pmMessageHandler.setDataProcessor((DataProcessor)pmUtils.getBean(dataProcessor)); //pmMessageHandler.setPmManager((PMManager)pmUtils.getBean(pmManager)); acceptor.setHandler( pmMessageHandler ); // Set the filter chain for log and translate incoming message to char acceptor.getFilterChain().addLast( logger, new LoggingFilter() ); TextLineCodecFactory textLineCodecFactory = new TextLineCodecFactory(Charset.forName( UTF-8 )); textLineCodecFactory.setDecoderMaxLineLength(PMServer.maxLineLength); acceptor.getFilterChain().addLast( codec, new ProtocolCodecFilter( textLineCodecFactory )); // Configure buffer size IoBuffer buffer = IoBuffer.allocate(5120, false); buffer.setAutoExpand(true); try { // Configure a port for TCP listener acceptor.bind( new InetSocketAddress(PMServer.port)); Thanks, KJ
Re: Help with so many concurrent connections
This isn't really a Mina question. Seems like you need to work on some tests to find out what parts are the bottleneck. I don't know why a buffer would mean faster inserts. Buffers are good to offload the tasks to other threads and that has its own performance advantages depending on how your database driver works. On Jul 15, 2014 5:11 PM, Eray Yuksek eyuksek2...@yahoo.com.invalid wrote: Hi, I am new in the list so I am not sure if I am sending my question to the right list since I know that there is another list called d...@mina.apache.org. I apologize in advance if this is not the right list and in that case, please let me know. Here is our problem: We try to handle thousands of concurrent connections through Mina, and what we do is that we put all of the messages goes through Mina successfully into a buffer with size 10K and then one by one we get the messages from the buffer and insert into single sql server table. However under heavy load, our inserts into the database table slows down significantly. We actually had no buffer before but at that time, it was even worse to insert all those concurrent messages right away into the table. We thought buffer would give us time to store the data under heavy load and we could get the messages one by one from the buffer and insert into the DB. But nowadays, even buffer is not enough for us. we are not sure whether the buffer is holding us back or the DB inserts but somehow we have to find a way to insert all the concurrent messages into that one DB table. (the buffer we are using it BoundedFifoBuffer and we use it as synchronized buffer) Thanks for your help in advance. Eray Yuksek E.Y.
Re: sshd - async interface
You could simply try the write or read on an interval. There are a few scenarios where aio is use able without NIO. Primarily when you use blocking read and scheduled non blocking writes. On Apr 19, 2014 9:58 AM, Alon Bar-Lev alon.bar...@gmail.com wrote: On Sat, Apr 19, 2014 at 3:52 PM, Jon V. sybersn...@gmail.com wrote: NIO controls and deals with the selectors. Async IO is a part of that but is not the same thing. Async io means that if a write cannot be fully flushed. It will not block until it can be. NIO provides us the events to tell us that data is available in the socket. Async IO is the ability for a single thread to perform (multiplex) IO (connect, read, write, close etc..) for multiple file descriptors. As far as I know, without NIO you cannot achieve that in Java. There is no sense in read or write without blocking if you cannot wait (vs actively poll) for an event. On Apr 19, 2014 4:56 AM, Alon Bar-Lev alon.bar...@gmail.com wrote: On Sat, Apr 19, 2014 at 10:58 AM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 4/19/14 9:45 AM, Alon Bar-Lev a écrit : On Sat, Apr 19, 2014 at 10:38 AM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 4/19/14 9:13 AM, Alon Bar-Lev a écrit : Hi, The mission of async is to avoid having threads at all, or at least O(1). As you have underline internal/private low level channels for socket processing, and public high level channels to communicate with application, there should be a mechanism for library to request wake up for these low level channels. Another option is to avoid using sockets at all within the implementation and require application to manage the sockets and pipe socket data into the library. I understand this is conceptional change than what we have now, but this what will enable scale without abusing system threads or have nondeterministic behaviour in high load. There are a few important things you have to know about async and threads : - the extra cost for dealing with async connection is around 30%. That all but free - a standard system can easily deal with a few thousands of threads Now, unless you define what is high load, I don't really see what kind of advantage we can get with an async implementation. FTR, when MINA was initially created, it was because there was a need for a system supporting potentially ten of thousands of connections. Is that what you are targetting ? Yes, using work threads that are derived per # of CPUs, no more. I am far from the pure Java world... but if async IO is 30% insufficient, maybe it worth to use libssh (C) and communicate with it using single socket from java, delegating IO outside of java. IO are already delegated outside on Java. Eveything IO related is written in C and wrapped into Java class. The extra cost when using NIO is due to the management of SelectorKey lists (with the various steps involved when dealing with those lists). All in all, when it comes to process IO, Java does not really add some extra cost over a plain C implementation. It's not the same story when using NIO, especially when dealing with many concurrent connections. So I am confused... Java does not add cost to async IO, but NIO does? While NIO is the only interface to Java async IO?
Re: [Support] Mina 2.0.7 improve reliability when there are network error
TCP works perfectly. If there is a problem. It is elsewhere. Implementing message delivery confirmation is a part of a higher level protocol. If the network/TCP is connected; it will be delivered. In what environment are you expecting TCP sockets to close all the time? Here is what happening regarding missing packets 39-55. Those are packets that probably exist in the native io buffer. No application can read what is in there? The assumption is that data in there will be written. However a socket can be closed while data exists in this buffer. Your higher level proto needs to send back an ACK with a packet number. You need to handle this yourself. On Mar 31, 2014 12:22 PM, TRAN Antoine antoine-b.t...@thalesgroup.com wrote: Hi, Goal I would like to improve the reliability of our program using Mina. From the research and tests I have made, it seems: 1. TCP reliability is not enough for messages not to be lost. 2. Mina does not offer message sent acknowledgment. 3. Lost of connection can be detected with the IOException that Mina will throw in IoHandlerAdapter#exceptionCaught. 4. If the remote socket is closed when writing to it, Mina will throw an WriteToClosedSessionException in IoHandlerAdapter#exceptionCaught. Based on these statements, I have made a program that will use a buffer in case Mina cannot send messages. When the reconnection is done, it will flush the buffer and then resend as normal. Problems This is my test. I send 100 messages at 1/sec. I removed the ethernet cable after the 39th messages, put it back a few seconds later. As a consequence, I lost some messages. Here are some elements that might help. 1. The written data are from messages 1 to 39 and from 55 to 100 (so some messages are lost). 2. The Mina server and client notice an IOException. 3. The Mina client gets the IOException way too late (after the 53th message). 4. The WriteToClosedSessionException that is supposed to contain all the messages that could not be sent contains only the messages from 55 to 58 (expected from 40 to 58). Questions 1. Are the above statements correct? 2. Is my workaround a good solution or does Mina already offer a better way of keeping messages before sending them in case of network error? Thank you. Yours sincerely, Antoine
Re: How to write byte[] to an IoSession
You are converting an incoming iobuffer to byte[] you need to write an iobuffer. On Mar 12, 2014 11:34 AM, dinesh707 dinesh...@gmail.com wrote: As shown below I can read the byte[] sent from an IoSession without having a protocol decoder. IoBuffer in = (IoBuffer) message; byte[] inBytes = in.array(); int length = inBytes[0]; inBytes = Arrays.copyOfRange(inBytes, 1, length + 1); ByteString incomingMessage = ByteString.copyFrom(inBytes); But when I try to do someIoSession.write(incomingMessage.toByteArray()); I get the following error. Don't know how to handle message of type . Are you missing a protocol encoder? How can i just write the bytes into an IoSession ?? -- View this message in context: http://apache-mina.10907.n7.nabble.com/How-to-write-byte-to-an-IoSession-tp41542.html Sent from the Apache MINA User Forum mailing list archive at Nabble.com.
Re: Separate Threads for sending and receiving
Instead of relying on logging; I would setup a stress test to measure completed commands/s and use that as a foundation for trying other procedures. On Sat, Feb 22, 2014 at 7:03 AM, Max Larsson max.lars...@facilityboss.bizwrote: Hi, In my IoHandler i receive the desired message and write out the response to session.write. But it is not immediately written out. During my process of the message additional message are received and process before my response message is delivered. It all depends on the session processing the incoming message. This is a multi-threaded framework, messages comming from dfferent sessions may be processed in //. OK because, i implement the client i only have one session, thus this doesn't complicate my issue. Now i figured out that only one thread handles read/write request. Absolutely. And the read request is processed before any write request? depends. If the socket is full when the thread is trying to write into it, then it give up, and a new incoming message might be processed before the write can be done. Eventually, a lot of messages can be stacked waiting for being written. So how can i either have a separate Thread for sending and receiving. You can use an Executor in the chain, even two executors if needed (one for reads, one for writes). But at the nend of the day, it does not somlve your issue. Or alternative how to tell the NioSocketprocess to take priority processing of write requests? You can idle the read while the write is not processed. The way it works woudl be something like : - process a read (in the handler) - idle the read (session.suspendRead()) - write the response Then in the handler, react on the messageSent event : - process the messageSent event - un-idle the read (session.resumeRead()) You now can process a new read. Think twice before implementing such a logic though !!! I would question the fact that the client is sending messages but not reading the response fast enough... You correct, your purposed solution doesn't solve my issue. At least i tried the ExecutorFilter, the suspendRead solution feels already from the reading ugly, so i didn't give it try. And because i'm the client i think i have a performance problem. But my investigation shows me that from receiving the command in my IoHandler to writing the response with session.write i need around 2 ms. But than it takes about 70 ms to get a logging about form the NioProcessor saying it send the message. Normally the NioProcess will not received any additional commands from between the first and sending my response. But under heavy load it will receive additional commands before sending my response and thus delay it additional about some ms. My goal is to get this 70ms as low as possible, and you say the cause for the long processing time is that the socket is full? Can a socket be full because of message collisions on the wire? Oh by the way i know i can get faster, because in raw cases the 70ms drop down to 2ms. Thus the whole command response cycle is processed in about 4ms. best regards Max -- _ http://facilityboss.biz http://facebook.com/facilityboss _ Max Larsson facilityboss GmbH Rheinstrasse 75, 64295 Darmstadt / Germany Handelsregister Darmstadt, HRB 86193 Geschäftsführer: Dipl.-Inform. Max Lars Robert Larsson Mobil: +49 179 2184428 Email: max.lars...@facilityboss.biz
Re: handling a slow client
You should never assume that all of your data is available. If you work with this, you can handle any speed client. I test everything against simulated invalid packets and random latency. On Nov 25, 2013 9:38 AM, Andrew Pennebaker apenneba...@42six.com wrote: This is a good edge case to consider, as some script kiddy tools for attacking websites behave this way. On Fri, Nov 22, 2013 at 4:00 PM, Binole, Bill william.j.bin...@questdiagnostics.com wrote: I was wondering how to handle a slow client. So say my client writes 100 bytes and then 5 seconds later writes another 100 bytes. What is being sent is delimited with a start and end block that I am checking for to insure I have a full message. I have written a decoder based on the CumulativeProtocolDecoder that works just fine except for the case of a slow client. In this case the buffer is drained before the end block is received and it is causing a bogus error condition. Is there a way to handle this within the decoder? Bill __ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. -- Cheers, Andrew Pennebaker apenneba...@42six.com
Re: Can MINA create proxy servers?
I don't see why not. I wouldn't recommend it however. Proxy servers need to be more bare metal. Nginx has a proxy module you should look at. On Nov 22, 2013 11:59 AM, Andrew Pennebaker apenneba...@42six.com wrote: That would be cool! -- Cheers, Andrew Pennebaker apenneba...@42six.com
Re: Can MINA create proxy servers?
I imagine you could build a proxy in Mina. However I don't believe any prebuilt proxies exist. May be easier to just use nginx. On Nov 22, 2013 3:12 PM, Andrew Pennebaker apenneba...@42six.com wrote: I ask, because I'm using Mina to spin up little test HTTP/FTP servers, to test a web crawler. Would be nice to spin up proxy servers, to test proxy support in the crawler. On Fri, Nov 22, 2013 at 12:02 PM, Jon V. sybersn...@gmail.com wrote: I don't see why not. I wouldn't recommend it however. Proxy servers need to be more bare metal. Nginx has a proxy module you should look at. On Nov 22, 2013 11:59 AM, Andrew Pennebaker apenneba...@42six.com wrote: That would be cool! -- Cheers, Andrew Pennebaker apenneba...@42six.com -- Cheers, Andrew Pennebaker apenneba...@42six.com
Re: Can MINA create proxy servers?
I was thinking about the Http lib. I didn't remember a proxy in there. Thanks. On Nov 22, 2013 3:32 PM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 11/22/13 9:20 PM, Jon V. a écrit : I imagine you could build a proxy in Mina. However I don't believe any prebuilt proxies exist. May be easier to just use nginx. http://mina.apache.org/mina-project/xref-test/org/apache/mina/example/proxy/ProxyTestClient.html and http://mina.apache.org/mina-project/xref/org/apache/mina/proxy/ProxyConnector.html It's included in the Mina core lib. -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: IoSession write method thread safe?
Synchronized is important to update the thread caches. More so when different sessions are bound to different threads. On Nov 21, 2013 10:45 AM, Alexandros Touloupis atoulou...@gmail.com wrote: Thanks for the reply! Yes I agree that synchronizing to the whole IoSession instance each time for writing, is brutal. I am thinking on including a writing lock as a session attribute in each session that will be initialized on sessionCreated events. Cheers! Alex On Thu, Nov 21, 2013 at 4:28 PM, Jon V. sybersn...@gmail.com wrote: I would imagine this to be true. The normal use case is request and response. Additional synchronization makes the code run slower in that scenario. I would suggest synchronizing critical paths. I have to synchronize write paths for the same reason where one input may write to dozens of other sockets. On Nov 21, 2013 10:23 AM, Alexandros Touloupis atoulou...@gmail.com wrote: Hello all, I am using mina 2.0.8 since I needed a patch included in this release. I face the following problem: The concept of the application is to multiplex inbound to outbound connections in MINA. This means that there might be 2 incoming connections that are multiplexed in one outbound connection. During my tests i randomly see this exception: java.nio.InvalidMarkException at java.nio.Buffer.reset(Buffer.java:298) ~[?:1.7.0_40] at org.apache.mina.core.buffer.AbstractIoBuffer.reset(AbstractIoBuffer.java:414) ~[mina-core-2.0.8-PATCHED.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.writeBuffer(AbstractPollingIoProcessor.java:926) ~[mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.flushNow(AbstractPollingIoProcessor.java:844) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.flush(AbstractPollingIoProcessor.java:772) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$700(AbstractPollingIoProcessor.java:67) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1112) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) [mina-core-2.0.8-SNAPSHOT.jar:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_40] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_40] at java.lang.Thread.run(Thread.java:724) [?:1.7.0_40] After some investigation i noticed that this happened when 2 threads decided to write to the same IoSession a message the same time. My assumption is that the #IoSession.write method is not thread safe, thus i synchronized the session instance before executing the write method in my handlers and up until now i haven't faced the same issue. Is my assumption valid? Thank you in advance, Alex
Re: IoSession write method thread safe?
I would imagine this to be true. The normal use case is request and response. Additional synchronization makes the code run slower in that scenario. I would suggest synchronizing critical paths. I have to synchronize write paths for the same reason where one input may write to dozens of other sockets. On Nov 21, 2013 10:23 AM, Alexandros Touloupis atoulou...@gmail.com wrote: Hello all, I am using mina 2.0.8 since I needed a patch included in this release. I face the following problem: The concept of the application is to multiplex inbound to outbound connections in MINA. This means that there might be 2 incoming connections that are multiplexed in one outbound connection. During my tests i randomly see this exception: java.nio.InvalidMarkException at java.nio.Buffer.reset(Buffer.java:298) ~[?:1.7.0_40] at org.apache.mina.core.buffer.AbstractIoBuffer.reset(AbstractIoBuffer.java:414) ~[mina-core-2.0.8-PATCHED.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.writeBuffer(AbstractPollingIoProcessor.java:926) ~[mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.flushNow(AbstractPollingIoProcessor.java:844) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.flush(AbstractPollingIoProcessor.java:772) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$700(AbstractPollingIoProcessor.java:67) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1112) [mina-core-2.0.8-SNAPSHOT.jar:?] at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) [mina-core-2.0.8-SNAPSHOT.jar:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_40] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_40] at java.lang.Thread.run(Thread.java:724) [?:1.7.0_40] After some investigation i noticed that this happened when 2 threads decided to write to the same IoSession a message the same time. My assumption is that the #IoSession.write method is not thread safe, thus i synchronized the session instance before executing the write method in my handlers and up until now i haven't faced the same issue. Is my assumption valid? Thank you in advance, Alex
Re: Unable to open more than 1000 ports in Mina Client
NioSocketAcceptor( number ) creates N threads. 10 is a problem in most cases. The default backlog for a SocketAcceptor in Java is 50. I have mine set to 200 to prevent dropped accept requests. Each time a socket attempts to connect it gets put in the backlog waiting for an accept to be called. If this buffer overflows the TCP connections drop in a bad way. On Mon, Sep 30, 2013 at 11:40 AM, praveen developsfuturet...@gmail.comwrote: i have set the backlog to 12 but still i have the same problem -- View this message in context: http://apache-mina.10907.n7.nabble.com/Unable-to-open-more-than-1000-ports-in-Mina-Client-tp39936p39962.html Sent from the Apache MINA User Forum mailing list archive at Nabble.com.
Re: Unable to open more than 1000 ports in Mina Client
I've seen this before and it was tightly bound to the Acceptor backlog for me. My desktop is Win 2008 r2 and I can get 18,000 tcp connections in Java. Selectors for some reason are very expensive in Windows. (maybe because they are not totally independent of each other). Where I can use 8 on Linux; there is a significant performance problem with greater than 3 on Windows. On Mon, Sep 30, 2013 at 11:54 AM, Emmanuel Lécharny elecha...@gmail.comwrote: Le 9/30/13 8:52 AM, Jon V. a écrit : NioSocketAcceptor( number ) creates N threads. 10 is a problem in most cases. The default backlog for a SocketAcceptor in Java is 50. I have mine set to 200 to prevent dropped accept requests. Each time a socket attempts to connect it gets put in the backlog waiting for an accept to be called. If this buffer overflows the TCP connections drop in a bad way. As I already said in a previous mail, this 1000 port limit is extremelly weird. In any case, this has nothing to do with MINA and any setting on MINA. Chck : - your firewall - your router setting. - consider using a decent OS instead of Windows 2008 which is, all in all, just 6 years old... -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: Unable to open more than 1000 ports in Mina Client
.But when 1000 clients connect simultaneously more than 50% of the connections will not respond with in 3 seconds and so the connection is closed by the client. So it sounds to me like he was connecting all of them at the same time. Hence my backlog statement. If he connected them 5-10 at a time; I am sure it would work normally. On Mon, Sep 30, 2013 at 11:59 AM, Jon V. sybersn...@gmail.com wrote: I've seen this before and it was tightly bound to the Acceptor backlog for me. My desktop is Win 2008 r2 and I can get 18,000 tcp connections in Java. Selectors for some reason are very expensive in Windows. (maybe because they are not totally independent of each other). Where I can use 8 on Linux; there is a significant performance problem with greater than 3 on Windows. On Mon, Sep 30, 2013 at 11:54 AM, Emmanuel Lécharny elecha...@gmail.comwrote: Le 9/30/13 8:52 AM, Jon V. a écrit : NioSocketAcceptor( number ) creates N threads. 10 is a problem in most cases. The default backlog for a SocketAcceptor in Java is 50. I have mine set to 200 to prevent dropped accept requests. Each time a socket attempts to connect it gets put in the backlog waiting for an accept to be called. If this buffer overflows the TCP connections drop in a bad way. As I already said in a previous mail, this 1000 port limit is extremelly weird. In any case, this has nothing to do with MINA and any setting on MINA. Chck : - your firewall - your router setting. - consider using a decent OS instead of Windows 2008 which is, all in all, just 6 years old... -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: Multithreaded UDP server vs. OrderedThreadPoolExecutor
Depends on what aspect of asynchronous you are looking for. The sockets are always async. If you have a bunch of ioprocessors then you have concurrency where more than one message can be processed at any given time. On Sep 25, 2013 6:15 AM, Christian Hammers chamm...@netcologne.de wrote: Hello On Tue, 24 Sep 2013 11:51:04 -0700 Emmanuel Lécharny elecha...@gmail.com wrote: Le 9/24/13 9:47 AM, Christian Hammers a écrit : Hello I've written a server for a proprietary UDP protocol that needs to answer with exactly one packet for every incoming packet. All packets are independent from each other so that I like to have each one handled asynchronously by a different thread from a pool with a certain maximum size. So far I used this: FooCodec codec = new FooCodec(); // encoder and decoder in one class InetSocketAddress local = new InetSocketAddress(port); acceptor = new NioDatagramAcceptor(); acceptor.getFilterChain().addLast(executor, new ExecutorFilter(maxThreads)); acceptor.getFilterChain().addLast(codec, new ProtocolCodecFilter(codec, codec)); acceptor.setHandler(handler); acceptor.bind(local); At first it seemed that each incoming UDP package, due to its stateless nature, creates a different Mina session and each Mina session runs in its own thread so that the default ExecutorFilter implementation OrderedThreadPoolExecutor is fine as I certainly don't want the session closed if there is still a response before it in the queue. That's not what is currently happening. MINA creates a session for each IP address, so if all your UDP messages are issued by one single machine using one IP address, then all the UDP messages will be processed by the same thread. Ah! They are indeed all coming from the same IP+Port. (I used to do a session.write(message); session.close() in my messageReceived() method so it seemed to be different sessions but that was probably a wrong approach as well) Adding an executor in the chain just make it likely that a separate thread will process each UDP message, but the session remains shared. That explains what you see. OK Just get rid of the executor, and increase the number of IoProcessor, you will be able to spread the load on many threads, and each new UDP message will be completely processed before the next UDP message can start to be processed. How can I increase the number of IoProcessor? Unlike the NioSocketAcceptor, the NioDatagramAcceptor constructor has no processorCount argumment. But regarding your last half sentence: Do I understand correctly that each IoProcessor thread processes one message after the other but as I can have several of the IoProcessor threads, the whole application will still be able to handle incoming request asynchronously? Best Regards, -christian-
Re: Multithreaded UDP server vs. OrderedThreadPoolExecutor
The first thing I would do would be to disable the executor and try again. You could be encountering some sort of deadlock. On Sep 24, 2013 12:47 PM, Christian Hammers chamm...@netcologne.de wrote: Hello I've written a server for a proprietary UDP protocol that needs to answer with exactly one packet for every incoming packet. All packets are independent from each other so that I like to have each one handled asynchronously by a different thread from a pool with a certain maximum size. So far I used this: FooCodec codec = new FooCodec(); // encoder and decoder in one class InetSocketAddress local = new InetSocketAddress(port); acceptor = new NioDatagramAcceptor(); acceptor.getFilterChain().addLast(executor, new ExecutorFilter(maxThreads)); acceptor.getFilterChain().addLast(codec, new ProtocolCodecFilter(codec, codec)); acceptor.setHandler(handler); acceptor.bind(local); At first it seemed that each incoming UDP package, due to its stateless nature, creates a different Mina session and each Mina session runs in its own thread so that the default ExecutorFilter implementation OrderedThreadPoolExecutor is fine as I certainly don't want the session closed if there is still a response before it in the queue. Now under a bit of load, one session was a bit slower and hanging for 1,5s and it suddenly happened that multiple UDP packets were put into the same Mina session which lead to the following log messages: 2013-09-24 10:56:02,910 DEBUG org.apache.mina.filter.executor.OrderedThreadPoolExecutor : Adding event MESSAGE_RECEIVED to session 17529 Queue : [MESSAGE_RECEIVED, , MESSAGE_RECEIVED, , MESSAGE_RECEIVED ... ] (OrderedThreadPoolExecutor.java:431) This now completely destroys the asynchronous behaviour as all packeges had to wait for the first one in the queue even if there were several executor threads idling around! How should I fix this problem? Using an UnorderedThreadPoolExecutor? Or setting acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 0); Or by somehow else force the creation of a Mina session for each UDP packet? Best Regards -christian- P.S.: http://mina.apache.org/mina-project/documentation.html contains a links to a UDP Tutorial which sadly refers to a page that does only have APR and Serial tutorials.
Re: Trouble with messageReceived()
On the client you are writing a hashmap to the session. I don't see a filter which turns the hashmap into a IoBuffer? Only IoBuffer can be written to the socket directly. On Sep 16, 2013 1:12 PM, Karrys, Michael (IS) mike.kar...@ngc.com wrote: I was wondering if someone could look at this and tell me what I am doing wrong. I don't seem to be getting the messageReceived() called on either the client or the server code. I have been able to get sumup example to run and I used code from that example to mashup this test code. I am rung OS/X with java 7 using mina 2.0.7. The logger shows the CREATED, OPENNED, and CLOSED events for the session but the messageReceived() routine never seems to be called. Is there something simple I am missing here? Thanks, Mike Karrys mike.kar...@ngc.com Server Code: public class Main extends IoHandlerAdapter { private static final int SERVER_PORT = 8080; private final static Logger LOGGER = LoggerFactory.getLogger(org.jeuron.test.mina.fl.server.Main.class); public void init() throws IOException { NioSocketAcceptor acceptor = new NioSocketAcceptor(); // Prepare the service configuration. acceptor.getFilterChain().addLast( codec, new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); acceptor.getFilterChain().addLast(logger, new LoggingFilter()); acceptor.setHandler(this); acceptor.bind(new InetSocketAddress(SERVER_PORT)); System.out.println(Listening on port + SERVER_PORT); } public Map process(Map record) { int count = (Integer) record.get(Field.COUNT); int length = (Integer) record.get(Field.LENGTH); String input = (String) record.get(Field.CONTENTS); StringBuilder output = new StringBuilder(); System.out.print(Processing( + (length + 1) + )\r); for (int i = input.length(); i 0; i--) { output.append(input.charAt(i - 1)); } record.put(Field.CONTENTS, output.toString()); if (count == length) { System.out.println(\nFinished Processing + (count + 1)); } return record; } @Override public void sessionOpened(IoSession session) { LOGGER.info(sessionOpened.); session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60); } @Override public void messageReceived(IoSession session, Object message) { Map input; Map output; LOGGER.info(messageReceived( + message + )); if (message instanceof Map) { input = (Map) message; output = process(input); session.write(output); } } @Override public void sessionIdle(IoSession session, IdleStatus status) { LOGGER.info(Disconnecting the idle.); session.close(true); } @Override public void exceptionCaught(IoSession session, Throwable cause) { session.close(true); } public static void main(String[] args) throws Exception { Main main = new Main(); main.init(); } } Client Code: public class Main extends IoHandlerAdapter { private final static Logger LOGGER = LoggerFactory.getLogger(org.jeuron.test.mina.fl.client.Main.class); private static final String HOSTNAME = localhost; private static final int PORT = 8080; private NioSocketConnector connector; private IoSession session; static char[] letter = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; private long startTime = 0; private long endTime = 0; private int maxSent = 0; private int receivedRecords = 0; private long totalBytes = 0; private int recordLengthValue = 0; private int recordCountValue = 0; public String readInput(String prompt) throws IOException { String input = null; System.out.println(prompt); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); input = br.readLine(); return input; } public boolean init() throws Exception { SocketAddress address = new InetSocketAddress(HOSTNAME, PORT); LOGGER.info(Main:init() address[ + address + ]); connector = new NioSocketConnector(); connector.setHandler(this); for (;;) { try { ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT)); future.awaitUninterruptibly(); session = future.getSession(); break; } catch (RuntimeIoException e) { System.err.println(Failed to connect.); e.printStackTrace(); Thread.sleep(5000); } } //session = future1.getSession();
RE: EXT :Re: Trouble with messageReceived()
The ProtocolCodecFilter works on batches instead of stream based. You have to be careful when you use it to ensure that you obtained all of the processed messages. This could explain the dropped messages you are seeing. On Sep 16, 2013 3:20 PM, Karrys, Michael (IS) mike.kar...@ngc.com wrote: Thanks. Knew it was something simple. I added the following and it now works. connector.getFilterChain().addLast( codec, new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); connector.getFilterChain().addLast(logger, new LoggingFilter()); But it drops messages. The SumUp example does not seem to drop messages when I changed it to use the ObjectSerializationCodecFactory but I will have to verify that. -Original Message- From: Jon V. [mailto:sybersn...@gmail.com] Sent: Monday, September 16, 2013 12:25 PM To: users@mina.apache.org Subject: EXT :Re: Trouble with messageReceived() On the client you are writing a hashmap to the session. I don't see a filter which turns the hashmap into a IoBuffer? Only IoBuffer can be written to the socket directly. On Sep 16, 2013 1:12 PM, Karrys, Michael (IS) mike.kar...@ngc.com wrote: I was wondering if someone could look at this and tell me what I am doing wrong. I don't seem to be getting the messageReceived() called on either the client or the server code. I have been able to get sumup example to run and I used code from that example to mashup this test code. I am rung OS/X with java 7 using mina 2.0.7. The logger shows the CREATED, OPENNED, and CLOSED events for the session but the messageReceived() routine never seems to be called. Is there something simple I am missing here? Thanks, Mike Karrys mike.kar...@ngc.com Server Code: public class Main extends IoHandlerAdapter { private static final int SERVER_PORT = 8080; private final static Logger LOGGER = LoggerFactory.getLogger(org.jeuron.test.mina.fl.server.Main.class); public void init() throws IOException { NioSocketAcceptor acceptor = new NioSocketAcceptor(); // Prepare the service configuration. acceptor.getFilterChain().addLast( codec, new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); acceptor.getFilterChain().addLast(logger, new LoggingFilter()); acceptor.setHandler(this); acceptor.bind(new InetSocketAddress(SERVER_PORT)); System.out.println(Listening on port + SERVER_PORT); } public Map process(Map record) { int count = (Integer) record.get(Field.COUNT); int length = (Integer) record.get(Field.LENGTH); String input = (String) record.get(Field.CONTENTS); StringBuilder output = new StringBuilder(); System.out.print(Processing( + (length + 1) + )\r); for (int i = input.length(); i 0; i--) { output.append(input.charAt(i - 1)); } record.put(Field.CONTENTS, output.toString()); if (count == length) { System.out.println(\nFinished Processing + (count + 1)); } return record; } @Override public void sessionOpened(IoSession session) { LOGGER.info(sessionOpened.); session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60); } @Override public void messageReceived(IoSession session, Object message) { Map input; Map output; LOGGER.info(messageReceived( + message + )); if (message instanceof Map) { input = (Map) message; output = process(input); session.write(output); } } @Override public void sessionIdle(IoSession session, IdleStatus status) { LOGGER.info(Disconnecting the idle.); session.close(true); } @Override public void exceptionCaught(IoSession session, Throwable cause) { session.close(true); } public static void main(String[] args) throws Exception { Main main = new Main(); main.init(); } } Client Code: public class Main extends IoHandlerAdapter { private final static Logger LOGGER = LoggerFactory.getLogger(org.jeuron.test.mina.fl.client.Main.class); private static final String HOSTNAME = localhost; private static final int PORT = 8080; private NioSocketConnector connector; private IoSession session; static char[] letter = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; private long startTime = 0; private long endTime = 0; private int maxSent = 0; private int receivedRecords = 0; private long totalBytes = 0; private int recordLengthValue
Re: MINA support for WebSockets?
The http implementation hasn't received any love lately as far as I know. It is not for needing a bit of work. Why not take the code and integrate it yourself? WebSockets are not terribly complicated. On Sep 4, 2013 11:36 AM, Mark Phillips gwailoh2...@yahoo.com wrote: The Users and Dev list archives contain year-old exchanges with Dhruv Chopra of ShepHertz in which the ShepHertz company offers to donate WebSocket protocol filters to MINA. I see that code in the developers' JIRA. But that exchange seems to have ended after just a few messages, and it doesn't look like the donated code has subsequently been integrated into a release. What are MINA's plans to support WebSockets? I think it's clear that ability to add WebSockets IO to existing MINA-based server apps is attractive for many users. Thanks! --Mark
Re: Send/Receive IoBuffer
Change what I gave you to conform with MINA. I simply wrote everything in notepad to give you an idea. On Tue, Sep 3, 2013 at 1:31 AM, Luciano Coelho luci...@lvcsistemas.comwrote: Thanks a lot for you answer, I will study about filters and try your solution too. Thanks too much really. -Mensagem original- De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2 de setembro de 2013 23:54 Para: users@mina.apache.org Assunto: Re: Send/Receive IoBuffer This is better: I am not going to use the correct API but you can get the idea. Create a Filter called CompoundBufferFilter filter_received( ByteBuffer source, IoSession session, Filter next ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering == null ) { buffering = ByteBuffer.allocate( some size ); } buffering.put( source ); buffering.flip(); next.received( buffering, session ); } This will compound buffer incoming data. logic_received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { source.mark(); if( source.remaining 4 ) { source.reset(); return; } int size = source.getInt(); if( source.remaining size ) { source.reset(); return; } String data = new String( buffering.array, buffering.offset, size, ISO-8859-1); } source.compact(); } Now you can simply return if you don't have enough data. On Mon, Sep 2, 2013 at 10:42 PM, Jon V. sybersn...@gmail.com wrote: On Mon, Sep 2, 2013 at 10:21 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Yeah Jon, you're right about flush, the wrong thing is really the IoBuffer. I put the: session.getConfig().setReadBufferSize(16*1024), on connector as you told me. I changed now for what you answered me, like this: if(size 0){ while (buffer.hasRemaining()){ byte[] payload = new byte[size]; buffer.get(payload); data = new String( payload, ISO-8859-1); } } Ok - Mina does not allow for compound rx_buffers. This means you are going to have to manually buffer the message yourself. received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering != null ) { // must be a new data int size = // read size somehow buffering = ByteBuffer.allocate( size ); buffering.put(source); if( buffering.hasRemaining() ) { session.setAttribute( SOME_PROPERTY_BUFFER_NAME, buffering ); return; } else { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } } else { buffering.put(source); if( !buffering.hasRemaining() ) { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } else { return; } } } } In MINA you have to read everything out of that ByteBuffer or it will be lost forever. This means you could get stuck only having 2 bytes in the buffer and not enough to read the size value. So you may have to setup a secondary buffer to store partial size values if that scenario does occur. I'm receiving from de server 2685 bytes and I set the buffer to 64*1024, and I'm still having the error: D/WEB(26934): java.nio.BufferUnderflowException. I saw that setting tcpnodelay = false becomes better, I got make 3 requests without error, but after the error happens again, and I have to restart the session again. Do I have to finish something in the IoBuffer after receive the data? Note that I'm not opening another session, I open one time and stay changing data all the time. The rest is functioning very well, one by one minute I send something and the server answer quickly, the only problem now is this big request that one time goes another time not. Thank's again. LUCIANO -Mensagem original- De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2 de setembro de 2013 19:26 Para: users@mina.apache.org Assunto: Re: Send/Receive IoBuffer On Mon, Sep 2, 2013 at 5:37 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Hello everybody. I'm learning how to use Mina and my questions are: I solved my problem of having a answer from my server without closing the session like this: System.out.flush(); This really gives me an indication of your Java knowledge. System.out is your access to stdout in Java. It is what you use to print things to the console. It has nothing to do with your application. Maybe posting on StackOverflow would be a good idea for general java help? Is that ok? I'm
Re: Send/Receive IoBuffer
On Mon, Sep 2, 2013 at 5:37 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Hello everybody. I'm learning how to use Mina and my questions are: I solved my problem of having a answer from my server without closing the session like this: System.out.flush(); This really gives me an indication of your Java knowledge. System.out is your access to stdout in Java. It is what you use to print things to the console. It has nothing to do with your application. Maybe posting on StackOverflow would be a good idea for general java help? Is that ok? I'm receiving the answer in Android via GPRS like this: First I set this on sessionCreated session.getConfig().setReadBufferSize(16*1024); You should set this in Mina config. It is not good to change on the fly like this. Read the Quick Start Guide: http://mina.apache.org/mina-project/quick-start-guide.html @Override public void messageReceived(IoSession session, Object message) throws Exception { IoBuffer buffer = (IoBuffer) message; int service = (Integer) session.getAttribute(SERVICE); Listener listener = (Listener)session.getAttribute(LISTENER); String data = ; int size = buffer.getInt(); while (buffer.hasRemaining()){ data += (char) buffer.get(); Using the += is the worst possible way to build a String. Since you are reading a String. Are you sure that the String is encoded using 8 bits? byte[] payload = new byte[size]; buffer.get(payload); String data = new String( payload, UTF-8); } if(size == data.trim().length()){ Why are you trying to trim the string? Are you expecting whitespaces? if(listener != null) listener.requisitionFinished(data, service); } else { if(listener != null) listener.requisitionFinished(, service); } Log.d(WEB, SERVICE: + service + SIZE: + size + DATA: + data); } Sometimes I receive the data in parts, when the message arriving is too long and it causes an error, even if the buffersize is bigger than the data I'm receiving. Thank's a lot. Luciano Coelho
Re: Send/Receive IoBuffer
On Mon, Sep 2, 2013 at 10:21 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Yeah Jon, you're right about flush, the wrong thing is really the IoBuffer. I put the: session.getConfig().setReadBufferSize(16*1024), on connector as you told me. I changed now for what you answered me, like this: if(size 0){ while (buffer.hasRemaining()){ byte[] payload = new byte[size]; buffer.get(payload); data = new String( payload, ISO-8859-1); } } Ok - Mina does not allow for compound rx_buffers. This means you are going to have to manually buffer the message yourself. received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering != null ) { // must be a new data int size = // read size somehow buffering = ByteBuffer.allocate( size ); buffering.put(source); if( buffering.hasRemaining() ) { session.setAttribute( SOME_PROPERTY_BUFFER_NAME, buffering ); return; } else { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } } else { buffering.put(source); if( !buffering.hasRemaining() ) { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } else { return; } } } } In MINA you have to read everything out of that ByteBuffer or it will be lost forever. This means you could get stuck only having 2 bytes in the buffer and not enough to read the size value. So you may have to setup a secondary buffer to store partial size values if that scenario does occur. I'm receiving from de server 2685 bytes and I set the buffer to 64*1024, and I'm still having the error: D/WEB(26934): java.nio.BufferUnderflowException. I saw that setting tcpnodelay = false becomes better, I got make 3 requests without error, but after the error happens again, and I have to restart the session again. Do I have to finish something in the IoBuffer after receive the data? Note that I'm not opening another session, I open one time and stay changing data all the time. The rest is functioning very well, one by one minute I send something and the server answer quickly, the only problem now is this big request that one time goes another time not. Thank's again. LUCIANO -Mensagem original- De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2 de setembro de 2013 19:26 Para: users@mina.apache.org Assunto: Re: Send/Receive IoBuffer On Mon, Sep 2, 2013 at 5:37 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Hello everybody. I'm learning how to use Mina and my questions are: I solved my problem of having a answer from my server without closing the session like this: System.out.flush(); This really gives me an indication of your Java knowledge. System.out is your access to stdout in Java. It is what you use to print things to the console. It has nothing to do with your application. Maybe posting on StackOverflow would be a good idea for general java help? Is that ok? I'm receiving the answer in Android via GPRS like this: First I set this on sessionCreated session.getConfig().setReadBufferSize(16*1024); You should set this in Mina config. It is not good to change on the fly like this. Read the Quick Start Guide: http://mina.apache.org/mina-project/quick-start-guide.html @Override public void messageReceived(IoSession session, Object message) throws Exception { IoBuffer buffer = (IoBuffer) message; int service = (Integer) session.getAttribute(SERVICE); Listener listener = (Listener)session.getAttribute(LISTENER); String data = ; int size = buffer.getInt(); while (buffer.hasRemaining()){ data += (char) buffer.get(); Using the += is the worst possible way to build a String. Since you are reading a String. Are you sure that the String is encoded using 8 bits? byte[] payload = new byte[size]; buffer.get(payload); String data = new String( payload, UTF-8); } if(size == data.trim().length()){ Why are you trying to trim the string? Are you expecting whitespaces? if(listener != null) listener.requisitionFinished(data, service); } else
Re: Send/Receive IoBuffer
This is better: I am not going to use the correct API but you can get the idea. Create a Filter called CompoundBufferFilter filter_received( ByteBuffer source, IoSession session, Filter next ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering == null ) { buffering = ByteBuffer.allocate( some size ); } buffering.put( source ); buffering.flip(); next.received( buffering, session ); } This will compound buffer incoming data. logic_received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { source.mark(); if( source.remaining 4 ) { source.reset(); return; } int size = source.getInt(); if( source.remaining size ) { source.reset(); return; } String data = new String( buffering.array, buffering.offset, size, ISO-8859-1); } source.compact(); } Now you can simply return if you don't have enough data. On Mon, Sep 2, 2013 at 10:42 PM, Jon V. sybersn...@gmail.com wrote: On Mon, Sep 2, 2013 at 10:21 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Yeah Jon, you're right about flush, the wrong thing is really the IoBuffer. I put the: session.getConfig().setReadBufferSize(16*1024), on connector as you told me. I changed now for what you answered me, like this: if(size 0){ while (buffer.hasRemaining()){ byte[] payload = new byte[size]; buffer.get(payload); data = new String( payload, ISO-8859-1); } } Ok - Mina does not allow for compound rx_buffers. This means you are going to have to manually buffer the message yourself. received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering != null ) { // must be a new data int size = // read size somehow buffering = ByteBuffer.allocate( size ); buffering.put(source); if( buffering.hasRemaining() ) { session.setAttribute( SOME_PROPERTY_BUFFER_NAME, buffering ); return; } else { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } } else { buffering.put(source); if( !buffering.hasRemaining() ) { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } else { return; } } } } In MINA you have to read everything out of that ByteBuffer or it will be lost forever. This means you could get stuck only having 2 bytes in the buffer and not enough to read the size value. So you may have to setup a secondary buffer to store partial size values if that scenario does occur. I'm receiving from de server 2685 bytes and I set the buffer to 64*1024, and I'm still having the error: D/WEB(26934): java.nio.BufferUnderflowException. I saw that setting tcpnodelay = false becomes better, I got make 3 requests without error, but after the error happens again, and I have to restart the session again. Do I have to finish something in the IoBuffer after receive the data? Note that I'm not opening another session, I open one time and stay changing data all the time. The rest is functioning very well, one by one minute I send something and the server answer quickly, the only problem now is this big request that one time goes another time not. Thank's again. LUCIANO -Mensagem original- De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2 de setembro de 2013 19:26 Para: users@mina.apache.org Assunto: Re: Send/Receive IoBuffer On Mon, Sep 2, 2013 at 5:37 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Hello everybody. I'm learning how to use Mina and my questions are: I solved my problem of having a answer from my server without closing the session like this: System.out.flush(); This really gives me an indication of your Java knowledge. System.out is your access to stdout in Java. It is what you use to print things to the console. It has nothing to do with your application. Maybe posting on StackOverflow would be a good idea for general java help? Is that ok? I'm receiving the answer in Android via GPRS like this: First I set this on sessionCreated session.getConfig().setReadBufferSize(16*1024); You should set this in Mina config. It is not good to change on the fly like this. Read the Quick Start Guide: http://mina.apache.org/mina-project/quick-start-guide.html @Override public void messageReceived(IoSession session, Object message) throws Exception { IoBuffer buffer = (IoBuffer) message; int service
Re: Send/Receive IoBuffer
Fix if( buffering == null ) { buffering = ByteBuffer.allocate( some size ); session.setAtribute( SOME_PROPERTY_BUFFER_NAME, buffering ); } On Mon, Sep 2, 2013 at 10:54 PM, Jon V. sybersn...@gmail.com wrote: This is better: I am not going to use the correct API but you can get the idea. Create a Filter called CompoundBufferFilter filter_received( ByteBuffer source, IoSession session, Filter next ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering == null ) { buffering = ByteBuffer.allocate( some size ); } buffering.put( source ); buffering.flip(); next.received( buffering, session ); } This will compound buffer incoming data. logic_received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { source.mark(); if( source.remaining 4 ) { source.reset(); return; } int size = source.getInt(); if( source.remaining size ) { source.reset(); return; } String data = new String( buffering.array, buffering.offset, size, ISO-8859-1); } source.compact(); } Now you can simply return if you don't have enough data. On Mon, Sep 2, 2013 at 10:42 PM, Jon V. sybersn...@gmail.com wrote: On Mon, Sep 2, 2013 at 10:21 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Yeah Jon, you're right about flush, the wrong thing is really the IoBuffer. I put the: session.getConfig().setReadBufferSize(16*1024), on connector as you told me. I changed now for what you answered me, like this: if(size 0){ while (buffer.hasRemaining()){ byte[] payload = new byte[size]; buffer.get(payload); data = new String( payload, ISO-8859-1); } } Ok - Mina does not allow for compound rx_buffers. This means you are going to have to manually buffer the message yourself. received( ByteBuffer source, IoSession session ) { while( source.hasRemaining() ) { ByteBuffer buffering = session.getAttribute( SOME_PROPERTY_BUFFER_NAME ); if( buffering != null ) { // must be a new data int size = // read size somehow buffering = ByteBuffer.allocate( size ); buffering.put(source); if( buffering.hasRemaining() ) { session.setAttribute( SOME_PROPERTY_BUFFER_NAME, buffering ); return; } else { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } } else { buffering.put(source); if( !buffering.hasRemaining() ) { // message is complete session.clearAttribute( SOME_PROPERTY_BUFFER_NAME ); String data = new String( buffering.array, buffering.offset, buffering.limit, ISO-8859-1); } else { return; } } } } In MINA you have to read everything out of that ByteBuffer or it will be lost forever. This means you could get stuck only having 2 bytes in the buffer and not enough to read the size value. So you may have to setup a secondary buffer to store partial size values if that scenario does occur. I'm receiving from de server 2685 bytes and I set the buffer to 64*1024, and I'm still having the error: D/WEB(26934): java.nio.BufferUnderflowException. I saw that setting tcpnodelay = false becomes better, I got make 3 requests without error, but after the error happens again, and I have to restart the session again. Do I have to finish something in the IoBuffer after receive the data? Note that I'm not opening another session, I open one time and stay changing data all the time. The rest is functioning very well, one by one minute I send something and the server answer quickly, the only problem now is this big request that one time goes another time not. Thank's again. LUCIANO -Mensagem original- De: Jon V. [mailto:sybersn...@gmail.com] Enviada em: segunda-feira, 2 de setembro de 2013 19:26 Para: users@mina.apache.org Assunto: Re: Send/Receive IoBuffer On Mon, Sep 2, 2013 at 5:37 PM, Luciano Coelho luci...@lvcsistemas.comwrote: Hello everybody. I'm learning how to use Mina and my questions are: I solved my problem of having a answer from my server without closing the session like this: System.out.flush(); This really gives me an indication of your Java knowledge. System.out is your access to stdout in Java. It is what you use to print things to the console. It has nothing to do with your application. Maybe posting on StackOverflow would be a good idea for general java help? Is that ok? I'm receiving the answer in Android via GPRS like this: First I set this on sessionCreated session.getConfig().setReadBufferSize(16*1024); You should set this in Mina config. It is not good to change on the fly like this. Read the Quick Start Guide: http://mina.apache.org/mina-project/quick-start-guide.html @Override public void
Re: Regarding DIRMINA-912
Sounds like you need a task queue and a single dispatcher thread. Write the metered messages to the task queue and let it do the temporal management. This can all be done with one thread. On Aug 25, 2013 11:57 AM, Mike McKnight m...@mcknight4.com wrote: In my case I have units on the ground that need to have messages throttled when being sent to the units. In other words all of the queued write events going to each unit need to be metered out in an temporal fashion. I have a separate thread pool available that can expand to the number of units on the ground, which is max around 50, and handles this metering process. Message processing for all but WRITE events needs to be unfettered in any way and can not be held up for writes being throttled. So for sure I need another executor filter that handles all but WRITE events. I don't see how I can do this with a single executor filter. As events are processed in order in a queue and if I am waiting on a write then MESSAGE_RECEIVED events are not going to get processed. There are no separate SessionTasksQueue for the OrderedThreadPoolExecutor, just the one for all events waiting to be processed. Filter chain looks like this: * codec * inbound-filter (executor filter for all but WRITE events) * write-throttle-filter (overrides filterWrite) * outbound-filter (executor filter for WRITE events only) On 08/23/2013 12:32 PM, Jon V. wrote: What is the use case for having different thread pools for read and write events? Writes are already scheduled one they hit the worker. Not like your write process is going to slow down an already threaded read request. On Aug 22, 2013 5:52 PM, Mike McKnightm...@mcknight4.com wrote: I am just curious if there is a downside to this issue that I am not seeing. I have seen this in my MINA application; I have inbound/outbound executor filters as described in the issue and have seen where my inbound threads are *sometimes* processing IoEventType.WRITE events. I don't see any adverse effects of this, my messages are being put on the wire, but am checking in with the list to be sure. I am running mina-2.0.7. https://issues.apache.org/jira/browse/DIRMINA-912https://issues.apache.org/**jira/browse/DIRMINA-912 https:**//issues.apache.org/jira/**browse/DIRMINA-912https://issues.apache.org/jira/browse/DIRMINA-912 Thanks! Mike
Re: Regarding DIRMINA-912
What is the use case for having different thread pools for read and write events? Writes are already scheduled one they hit the worker. Not like your write process is going to slow down an already threaded read request. On Aug 22, 2013 5:52 PM, Mike McKnight m...@mcknight4.com wrote: I am just curious if there is a downside to this issue that I am not seeing. I have seen this in my MINA application; I have inbound/outbound executor filters as described in the issue and have seen where my inbound threads are *sometimes* processing IoEventType.WRITE events. I don't see any adverse effects of this, my messages are being put on the wire, but am checking in with the list to be sure. I am running mina-2.0.7. https://issues.apache.org/**jira/browse/DIRMINA-912https://issues.apache.org/jira/browse/DIRMINA-912 Thanks! Mike
Re: AW: AW: NioSocketConnector/NioSocketAcceptor
Please don't take this the wrong way. The apache Mina site is full of examples and documentation. That should be your primary source of information before asking questions on the email list. Remember, this list covers 5 different projects and your email goes out to a lot of people. I am very happy to answer questions that involve things that are not covered by the docs. On Aug 15, 2013 11:31 AM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 8/15/13 5:13 PM, Simo Chiegang, Boris Arthur RD-P8.1 a écrit : Ok that means, when I write new NioSocketConnector(), the number of threads to use isn't no limited. If I give a a processorCount (may be 2 ), I will limit the number of threads to 2. I'm wright? Yes. If you don't provide any value, the number of IoProcessor will be Nb Core + 1. usually, it's enough. If you need more, you can add an executor in the filter chain, and use a Pool. But keep in mind that whatever you do, if you are CPU bound, no matter how many threads you add, you are not going to have better throughput. -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: User authentication
That is basically how it is done. Io-packet processor-state machine-handler The state machine should only handle one packet at a time. In the message received just do... If ( authenticated ) Next filter.message received( msg ) Else Etc On Aug 7, 2013 3:22 PM, Hunter McMillen mcmil...@gmail.com wrote: So that is actually the solution we had before, but the state machine was in an authentication filter, we had a lot of trouble transitioning from ok now I am done authenticating, I want to be in my IoHandler now Hunter On 8/7/2013 3:03 PM, Jon wrote: So just implement some sort if authentication using the state machine and a database record lookup. Sent from my iPhone On Aug 7, 2013, at 2:11 PM, Hunter McMillen mcmil...@gmail.com wrote: I misunderstood what you were asking, yes we have an abstract Command class that has derivatives for all of the commands that a user could enter. Hunter On 8/7/2013 1:13 PM, Jon wrote: You must be building some sort of communication format for it. Sent from my iPhone On Aug 7, 2013, at 1:06 PM, Hunter McMillen mcmil...@gmail.com wrote: We're not really implementing a protocol, we are just trying to make a text-based game that will seamlessly support hundreds to thousands of users at a time. Hunter On 8/7/2013 12:02 PM, Jon wrote: This is more of a protocol implementation than a networking question. What kind of protocol are you implementing. Sent from my iPhone On Aug 7, 2013, at 11:34 AM, Hunter McMillen mcmil...@gmail.com wrote: We actually won't need anything as complex as LDAP, just a simple DB hash + salt lookup. Hunter On 8/7/2013 10:26 AM, Emmanuel Lécharny wrote: Le 8/7/13 4:11 PM, Hunter McMillen a écrit : What are the common ways to authenticate users using Mina? The first attempt I made was using a state machine, but I had problems integrating that with an IoHandler. In retrospect, the state machine seems like overkill; so I was hoping to get ideas for other ways to authenticate users, or maybe a link to an application that does some authentication. would it be terrible to do something like this? public void sessionCreated(IoSession session) { authenticateUser() // - Good idea? Bad Idea? Run in a separate thread? } Depends... let's see how it works with LDAP : - the user can connect on the server (and the sessionCreated event is handled), but the user will not be authentified at this point. - in order to authenticate the user, we need to know about the user. Just having his IP address is certainly not good enough (it's easy to spoof it), so we expect the client to sent some credentials in the first dedicated message. In LDAP this is done through a BindRequest. Anyway, as you require the user to send you some data, you have to process them by handling the messageReceived event. Last, not least : what about a separate thread ? That's a good question. The answer, again is it depends. If it takes seconds to authenticat a user, because you have to send the auth request to a remote server, then having a separate thread for that sounds smart. Most of the time, the authent will take a few ms, and will be done quite rarely, so it's enough to execute this code in the same thread. Hope it helps.
Re: User authentication
There really shouldn't be anything in created and opened unless you are going to authenticate based on an IP address. The authentication should be a part of your command message structure. So you parse the commands into objects. Then you pass to the authentication filter. If message is of type authentication then do authentication else if authenticated pass to the handler. If not authenticated and not type authentication then close the session. You only have two states. Authenticated or not. On Aug 7, 2013 3:37 PM, Hunter McMillen mcmil...@gmail.com wrote: so all of the logic for the handler will basically be in messageReceived? And the state machine manages sessionCreated()/**sessionOpened()? Hunter On 8/7/2013 3:29 PM, Jon V. wrote: That is basically how it is done. Io-packet processor-state machine-handler The state machine should only handle one packet at a time. In the message received just do... If ( authenticated ) Next filter.message received( msg ) Else Etc On Aug 7, 2013 3:22 PM, Hunter McMillen mcmil...@gmail.com wrote: So that is actually the solution we had before, but the state machine was in an authentication filter, we had a lot of trouble transitioning from ok now I am done authenticating, I want to be in my IoHandler now Hunter On 8/7/2013 3:03 PM, Jon wrote: So just implement some sort if authentication using the state machine and a database record lookup. Sent from my iPhone On Aug 7, 2013, at 2:11 PM, Hunter McMillen mcmil...@gmail.com wrote: I misunderstood what you were asking, yes we have an abstract Command class that has derivatives for all of the commands that a user could enter. Hunter On 8/7/2013 1:13 PM, Jon wrote: You must be building some sort of communication format for it. Sent from my iPhone On Aug 7, 2013, at 1:06 PM, Hunter McMillen mcmil...@gmail.com wrote: We're not really implementing a protocol, we are just trying to make a text-based game that will seamlessly support hundreds to thousands of users at a time. Hunter On 8/7/2013 12:02 PM, Jon wrote: This is more of a protocol implementation than a networking question. What kind of protocol are you implementing. Sent from my iPhone On Aug 7, 2013, at 11:34 AM, Hunter McMillen mcmil...@gmail.com wrote: We actually won't need anything as complex as LDAP, just a simple DB hash + salt lookup. Hunter On 8/7/2013 10:26 AM, Emmanuel Lécharny wrote: Le 8/7/13 4:11 PM, Hunter McMillen a écrit : What are the common ways to authenticate users using Mina? The first attempt I made was using a state machine, but I had problems integrating that with an IoHandler. In retrospect, the state machine seems like overkill; so I was hoping to get ideas for other ways to authenticate users, or maybe a link to an application that does some authentication. would it be terrible to do something like this? public void sessionCreated(IoSession session) { authenticateUser() // - Good idea? Bad Idea? Run in a separate thread? } Depends... let's see how it works with LDAP : - the user can connect on the server (and the sessionCreated event is handled), but the user will not be authentified at this point. - in order to authenticate the user, we need to know about the user. Just having his IP address is certainly not good enough (it's easy to spoof it), so we expect the client to sent some credentials in the first dedicated message. In LDAP this is done through a BindRequest. Anyway, as you require the user to send you some data, you have to process them by handling the messageReceived event. Last, not least : what about a separate thread ? That's a good question. The answer, again is it depends. If it takes seconds to authenticat a user, because you have to send the auth request to a remote server, then having a separate thread for that sounds smart. Most of the time, the authent will take a few ms, and will be done quite rarely, so it's enough to execute this code in the same thread. Hope it helps.
Re: Using an Authentication Filter and IoHandlerAdapter
Write your state to the IoSession and read it from the handler. On Aug 1, 2013 10:06 PM, Hunter McMillen mcmil...@gmail.com wrote: Ok I think I understand the ordering now, we probably don't need an Executor. Our main issue is still how to link the state machine with our IoHandlerAdaptor. As of right now, after a user is authenticated (by the statemachine), the sessionIdle() event of the statemachine calls sessionOpened of our IoHandlerAdapter; obviously this is a logic error because sessionIdle() will fire frequently. So two things: 1) Is there a way to leave the statemachine after we authenticate someone? 2) If not, how to map the finishing of authentication to our IoHandlerAdapter ,specifically we probably don't want to fire a sessionCreated() event (because a session was already created by the statemachine), we simply want to pass that to our handler. Thanks. Hunter On 8/1/13 9:54 PM, Ashish wrote: On Fri, Aug 2, 2013 at 7:15 AM, Jon V. sybersn...@gmail.com wrote: To my knowledge the executor filter does not guarantee any kind of order. This means that you should implement the authentication phase before the executor. This is correct, with Executor filter ordering is not guaranteed. Do you need an executor filter there? It's usage is recommended if you have some intensive task in chain or in IoHandler. Io-prorocol-authentication-executor-handler This sound good. Alternative is to use OrderedThreadPoolExecutor, but go simple first. Implement stuff without Executor filter and then push that in if needed. You cannot lock on out of order messaging without a queue and attempt to re-order the messages. On Aug 1, 2013 9:33 PM, Hunter McMillen mcmil...@gmail.com wrote: Sorry, the code is probably more useful to see, here is the entry point to our application: acceptor = new NioSocketAcceptor( Runtime.getRuntime().availableProcessors() ); acceptor.getFilterChain().addLast(executor, new ExecutorFilter( Executors.newCachedThreadPool())); acceptor.getFilterChain().addLast(logger, MudConfig.Logging.getFilter()); acceptor.getFilterChain().addLast(codec, new ProtocolCodecFilter( new TextLineEncoder(), new CommandDecoder() ) ); More importantly, my main question is how I can link the DONE state of the state machine (AuthenticationHandler) and the IoHandlerAdapter. I can post the code for these also, I just didn't want to overload the thread. Thanks. Hunter On 8/1/13 5:47 PM, Jon wrote: You are not using an executor filter right? You have to implement locking during the authentication phase if you are using thread scheduling. Sent from my iPhone On Aug 1, 2013, at 5:31 PM, Hunter McMillen mcmil...@gmail.com wrote: Hello, I recently started working on a project with a friend that is a text-based game. We were having trouble with ReadFuture's when trying to get a username/password combination from the user so we decided to follow the state machine example from Tapedeck TCP server on Mina's homepage: http://mina.apache.org/mina-project/xref/org/apache/mina/example/tapedeck/ I have gotten the state machine to a point where it seems to be working well. It starts, reads a username, then a password, then has some logic to restart based on error; or it prints a message 'Authenticated'. However our main application logic is going to be (our plan at least) held in an IoHandlerAdapter, my question is what is a good way to integrate the two of these: 1) The state machine authentication filter from the example above 2) An IoHandlerAdapter that will track information about connected users and sessions My confusion mainly lies in how to transition between the state machine and the IoHandlerAdapter since they both respond to /sessionCreated /and /sessionOpened /events. Any help, ideas, or input would be appreciated. Thanks. Hunter
Re: Using an Authentication Filter and IoHandlerAdapter
The major problem with any kind of ordering is the blocking and major performance problems relative to the load. On Aug 1, 2013 9:55 PM, Ashish paliwalash...@gmail.com wrote: On Fri, Aug 2, 2013 at 7:15 AM, Jon V. sybersn...@gmail.com wrote: To my knowledge the executor filter does not guarantee any kind of order. This means that you should implement the authentication phase before the executor. This is correct, with Executor filter ordering is not guaranteed. Do you need an executor filter there? It's usage is recommended if you have some intensive task in chain or in IoHandler. Io-prorocol-authentication-executor-handler This sound good. Alternative is to use OrderedThreadPoolExecutor, but go simple first. Implement stuff without Executor filter and then push that in if needed. You cannot lock on out of order messaging without a queue and attempt to re-order the messages. On Aug 1, 2013 9:33 PM, Hunter McMillen mcmil...@gmail.com wrote: Sorry, the code is probably more useful to see, here is the entry point to our application: acceptor = new NioSocketAcceptor( Runtime.getRuntime().availableProcessors() ); acceptor.getFilterChain().addLast(executor, new ExecutorFilter( Executors.newCachedThreadPool())); acceptor.getFilterChain().addLast(logger, MudConfig.Logging.getFilter()); acceptor.getFilterChain().addLast(codec, new ProtocolCodecFilter( new TextLineEncoder(), new CommandDecoder() ) ); More importantly, my main question is how I can link the DONE state of the state machine (AuthenticationHandler) and the IoHandlerAdapter. I can post the code for these also, I just didn't want to overload the thread. Thanks. Hunter On 8/1/13 5:47 PM, Jon wrote: You are not using an executor filter right? You have to implement locking during the authentication phase if you are using thread scheduling. Sent from my iPhone On Aug 1, 2013, at 5:31 PM, Hunter McMillen mcmil...@gmail.com wrote: Hello, I recently started working on a project with a friend that is a text-based game. We were having trouble with ReadFuture's when trying to get a username/password combination from the user so we decided to follow the state machine example from Tapedeck TCP server on Mina's homepage: http://mina.apache.org/mina-project/xref/org/apache/mina/example/tapedeck/ I have gotten the state machine to a point where it seems to be working well. It starts, reads a username, then a password, then has some logic to restart based on error; or it prints a message 'Authenticated'. However our main application logic is going to be (our plan at least) held in an IoHandlerAdapter, my question is what is a good way to integrate the two of these: 1) The state machine authentication filter from the example above 2) An IoHandlerAdapter that will track information about connected users and sessions My confusion mainly lies in how to transition between the state machine and the IoHandlerAdapter since they both respond to /sessionCreated /and /sessionOpened /events. Any help, ideas, or input would be appreciated. Thanks. Hunter -- thanks ashish Blog: http://www.ashishpaliwal.com/blog My Photo Galleries: http://www.pbase.com/ashishpaliwal
Re: Using an Authentication Filter and IoHandlerAdapter
To my knowledge the executor filter does not guarantee any kind of order. This means that you should implement the authentication phase before the executor. Io-prorocol-authentication-executor-handler You cannot lock on out of order messaging without a queue and attempt to re-order the messages. On Aug 1, 2013 9:33 PM, Hunter McMillen mcmil...@gmail.com wrote: Sorry, the code is probably more useful to see, here is the entry point to our application: acceptor = new NioSocketAcceptor( Runtime.getRuntime().availableProcessors() ); acceptor.getFilterChain().addLast(executor, new ExecutorFilter( Executors.newCachedThreadPool())); acceptor.getFilterChain().addLast(logger, MudConfig.Logging.getFilter()); acceptor.getFilterChain().addLast(codec, new ProtocolCodecFilter( new TextLineEncoder(), new CommandDecoder() ) ); More importantly, my main question is how I can link the DONE state of the state machine (AuthenticationHandler) and the IoHandlerAdapter. I can post the code for these also, I just didn't want to overload the thread. Thanks. Hunter On 8/1/13 5:47 PM, Jon wrote: You are not using an executor filter right? You have to implement locking during the authentication phase if you are using thread scheduling. Sent from my iPhone On Aug 1, 2013, at 5:31 PM, Hunter McMillen mcmil...@gmail.com wrote: Hello, I recently started working on a project with a friend that is a text-based game. We were having trouble with ReadFuture's when trying to get a username/password combination from the user so we decided to follow the state machine example from Tapedeck TCP server on Mina's homepage: http://mina.apache.org/mina-project/xref/org/apache/mina/example/tapedeck/ I have gotten the state machine to a point where it seems to be working well. It starts, reads a username, then a password, then has some logic to restart based on error; or it prints a message 'Authenticated'. However our main application logic is going to be (our plan at least) held in an IoHandlerAdapter, my question is what is a good way to integrate the two of these: 1) The state machine authentication filter from the example above 2) An IoHandlerAdapter that will track information about connected users and sessions My confusion mainly lies in how to transition between the state machine and the IoHandlerAdapter since they both respond to /sessionCreated /and /sessionOpened /events. Any help, ideas, or input would be appreciated. Thanks. Hunter
RE: Does MINA 2.0.4 supports IPV6
I am not setup to do anything in Mina at the moment. You know how to setup regex patterns in Java? Its as simple as converting the inetaddress to a string and comparing with the regex. If condition is true, close the session. On Jul 30, 2013 1:17 AM, Nitin Phuria nit...@integramicro.com wrote: No I am not using any wildcards in blacklist filter of MINA. All the IP Addresses are IPV4 type and are individual IPs. Could you pls give me some leads on your statement You could build your own string and pattern based blacklist filter for IPV6 so that I can try it. Thanks And Regards, Nitin Phuria -Original Message- From: Jon V. [mailto:sybersn...@gmail.com] Sent: Saturday, July 27, 2013 12:27 AM To: users@mina.apache.org; nit...@integramicro.com Subject: Re: Does MINA 2.0.4 supports IPV6 Are you using wildcards in the blacklist filter? You could build your own string and pattern based blacklist filter for IPV6 in under 30 minutes. On Fri, Jul 26, 2013 at 3:10 AM, Nitin Phuria nit...@integramicro.comwrote: The issue is registered in JIRA see the below link. https://issues.apache.org/jira/browse/DIRMINA-957 Thanks And Regards, Nitin Phuria -Original Message- From: Emmanuel Lécharny [mailto:elecha...@gmail.com] Sent: Thursday, July 25, 2013 6:49 PM To: users@mina.apache.org Subject: Re: Does MINA 2.0.4 supports IPV6 Le 7/25/13 1:47 PM, Nitin Phuria a écrit : Hello All, MINA build in BlacklistFilter does not support IPV6 address. If MINA itself supports binding to IPV4 and IPV6 why this restriction was kept in BlacklistFilter. That's a different problem... I checked the org.apache.mina.filter.firewall.Subnet class in MINA sources and found that it specifically checks for Inet4Address if (!(subnet instanceof Inet4Address)) { throw new IllegalArgumentException(Only IPv4 supported); } We are using this filter and now supports only IPV4 Pls advice. Please fill a JIRA, we are going to look at it. ATM, I suggest you remove this check from the code, and see if it works for you. If so, we could then patch MINA, this is probably the fastest way to solve your issue. -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: Does MINA 2.0.4 supports IPV6
Are you using wildcards in the blacklist filter? You could build your own string and pattern based blacklist filter for IPV6 in under 30 minutes. On Fri, Jul 26, 2013 at 3:10 AM, Nitin Phuria nit...@integramicro.comwrote: The issue is registered in JIRA see the below link. https://issues.apache.org/jira/browse/DIRMINA-957 Thanks And Regards, Nitin Phuria -Original Message- From: Emmanuel Lécharny [mailto:elecha...@gmail.com] Sent: Thursday, July 25, 2013 6:49 PM To: users@mina.apache.org Subject: Re: Does MINA 2.0.4 supports IPV6 Le 7/25/13 1:47 PM, Nitin Phuria a écrit : Hello All, MINA build in BlacklistFilter does not support IPV6 address. If MINA itself supports binding to IPV4 and IPV6 why this restriction was kept in BlacklistFilter. That's a different problem... I checked the org.apache.mina.filter.firewall.Subnet class in MINA sources and found that it specifically checks for Inet4Address if (!(subnet instanceof Inet4Address)) { throw new IllegalArgumentException(Only IPv4 supported); } We are using this filter and now supports only IPV4 Pls advice. Please fill a JIRA, we are going to look at it. ATM, I suggest you remove this check from the code, and see if it works for you. If so, we could then patch MINA, this is probably the fastest way to solve your issue. -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Rules
To the MINA mailing list owner. Can we setup a rule requiring the project name in the subject line? e.g. [MINA] , [SSHD]
Re: XML Protocol with initial ASCII handshake
1) You obtain the next filter and call messageReceived there. Mina will automatically wrap the last filter and call the handler. 2) nextFilter.filterWrite(session, new DefaultWriteRequest(out, writeRequest.getFuture(), writeRequest.getDestination())); On Fri, Apr 26, 2013 at 2:45 PM, Max Larsson max.lars...@facilityboss.bizwrote: Hi Emmanuel, i have now a IoFilter which implement the initial connection establishing. But i have two question. 1) In my filter how do i send response to a messageRecived, so that the IoHandler does get informed. 2) The responses are only flushed out, during application shutdown. (J used flip() before sending the buffer via a DefaultWriteRequest down the nextFilter with filterWrite. I think the two questions relates somehow? regards Max On 18.04.13 02:00, Emmanuel Lécharny wrote: Le 4/17/13 7:56 PM, Max Larsson a écrit : Hi Emmanuel, Somehow i habe completly missed The concept of of filters. You are right They seem to fit perfectly. Just a question are iohanders even iofilters? No. They are two different interfaces. The IoHandler just process the events that are being generated by the IoService and propagated through the IoFilters. -- __**__**_ Max Larsson facilityboss GmbH Rheinstrasse 75, 64295 Darmstadt / Germany Handelsregister Darmstadt, HRB 86193 Geschäftsführer: Dipl.-Inform. Max Lars Robert Larsson Mobil: +49 179 2184428 Email: max.lars...@facilityboss.biz
Re: changes the bytes of transmitting byte Array through apache camel mina UDP
+1 for great analogy. On Friday, March 1, 2013 at 9:12 AM, Emmanuel Lécharny wrote: Le 3/1/13 9:50 AM, Tejas Patel a écrit : Problem : When i transmit the byte array of [56, 34, 0, 4, -79, 1] from one device to another device on using Apache Camel Mina UDP endpoint, at receiver side byte Array is changed like [56, 34, 0, 4, -17, -65, -67, 1]. but when i transmit byte array like [56,34,0,4,78,0] from one device to another using same approach it will receive same byte array. Can you suggest me how to resolve the issue? No. Your desciption is at best extremely vague. It's like if you are asking why a plane has crashed without giving us nothing but a picture of the crashed plane... -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com (http://www.iktek.com)
Fw: Session Closed
I'm looking for how Mina is determining a close from NIO. Since NIO does not have any direct method to detect closure.(without calling write/read and getting a -1) On Friday, January 18, 2013 at 9:37 AM, Emmanuel Lécharny wrote: Le 1/18/13 2:48 PM, Jon V a écrit : Emmanuel, I am trying to find out how Mina is detecting Session closures for 2.0.7. Source searches do not seem to help. Can you point me in the right direction? Depends. - If the session is cleanly closed, your IoHandler will received a SessionClosed event. You just have to implement the sessionClosed( IoSession ) method in your IoHandler. - If the session is brutally closed, like when you unplug your network cable from the socket, the remote peer will never be informed. the only solutio is to check for the session idleness. When a session becomes idle (the idle delay is configurable), you will received a SessionIdle event. You have to implement the sessionIdle( IoSession ) method to trap this event and decide if the session has to be deleted. Is this what you are looking for ? -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com (http://www.iktek.com)
Mina Core 2.0.7 build fails from source zip
I am trying to patch a bug in the IoBuffer caching and it won't build unless I remove the tests from the pom.xml [INFO] [INFO] BUILD FAILURE [INFO] [INFO] Total time: 1:36.140s [INFO] Finished at: Thu Jan 03 10:44:28 EST 2013 [INFO] Final Memory: 18M/486M [INFO] [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.2:test (default-test) on project mina-core: There are test failures. [ERROR] [ERROR] Please refer to C:\Users\Administrator\Downloads\apache-mina-2.0.7-src (2)\apache-mina-2.0.7\src\mina-core\target\surefire-reports for the individual test results. [ERROR] - [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException C:\Users\Administrator\Downloads\apache-mina-2.0.7-src (2)\apache-mina-2.0.7\src\mina-core Running org.apache.mina.transport.socket.nio.SocketConnectorTest 8,1,org.apache.mina.transport.socket.nio.SocketConnectorTest,testConnectFutureFailureTiming(org.apache.mina.transport.socket.nio.SocketConnectorTest),null,null,null,null,java.lang.AssertionError\r\n\tat org.junit.Assert.fail(Assert.java:92)\r\n\tat org.junit.Assert.fail(Assert.java:100)\r\n\tat org.apache.mina.transport.AbstractConnectorTest.testConnectFutureFailureTiming(AbstractConnectorTest.java:121)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.lang.reflect.Method.invoke(Method.java:601)\r\n\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)\r\n\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)\r\n\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)\r\n\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)\r\n\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)\r\n\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)\r\n\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)\r\n\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)\r\n\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)\r\n\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)\r\n\tat org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)\r\n\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)\r\n\tat org.junit.runners.ParentRunner.run(ParentRunner.java:300)\r\n\tat org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)\r\n\tat org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)\r\n\tat org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.lang.reflect.Method.invoke(Method.java:601)\r\n\tat org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)\r\n\tat org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)\r\n\tat org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)\r\n\tat org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:113)\r\n\tat org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)\r\n 5,1,org.apache.mina.transport.socket.nio.SocketConnectorTest,testConnectFutureSuccessTiming(org.apache.mina.transport.socket.nio.SocketConnectorTest),null,null,null 6,1,org.apache.mina.transport.socket.nio.SocketConnectorTest,testConnectFutureSuccessTiming(org.apache.mina.transport.socket.nio.SocketConnectorTest),null,null,null 5,1,org.apache.mina.transport.socket.nio.SocketConnectorTest,testSessionCallbackInvocation(org.apache.mina.transport.socket.nio.SocketConnectorTest),null,null,null 6,1,org.apache.mina.transport.socket.nio.SocketConnectorTest,testSessionCallbackInvocation(org.apache.mina.transport.socket.nio.SocketConnectorTest),null,null,null 2,1,org.apache.maven.surefire.junit4.JUnit4Provider,org.apache.mina.transport.socket.nio.SocketConnectorTest,null,null,null
Patch for IoBuffer management in IoProcessor 2.0.7
Sorry that this is the entire file. I don't have it checked out with subversion to create typical patches. Basically, there are two places where I call free() to release the IoBuffer memory. The CachedBufferAllocator is totally broken but I am able to get 100% recycled Buffers with a custom implementation that I will be happy to submit back once I have tested it properly.
Re: Patch for IoBuffer management in IoProcessor 2.0.7
JIRA location? On Thu, Jan 3, 2013 at 11:35 AM, Emmanuel Lécharny elecha...@gmail.comwrote: Le 1/3/13 5:12 PM, Jon V. a écrit : Sorry that this is the entire file. I don't have it checked out with subversion to create typical patches. Basically, there are two places where I call free() to release the IoBuffer memory. The CachedBufferAllocator is totally broken but I am able to get 100% recycled Buffers with a custom implementation that I will be happy to submit back once I have tested it properly. Hi ! the patch has been discarded by the mailer. Could you create a JIRA and attach the patch ? Many thanks ! -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: Patch for IoBuffer management in IoProcessor 2.0.7
https://issues.apache.org/jira/browse/DIRMINA-929 On Thu, Jan 3, 2013 at 3:24 PM, Arnaud bourree arnaud.bour...@gmail.comwrote: http://issues.apache.org/jira/browse/DIRMINA 2013/1/3 Jon V. sybersn...@gmail.com: JIRA location? On Thu, Jan 3, 2013 at 11:35 AM, Emmanuel Lécharny elecha...@gmail.com wrote: Le 1/3/13 5:12 PM, Jon V. a écrit : Sorry that this is the entire file. I don't have it checked out with subversion to create typical patches. Basically, there are two places where I call free() to release the IoBuffer memory. The CachedBufferAllocator is totally broken but I am able to get 100% recycled Buffers with a custom implementation that I will be happy to submit back once I have tested it properly. Hi ! the patch has been discarded by the mailer. Could you create a JIRA and attach the patch ? Many thanks ! -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
Re: FilterChain instantiation
I sent this email to the list yesterday but apparently I wasn't fully subscribed. Can someone please forward any responses. Thank you. -- Jon V Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Tuesday, December 11, 2012 at 9:58 PM, Jon V wrote: Hi Guys, I am trying to find out some information on how instances of the filter chain is created. 1. Is the filter chain assembled on the acceptor global or is a duplicate created for every session? 2. Does mina wait for an operation on a given session to complete before invoking the next one? (next polling interval) both the decoder and encoder must be monotomic. I need to know if I should plan for enforcing single thread processing.
Re: FilterChain instantiation
Emanuel, Thank you for the reply. Since the mailing list system was not sending me replies, I was able to gain access to the replies through the apache mail archives system. I wrote monotomic which is a mis-spelling (lets blame it on the auto-correction in Mac OSX) for monotonic. Monotonic, by nature means that an ordering mechanism must always be progressing forward and in order.(guaranteed order) e.g. 1,2,3,4,5 I will expand on my second question. 1. Lets say that there are 4 polling threads and one session. 2. Mina fires off messageReceived #1 during one polling cycle. Protocol chain is executing. 3. Another polling cycle comes around, the session has new information in the buffer. 4. Will Mina fire off the new buffer while the previous cycle is still executing? say it takes longer than the polling cycle to complete processing of the data. Since my protocol is single threaded, do I need to make it aware of multi threaded attempts to invoke it? -- Jon V Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Wednesday, December 12, 2012 at 6:06 PM, Jon V wrote: I sent this email to the list yesterday but apparently I wasn't fully subscribed. Can someone please forward any responses. Thank you. -- Jon V Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Tuesday, December 11, 2012 at 9:58 PM, Jon V wrote: Hi Guys, I am trying to find out some information on how instances of the filter chain is created. 1. Is the filter chain assembled on the acceptor global or is a duplicate created for every session? 2. Does mina wait for an operation on a given session to complete before invoking the next one? (next polling interval) both the decoder and encoder must be monotomic. I need to know if I should plan for enforcing single thread processing.
FilterChain instantiation
Hi Guys, I am trying to find out some information on how instances of the filter chain is created. 1. Is the filter chain assembled on the acceptor global or is a duplicate created for every session? 2. Does mina wait for an operation on a given session to complete before invoking the next one? (next polling interval) both the decoder and encoder must be monotomic. I need to know if I should plan for enforcing single thread processing.