This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 18922f05b0 [FIX] IDLE - prevent data race upon answers on channel
writes (#2525)
18922f05b0 is described below
commit 18922f05b0c628a75c5bc0018b0b94b38e4a453d
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Dec 2 16:14:17 2024 +0100
[FIX] IDLE - prevent data race upon answers on channel writes (#2525)
---
.../org/apache/james/imap/api/process/ImapSession.java | 4 ++++
.../org/apache/james/imap/processor/IdleProcessor.java | 2 +-
.../apache/james/imapserver/netty/NettyImapSession.java | 17 +++++++++++++++++
3 files changed, 22 insertions(+), 1 deletion(-)
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
b/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
index a95ef8a04a..e55c595301 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
@@ -102,6 +102,10 @@ public interface ImapSession extends
CommandDetectionSession {
runnable.run();
}
+ default ImapProcessor.Responder threadSafe(ImapProcessor.Responder
responder) {
+ return responder;
+ }
+
/**
* Logs out the session. Marks the connection for closure;
*/
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
index e4c3830f72..322d58f2be 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
@@ -173,7 +173,7 @@ public class IdleProcessor extends
AbstractMailboxProcessor<IdleRequest> impleme
public IdleMailboxListener(ImapSession session, Responder responder,
CountDownLatch countDownLatch) {
this.session = session;
- this.responder = responder;
+ this.responder = session.threadSafe(responder);
this.countDownLatch = countDownLatch;
}
diff --git
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
index 22d6614c89..7ec85cdcab 100644
---
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
+++
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
@@ -32,7 +32,9 @@ import javax.net.ssl.SSLSession;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.james.core.Username;
import org.apache.james.imap.api.ImapSessionState;
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
import org.apache.james.imap.api.process.ImapLineHandler;
+import org.apache.james.imap.api.process.ImapProcessor;
import org.apache.james.imap.api.process.ImapSession;
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.encode.ImapResponseWriter;
@@ -113,6 +115,21 @@ public class NettyImapSession implements ImapSession,
NettyConstants {
});
}
+ @Override
+ public ImapProcessor.Responder threadSafe(ImapProcessor.Responder
responder) {
+ return new ImapProcessor.Responder() {
+ @Override
+ public void respond(ImapResponseMessage message) {
+ channel.eventLoop().execute(() -> responder.respond(message));
+ }
+
+ @Override
+ public void flush() {
+ channel.eventLoop().execute(responder::flush);
+ }
+ };
+ }
+
@Override
public Mono<Void> logout() {
return closeMailbox()
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]