MAILBOX-343 Concurrently creating mailbox hierarchy should not fail
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/83c24e19 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/83c24e19 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/83c24e19 Branch: refs/heads/master Commit: 83c24e192ff31c7a43b4144413d5956cf00171dc Parents: 0262feb Author: benwa <[email protected]> Authored: Sat Jul 14 16:28:29 2018 +0700 Committer: benwa <[email protected]> Committed: Tue Jul 17 17:24:33 2018 +0700 ---------------------------------------------------------------------- mailbox/api/pom.xml | 5 +++++ .../apache/james/mailbox/MailboxManagerTest.java | 16 ++++++++++++++++ .../james/mailbox/jpa/JPAMailboxManagerTest.java | 9 +++++++++ .../james/mailbox/store/StoreMailboxManager.java | 11 +++++++---- 4 files changed, 37 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/83c24e19/mailbox/api/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/api/pom.xml b/mailbox/api/pom.xml index 867178e..31d0cd5 100644 --- a/mailbox/api/pom.xml +++ b/mailbox/api/pom.xml @@ -38,6 +38,11 @@ </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>james-server-util</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>james-server-util-java8</artifactId> </dependency> <dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/83c24e19/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java index 2f42eec..796d80e 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java @@ -25,6 +25,7 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; +import java.util.concurrent.TimeUnit; import javax.mail.Flags; @@ -47,6 +48,7 @@ import org.apache.james.mailbox.model.SearchQuery; import org.apache.james.mailbox.model.search.MailboxQuery; import org.apache.james.mailbox.util.EventCollector; import org.apache.james.mime4j.dom.Message; +import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.assertj.core.api.JUnitSoftAssertions; import org.junit.Assume; import org.junit.Rule; @@ -951,4 +953,18 @@ public abstract class MailboxManagerTest { assertThatCode(() -> mailboxManager.copyMessages(MessageRange.all(), inbox, inbox, session)) .doesNotThrowAnyException(); } + + @Test + public void creatingConcurrentlyMailboxesWithSameParentShouldNotFail() throws Exception { + MailboxSession session = mailboxManager.createSystemSession(USER_1); + String mailboxName = "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z"; + + ConcurrentTestRunner testRunner = ConcurrentTestRunner.builder() + .threadCount(10) + .build( + (a, b) -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, mailboxName + a), session)) + .run(); + testRunner.awaitTermination(1, TimeUnit.MINUTES); + testRunner.assertNoException(); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/83c24e19/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java index 3c75021..5164cf7 100644 --- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java +++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java @@ -27,6 +27,8 @@ import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; public class JPAMailboxManagerTest extends MailboxManagerTest { @@ -53,4 +55,11 @@ public class JPAMailboxManagerTest extends MailboxManagerTest { JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES); } + @Ignore("MAILBOX-343") + @Test + @Override + public void creatingConcurrentlyMailboxesWithSameParentShouldNotFail() { + + } + } http://git-wip-us.apache.org/repos/asf/james-project/blob/83c24e19/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index da20bea..31307fa 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -505,10 +505,13 @@ public class StoreMailboxManager implements MailboxManager { if (!mailboxExists(mailbox, mailboxSession)) { Mailbox m = doCreateMailbox(mailbox, mailboxSession); MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); - mapper.execute(Mapper.toTransaction(() -> mailboxIds.add(mapper.save(m)))); - - // notify listeners - dispatcher.mailboxAdded(mailboxSession, m); + try { + mapper.execute(Mapper.toTransaction(() -> mailboxIds.add(mapper.save(m)))); + // notify listeners + dispatcher.mailboxAdded(mailboxSession, m); + } catch (MailboxExistsException e) { + LOGGER.info("{} mailbox was created concurrently", m.generateAssociatedPath()); + } } return null; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
