You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2018/07/12 15:37:43 UTC

[05/11] james-project git commit: JAMES-2465 Solve concurrency issue when provisioning mailbox

JAMES-2465 Solve concurrency issue when provisioning mailbox


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2cc467f1
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2cc467f1
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2cc467f1

Branch: refs/heads/master
Commit: 2cc467f11ae9320dce79137fae0b934933360d28
Parents: f23a184
Author: benwa <bt...@linagora.com>
Authored: Thu Jul 12 10:58:29 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jul 12 11:00:00 2018 +0700

----------------------------------------------------------------------
 .../transport/mailets/delivery/MailboxAppender.java      | 10 +++++++++-
 .../transport/mailets/delivery/MailboxAppenderTest.java  | 11 +++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2cc467f1/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
index cd040e3..95e1246 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
@@ -27,13 +27,17 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.server.core.MimeMessageInputStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
 public class MailboxAppender {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MailboxAppender.class);
 
     private final MailboxManager mailboxManager;
 
@@ -83,7 +87,11 @@ public class MailboxAppender {
 
     private void createMailboxIfNotExist(MailboxSession session, MailboxPath path) throws MailboxException {
         if (!mailboxManager.mailboxExists(path, session)) {
-            mailboxManager.createMailbox(path, session);
+            try {
+                mailboxManager.createMailbox(path, session);
+            } catch (MailboxExistsException e) {
+                LOGGER.info("Mailbox {} have been created concurrently", path);
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2cc467f1/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
index 22e2e9f..914aba9 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
@@ -35,8 +35,10 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.MessageResultIterator;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.RepeatedTest;
 import org.junit.jupiter.api.Test;
 
 public class MailboxAppenderTest {
@@ -120,4 +122,13 @@ public class MailboxAppenderTest {
 
         assertThat(messages).hasSize(1);
     }
+
+    @RepeatedTest(20)
+    void appendShouldNotFailInConcurrentEnvironment() throws Exception {
+        ConcurrentTestRunner.builder()
+            .threadCount(100)
+            .build((a, b) -> testee.append(mimeMessage, USER, FOLDER + "/any"))
+            .run()
+            .assertNoException();
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org