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 bt...@apache.org on 2018/07/17 10:25:04 UTC

[12/12] james-project git commit: MAILBOX-343 Concurrently creating mailbox hierarchy should not fail

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 <bt...@linagora.com>
Authored: Sat Jul 14 16:28:29 2018 +0700
Committer: benwa <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org