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 ma...@apache.org on 2019/06/14 16:32:57 UTC

[james-project] 06/09: JAMES-2704 Fix randomness of RandomStoring mailet

This is an automated email from the ASF dual-hosted git repository.

matthieu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1487aa7c3e3b46bd36a6b003aabcacbcc86a341b
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Thu Jun 13 14:53:11 2019 +0200

    JAMES-2704 Fix randomness of RandomStoring mailet
---
 .../apache/james/smtp/SmtpRandomStoringTest.java   |  4 ++--
 .../james/transport/mailets/RandomStoring.java     | 22 +++++++++++-----------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpRandomStoringTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpRandomStoringTest.java
index 81f8958..08b6ab5 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpRandomStoringTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpRandomStoringTest.java
@@ -142,7 +142,7 @@ public class SmtpRandomStoringTest {
         SMTPMessageSender authenticatedSmtpConnection = messageSender.connect(LOCALHOST_IP, jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
                 .authenticate(FROM, PASSWORD);
 
-        IntStream.range(1, numberOfMails)
+        IntStream.range(0, numberOfMails)
             .forEach(Throwing.intConsumer(index ->
                 authenticatedSmtpConnection
                     .sendMessage(buildMail("Message " + index))).sneakyThrow());
@@ -155,7 +155,7 @@ public class SmtpRandomStoringTest {
         awaitAtMostTenSeconds
             .untilAsserted(() -> checkMailboxesHaveBeenFilled(connections, numberOfMails));
 
-        connections.forEach(Throwing.consumer(IMAPMessageReader::close));
+        connections.forEach(Throwing.consumer(IMAPMessageReader::close).sneakyThrow());
     }
 
     private IMAPMessageReader createIMAPConnection(String username) {
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
index 783fb56..eabcf60 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
@@ -21,12 +21,10 @@ package org.apache.james.transport.mailets;
 
 import java.time.Duration;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ThreadLocalRandom;
-import java.util.stream.Collectors;
+import java.util.function.Supplier;
 import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.mail.MessagingException;
@@ -59,13 +57,13 @@ public class RandomStoring extends GenericMailet {
     private final Mono<List<ReroutingInfos>> reroutingInfos;
     private final UsersRepository usersRepository;
     private final MailboxManager mailboxManager;
-    private final Iterator<Integer> randomRecipientsNumbers;
+    private final Supplier<Integer> randomRecipientsNumbers;
 
     @Inject
     public RandomStoring(UsersRepository usersRepository, MailboxManager mailboxManager) {
         this.usersRepository = usersRepository;
         this.mailboxManager = mailboxManager;
-        this.randomRecipientsNumbers = ThreadLocalRandom.current().ints(MIN_NUMBER_OF_RECIPIENTS, MAX_NUMBER_OF_RECIPIENTS + 1).boxed().iterator();
+        this.randomRecipientsNumbers = () -> ThreadLocalRandom.current().nextInt(MIN_NUMBER_OF_RECIPIENTS, MAX_NUMBER_OF_RECIPIENTS + 1);
         this.reroutingInfos = Mono.fromCallable(this::retrieveReroutingInfos).cache(CACHE_DURATION);
     }
 
@@ -93,11 +91,14 @@ public class RandomStoring extends GenericMailet {
 
     private Collection<ReroutingInfos> generateRandomMailboxes() {
         List<ReroutingInfos> reroutingInfos = this.reroutingInfos.block();
-        Collections.shuffle(reroutingInfos);
 
-        return reroutingInfos
-            .stream()
-            .limit(randomRecipientsNumbers.next())
+        // Replaces Collections.shuffle() which has a too poor statistical distribution
+        return ThreadLocalRandom
+            .current()
+            .ints(0, reroutingInfos.size())
+            .mapToObj(reroutingInfos::get)
+            .distinct()
+            .limit(randomRecipientsNumbers.get())
             .collect(Guavate.toImmutableSet());
     }
 
@@ -105,8 +106,7 @@ public class RandomStoring extends GenericMailet {
         return Streams.stream(usersRepository.list())
             .map(User::fromUsername)
             .flatMap(this::buildReRoutingInfos)
-            .distinct()
-            .collect(Collectors.toList());
+            .collect(Guavate.toImmutableList());
     }
 
     private Stream<ReroutingInfos> buildReRoutingInfos(User user) {


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