Session.close (indirectly Producer.close) should wait async execution buffers to be
emptied before closing channels
-------------------------------------------------------------------------------------------------------------------
Key: JBMESSAGING-1171
URL:
http://jira.jboss.com/jira/browse/JBMESSAGING-1171
Project: JBoss Messaging
Issue Type: Bug
Reporter: Clebert Suconic
Assigned To: Tim Fox
Fix For: 1.4.0.SP2
To easily replicate this, use
org.jboss.test.messaging.jms.stress.SeveralClientsStressTest
At your workspace you could lower the total time for the execution. (I will have attached
a patch on this JIRA)
protected static long PRODUCER_ALIVE_FOR=5000; // originalValue=60000
protected static long CONSUMER_ALIVE_FOR=5000; // originalValue=60000
protected static long TEST_ALIVE_FOR=15000; // originalValue = 5 * 60 * 1000
protected static int NUMBER_OF_PRODUCERS=50;
protected static int NUMBER_OF_CONSUMERS=50;
The test is loosing messages on this following condition:
- you have N Threads, each Thread equals one Producer, sending messages at a constant
rate.
- Each message is sent asynchronously
- After some time the Thread decides to stop producing messages, and immediately closes
the session.
- Any message that hasn't been sent to the server yet would be lost.
How to validate what I'm talking about:
Run the testcase as is (lowering the time as I said before on this message).
You will see a warning at the end of the test with non processed messages:
@main 17:51:50,486 WARN [SeveralClientsStressTest] Message non processed, txt="msg
prod#38 seq#31", msgToString=[delegator->JBossMessage[463]:NON-PERSISTENT,
deliveryId=0]
@main 17:51:50,486 WARN [SeveralClientsStressTest] Message non processed, txt="msg
prod#38 seq#29", msgToString=[delegator->JBossMessage[434]:NON-PERSISTENT,
deliveryId=0]
@main 17:51:50,486 WARN [SeveralClientsStressTest] Message non processed, txt="msg
prod#38 seq#24", msgToString=[delegator->JBossMessage[339]:NON-PERSISTENT,
deliveryId=0]
@main 17:51:50,486 WARN [SeveralClientsStressTest] Message non processed, txt="msg
prod#38 seq#26", msgToString=[delegator->JBossMessage[374]:NON-PERSISTENT,
deliveryId=0]
If you look on logs you will realize that any message appearing on this list didn't
make to the server. and it will aways coincide with the very few last messages sent on
this thread.
If you put a Thread.sleep(10000); before the conn.close() on
SeveralClientsStressTest.Producer (line 422) the test will pass:
Thread.sleep(10000);
finally
{
Thread.sleep(10000);
conn.close();
}
- Somehow producer.close / session.close should empty the async buffer before closing the
session.
I have attached a patch for this test.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira