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