JAMES-2420 MailRepositoryURLStore should not add duplicates in a concurrent 
environment


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

Branch: refs/heads/master
Commit: 18ab2d487328fc29da6e5146976001ee5fdb1add
Parents: 87b3b18
Author: benwa <btell...@linagora.com>
Authored: Tue Jun 12 16:01:23 2018 +0700
Committer: benwa <btell...@linagora.com>
Committed: Thu Jun 14 15:17:12 2018 +0700

----------------------------------------------------------------------
 .../utils/InMemoryMailRepositoryStore.java      |  2 +-
 .../api/MailRepositoryUrlStore.java             |  2 +-
 .../api/MailRepositoryUrlStoreContract.java     | 31 ++++++++++++++------
 .../CassandraMailRepositoryUrlStore.java        |  2 +-
 .../jpa/JPAMailRepositoryUrlStore.java          |  2 +-
 .../memory/MemoryMailRepositoryUrlStore.java    |  2 +-
 6 files changed, 27 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/18ab2d48/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
 
b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
index 1d809f5..06c2cf3 100644
--- 
a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
+++ 
b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
@@ -67,7 +67,7 @@ public class InMemoryMailRepositoryStore implements 
MailRepositoryStore, Configu
 
     @Override
     public Stream<MailRepositoryUrl> getUrls() {
-        return urlStore.list();
+        return urlStore.listDistinct();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/18ab2d48/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java
 
b/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java
index f30b332..be53c72 100644
--- 
a/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java
+++ 
b/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java
@@ -25,7 +25,7 @@ public interface MailRepositoryUrlStore {
 
     void add(MailRepositoryUrl url);
 
-    Stream<MailRepositoryUrl> list();
+    Stream<MailRepositoryUrl> listDistinct();
 
     boolean contains(MailRepositoryUrl url);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/18ab2d48/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java
 
b/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java
index 38b7ee4..8260deb 100644
--- 
a/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java
+++ 
b/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java
@@ -31,31 +31,31 @@ public interface MailRepositoryUrlStoreContract {
     MailRepositoryUrl URL_2 = MailRepositoryUrl.from("proto://var/mail/tata");
 
     @Test
-    default void retrieveUsedUrlsShouldBeEmptyByDefault(MailRepositoryUrlStore 
store) {
-        assertThat(store.list()).isEmpty();
+    default void listDistinctShouldBeEmptyByDefault(MailRepositoryUrlStore 
store) {
+        assertThat(store.listDistinct()).isEmpty();
     }
 
     @Test
-    default void retrieveUsedUrlsShouldReturnAddedUrl(MailRepositoryUrlStore 
store) {
+    default void listDistinctShouldReturnAddedUrl(MailRepositoryUrlStore 
store) {
         store.add(URL_1);
 
-        assertThat(store.list()).containsOnly(URL_1);
+        assertThat(store.listDistinct()).containsOnly(URL_1);
     }
 
     @Test
-    default void 
retrieveUsedUrlsShouldNotReturnDuplicates(MailRepositoryUrlStore store) {
+    default void listDistinctShouldNotReturnDuplicates(MailRepositoryUrlStore 
store) {
         store.add(URL_1);
         store.add(URL_1);
 
-        assertThat(store.list()).containsOnly(URL_1);
+        assertThat(store.listDistinct()).containsOnly(URL_1);
     }
 
     @Test
-    default void retrieveUsedUrlsShouldReturnAddedUrls(MailRepositoryUrlStore 
store) {
+    default void listDistinctShouldReturnAddedUrls(MailRepositoryUrlStore 
store) {
         store.add(URL_1);
         store.add(URL_2);
 
-        assertThat(store.list()).containsOnly(URL_1, URL_2);
+        assertThat(store.listDistinct()).containsOnly(URL_1, URL_2);
     }
 
     @Test
@@ -80,7 +80,20 @@ public interface MailRepositoryUrlStoreContract {
         testRunner.awaitTermination(1, TimeUnit.MINUTES);
         testRunner.assertNoException();
 
-        assertThat(store.list()).hasSize(threadCount * operationCount);
+        assertThat(store.listDistinct()).hasSize(threadCount * operationCount);
+    }
+
+    @Test
+    default void 
addShouldNotAddDuplicatesInConcurrentEnvironment(MailRepositoryUrlStore store) 
throws Exception {
+        int operationCount = 10;
+        int threadCount = 10;
+        ConcurrentTestRunner testRunner = new 
ConcurrentTestRunner(threadCount, operationCount,
+            (a, b) -> store.add(MailRepositoryUrl.from("proto://" + b)))
+            .run();
+        testRunner.awaitTermination(1, TimeUnit.MINUTES);
+        testRunner.assertNoException();
+
+        assertThat(store.listDistinct()).hasSize(operationCount);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/18ab2d48/server/data/data-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStore.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStore.java
 
b/server/data/data-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStore.java
index 9d9fc02..b4c482a 100644
--- 
a/server/data/data-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStore.java
+++ 
b/server/data/data-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStore.java
@@ -41,7 +41,7 @@ public class CassandraMailRepositoryUrlStore implements 
MailRepositoryUrlStore {
     }
 
     @Override
-    public Stream<MailRepositoryUrl> list() {
+    public Stream<MailRepositoryUrl> listDistinct() {
         return urlsDao.retrieveUsedUrls()
             .join();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/18ab2d48/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
 
b/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
index 068c4f6..ca1b8d2 100644
--- 
a/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
+++ 
b/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
@@ -43,7 +43,7 @@ public class JPAMailRepositoryUrlStore implements 
MailRepositoryUrlStore {
     }
 
     @Override
-    public Stream<MailRepositoryUrl> list() {
+    public Stream<MailRepositoryUrl> listDistinct() {
         return transactionRunner.runAndRetrieveResult(entityManager ->
             entityManager
                 .createNamedQuery("listUrls", JPAUrl.class)

http://git-wip-us.apache.org/repos/asf/james-project/blob/18ab2d48/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java
 
b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java
index 130bd5d..40bd239 100644
--- 
a/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java
+++ 
b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java
@@ -40,7 +40,7 @@ public class MemoryMailRepositoryUrlStore implements 
MailRepositoryUrlStore {
     }
 
     @Override
-    public Stream<MailRepositoryUrl> list() {
+    public Stream<MailRepositoryUrl> listDistinct() {
         return urls.stream();
     }
 


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

Reply via email to