[
https://issues.apache.org/jira/browse/DIRMINA-1027?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15133933#comment-15133933
]
Michael Kohlsche commented on DIRMINA-1027:
-------------------------------------------
I’m sorry again for been not clear enough. The problem occurs in the releases
2.0.9, 2.0.11 and with my own build from the 2.0-branch. The (in my opinion)
problematic method looks the same in all these builds:
{code:title=SslHandler.java}
/* no qualifier */void flushScheduledEvents() {
// Fire events only when the lock is available for this handler.
IoFilterEvent event;
try {
sslLock.lock();
// We need synchronization here inevitably because filterWrite can be
// called simultaneously and cause 'bad record MAC' integrity error.
while ((event = filterWriteEventQueue.poll()) != null) {
final NextFilter nextFilter = event.getNextFilter();
nextFilter.filterWrite(session, (WriteRequest)event.getParameter());
}
while ((event = messageReceivedEventQueue.poll()) != null) {
final NextFilter nextFilter = event.getNextFilter();
nextFilter.messageReceived(session, event.getParameter());
}
}
finally {
sslLock.unlock();
}
}
{code}
After changing this part to something like Terence Marks provided in his
fix.java inside the ticket
[DIRMINA-1019|https://issues.apache.org/jira/browse/DIRMINA-1019] the problem
disappeared. My working solution looks like this:
{code:title=SslHandler.java}
private final AtomicInteger scheduled_events = new AtomicInteger(0);
...
/* no qualifier */void flushScheduledEvents() {
scheduled_events.incrementAndGet();
// Fire events only when the lock is available for this handler.
if (sslLock.tryLock()) {
IoFilterEvent event;
// We need synchronization here inevitably because filterWrite can be
// called simultaneously and cause 'bad record MAC' integrity error.
try {
do {
while ((event = filterWriteEventQueue.poll()) != null) {
final NextFilter nextFilter = event.getNextFilter();
nextFilter.filterWrite(session, (WriteRequest)event.getParameter());
}
while ((event = messageReceivedEventQueue.poll()) != null) {
final NextFilter nextFilter = event.getNextFilter();
nextFilter.messageReceived(session, event.getParameter());
}
}
while (scheduled_events.decrementAndGet() > 0);
}
finally {
sslLock.unlock();
}
}
}
{code}
I’m not sure if this fixes the real problem or if it just hides the symptoms.
> SSLHandler writes corrupt messages under heavy load
> ---------------------------------------------------
>
> Key: DIRMINA-1027
> URL: https://issues.apache.org/jira/browse/DIRMINA-1027
> Project: MINA
> Issue Type: Bug
> Components: SSL
> Affects Versions: 2.0.11
> Reporter: Michael Kohlsche
> Priority: Critical
>
> I’m facing a critical problem in my project with an MINA-stack including SSL.
> My Protocol-IoFilterAdapter receives corrupt messages under heavy load
> (JMeter-Benchmark with 300 Threads and round about 5-10 MINA-calls per
> thread). The Problem disappeared without SSL, so I debugged for some days,
> and I think the problem occurred because of the changes made for fixing the
> issue https://issues.apache.org/jira/browse/DIRMINA-1019
> (http://git-wip-us.apache.org/repos/asf/mina/commit/9b5c07f9). I think the
> problem is that the SSLHandler is calling messageReceived while also writing
> data into the next filter, which is writing inside the
> messageReceivedEventQueue. With the fix provided inside the
> race-condition-ticket, it works like a charm. So I think that the answer of
> the question "Why the second loop is also protected by the loop?" is: because
> otherwise the messageReceivedEventQueue is gets corrupted data...
> (I hope I’m not wrong and anybody can follow my thoughts and maybe bad
> English xD)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)