Hello,

First, I want to say that I’m not sure it’s a problem in Mina or the way we use 
it in our project.

Context and mina version:
I’m currently trying to upgrade the mina version used in my project from mina 
2.0.7 to 2.1.X (first trying to 2.1.7 then maybe to 2.1.10).

The problem :
The class AbstractIoSession has a member scheduledWriteMessages. It is 
increased when HeadFilter.filterWrite is called (file 
DefaultIoFilterChain.java) ; then it is decreased when the message is sent.
In my problematic case, I use a ProtocolCodecFilter and for some message, when 
the filterWrite method is called, it goes into this while loop :

// Code in ProtocolCodecFilter.java
            // Write all the encoded messages now
            while (!bufferQueue.isEmpty()) {
                Object encodedMessage = bufferQueue.poll();

                if (encodedMessage == null) {
                    break;
                }

                // Flush only when the buffer has remaining.
                if (!(encodedMessage instanceof IoBuffer) || ((IoBuffer) 
encodedMessage).hasRemaining()) {
                    if (bufferQueue.isEmpty()) {
                        writeRequest.setMessage(encodedMessage);
                        nextFilter.filterWrite(session, writeRequest);
                    } else {
                        SocketAddress destination = 
writeRequest.getDestination();
                        WriteRequest encodedWriteRequest = new 
EncodedWriteRequest(encodedMessage, null, destination);
                        nextFilter.filterWrite(session, encodedWriteRequest);
                    }
                }
            }
// Fin Code in ProtocolCodecFilter.java

Here we see 2 calls of nextFilter.filterWrite. In my case, the loop is done 3 
times so nextFilter.filterWrite is called 2 times with a new 
EncodedWriteRequest and once (the last) by passing the processed WriteRequest. 
Those 3 calls end up to HeadFilter.filterWrite and so scheduledWriteMessages is 
then equal to 3. When the message is sent, scheduledWriteMessages is decreased 
only once so now scheduledWriteMessages is 2.

I’ve noticed the problem appeared in 2.1.1 with this commit : “2d08d53 - Pushed 
my current changes related to the filterWrite refactoring”
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
--- 
a/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
+++ 
b/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
@@ -907,4 +906,2 @@
-            if (!writeRequest.isEncoded()) {
-                s.increaseScheduledWriteMessages();
-            }
+            s.increaseScheduledWriteMessages();

So before this commit, increaseScheduledWriteMessages was called only once as 
the 2 first time the writeRequest isEncoded.

This scheduledWriteMessages is not used in mina (src or test), but in my 
project, we used it to check connection problems. As a temporary fix, I just 
removed the use of scheduledWriteMessages; and I thought a possible patch for 
mina would be to recheck the isEncoded like in 2.1.0.

BUT ! Then I tried using mina 2.1.10 and a new problem arise with the same 
message. So, a bit more of context:

  *   The client sends the problematic request message
  *   The server receives the request (triggering the 3 scheduledWriteMessages 
increase)
  *   The it sends the associated response.
With mina 2.1.7, the client received one response and everything works after 
that, but not with mina 2.1.10 where for the next good request I receive a 
response for the previous problematic request and then the good response.
For clarity let’s call the problematic request and response PRqst and PResp , 
and let’s call anther Good Request/Response GRqst/GResp. From my client I see 
that :

  *   Send PRqst
  *   Receive PResp
  *   Wait some time // The problem appears wether I add this wait or not
  *   Send GRqst
  *   Receive PResp
  *   Receive GResp

So, because of this problem, I don’t know if it is a problem in Mina or how I 
use it. I searched the commits between 2.1.7 and 2.1.10 for clues, but could 
not find anything.
If someone could give me some more info, that would be great 😊

Thanks, and have a nice day.

RM

Reply via email to