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 <[email protected]> Authored: Thu Jul 12 10:58:29 2018 +0700 Committer: benwa <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
