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 2019/05/21 03:14:32 UTC

[james-project] branch master updated (48e0e83 -> 5dc293c)

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

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


    from 48e0e83  JAMES-2765 TimeOut values was implicit
     new 2537481  JAMES-2711 Correct documentation for Deleted Messages Vault feature
     new e2ff5b5  JAMES-2696 Fix s/LMPT/LMTP typo on main documentation page
     new 067c074  JAMES-2763 StartUp check need to provide it name
     new ca24df5  JAMES-2763 StartUpChecks should catch exceptions during checking
     new 2e361b2  JAMES-2765 Avoid scrolling for quota search
     new 5dc293c  JAMES-2774 Restart docker RabbitMQ each tests in RabbitMQEventBusTest

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../james/mailbox/events/RabbitMQEventBusTest.java | 19 +++++++-
 .../elasticsearch/ElasticSearchQuotaSearcher.java  | 34 ++++++-------
 .../CassandraSchemaVersionStartUpCheck.java        | 15 ++++--
 .../org/apache/james/StartUpChecksPerformer.java   | 17 ++++++-
 .../apache/james/StartUpChecksPerformerTest.java   | 57 ++++++++++++++++++----
 .../james/GuiceJamesServerStartUpCheckTest.java    | 21 ++++++--
 src/site/markdown/server/manage-webadmin.md        | 19 +++++---
 src/site/xdoc/documentation.xml                    |  2 +-
 8 files changed, 138 insertions(+), 46 deletions(-)


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


[james-project] 03/06: JAMES-2763 StartUp check need to provide it name

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 067c074905c5f17fd2718d7db1bcd67e0c34012b
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon May 20 15:15:53 2019 +0700

    JAMES-2763 StartUp check need to provide it name
    
    In case if there is an exception thrown during the check, we still can
    able to get the proper check name and log the result accordingly
---
 .../CassandraSchemaVersionStartUpCheck.java        | 15 ++++--
 .../org/apache/james/StartUpChecksPerformer.java   |  2 +
 .../apache/james/StartUpChecksPerformerTest.java   | 59 ++++++++++++++++++----
 .../james/GuiceJamesServerStartUpCheckTest.java    | 21 ++++++--
 4 files changed, 80 insertions(+), 17 deletions(-)

diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheck.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheck.java
index 0e6b24a..561b8aa 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheck.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheck.java
@@ -54,13 +54,18 @@ public class CassandraSchemaVersionStartUpCheck implements StartUpChecksPerforme
                 String unknownSchemaStateMessage = "Unknown schema state " + schemaState;
                 LOGGER.error(unknownSchemaStateMessage);
                 return CheckResult.builder()
-                    .checkName(CHECK_NAME)
+                    .checkName(checkName())
                     .resultType(ResultType.BAD)
                     .description(unknownSchemaStateMessage)
                     .build();
         }
     }
 
+    @Override
+    public String checkName() {
+        return CHECK_NAME;
+    }
+
     private CheckResult checkUpgradeAbleState() {
         String upgradeVersionMessage =
             String.format("Current schema version is %d. Recommended version is %d",
@@ -68,7 +73,7 @@ public class CassandraSchemaVersionStartUpCheck implements StartUpChecksPerforme
                 versionManager.getMaximumSupportedVersion().getValue());
         LOGGER.warn(upgradeVersionMessage);
         return CheckResult.builder()
-            .checkName(CHECK_NAME)
+            .checkName(checkName())
             .resultType(ResultType.GOOD)
             .description(upgradeVersionMessage)
             .build();
@@ -78,7 +83,7 @@ public class CassandraSchemaVersionStartUpCheck implements StartUpChecksPerforme
         String message = "Schema version is up-to-date";
         LOGGER.info(message);
         return CheckResult.builder()
-            .checkName(CHECK_NAME)
+            .checkName(checkName())
             .resultType(ResultType.GOOD)
             .description(message)
             .build();
@@ -93,7 +98,7 @@ public class CassandraSchemaVersionStartUpCheck implements StartUpChecksPerforme
                 versionManager.getMaximumSupportedVersion().getValue());
         LOGGER.error(versionExceedMaximumSupportedMessage);
         return CheckResult.builder()
-            .checkName(CHECK_NAME)
+            .checkName(checkName())
             .resultType(ResultType.BAD)
             .description(versionExceedMaximumSupportedMessage)
             .build();
@@ -108,7 +113,7 @@ public class CassandraSchemaVersionStartUpCheck implements StartUpChecksPerforme
                 versionManager.getMaximumSupportedVersion().getValue());
         LOGGER.error(versionToOldMessage);
         return CheckResult.builder()
-            .checkName(CHECK_NAME)
+            .checkName(checkName())
             .resultType(ResultType.BAD)
             .description(versionToOldMessage)
             .build();
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java b/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java
index e047e97..0dead1a 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java
@@ -166,6 +166,8 @@ public class StartUpChecksPerformer {
         }
 
         CheckResult check();
+
+        String checkName();
     }
 
     static class StartUpChecks {
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java b/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java
index c3750d2..53b9064 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.StartUpChecksPerformer.StartUpCheck.CheckResult;
 import org.apache.james.StartUpChecksPerformer.StartUpCheck.ResultType;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 class StartUpChecksPerformerTest {
@@ -46,11 +47,26 @@ class StartUpChecksPerformerTest {
         .resultType(ResultType.BAD)
         .build();
 
+    private static StartUpChecksPerformer.StartUpCheck fromResult(CheckResult checkResult) {
+        return new StartUpChecksPerformer.StartUpCheck() {
+
+            @Override
+            public CheckResult check() {
+                return checkResult;
+            }
+
+            @Override
+            public String checkName() {
+                return checkResult.getName();
+            }
+        };
+    }
+
     @Test
     void performCheckShouldNotThrowWhenAllChecksSucceed() {
         StartUpChecksPerformer checksPerformer = StartUpChecksPerformer.from(
-            () -> GOOD_CHECK_1,
-            () -> GOOD_CHECK_2);
+            fromResult(GOOD_CHECK_1),
+            fromResult(GOOD_CHECK_2));
 
         assertThatCode(checksPerformer::performCheck)
             .doesNotThrowAnyException();
@@ -67,9 +83,9 @@ class StartUpChecksPerformerTest {
     @Test
     void performCheckShouldThrowWhenThereIsOneCheckFails() {
         StartUpChecksPerformer checksPerformer = StartUpChecksPerformer.from(
-            () -> GOOD_CHECK_1,
-            () -> GOOD_CHECK_2,
-            () -> BAD_CHECK_1);
+            fromResult(GOOD_CHECK_1),
+            fromResult(GOOD_CHECK_2),
+            fromResult(BAD_CHECK_1));
 
         assertThatThrownBy(checksPerformer::performCheck)
             .isInstanceOf(StartUpChecksPerformer.StartUpChecksException.class);
@@ -78,10 +94,10 @@ class StartUpChecksPerformerTest {
     @Test
     void performCheckShouldThrowAnExceptionContainingAllBadChecksWhenThereAreBadChecks() {
         StartUpChecksPerformer checksPerformer = StartUpChecksPerformer.from(
-            () -> GOOD_CHECK_1,
-            () -> GOOD_CHECK_2,
-            () -> BAD_CHECK_1,
-            () -> BAD_CHECK_2);
+            fromResult(GOOD_CHECK_1),
+            fromResult(GOOD_CHECK_2),
+            fromResult(BAD_CHECK_1),
+            fromResult(BAD_CHECK_2));
 
         assertThatThrownBy(checksPerformer::performCheck)
             .isInstanceOfSatisfying(
@@ -89,4 +105,29 @@ class StartUpChecksPerformerTest {
                 exception -> assertThat(exception.getBadChecks())
                     .containsOnly(BAD_CHECK_1, BAD_CHECK_2));
     }
+
+    @Disabled("performCheck() now doesn't support this")
+    @Test
+    void performCheckShouldNotPropagateUnExpectedExceptionDuringChecking() {
+        String checkName = "throwing check name";
+        StartUpChecksPerformer checksPerformer = StartUpChecksPerformer.from(
+
+            new StartUpChecksPerformer.StartUpCheck() {
+                @Override
+                public CheckResult check() {
+                    throw new RuntimeException("unexpected");
+                }
+
+                @Override
+                public String checkName() {
+                    return checkName;
+                }
+            });
+
+        assertThatThrownBy(checksPerformer::performCheck)
+            .isInstanceOfSatisfying(
+                StartUpChecksPerformer.StartUpChecksException.class,
+                exception -> assertThat(exception.badCheckNames())
+                    .containsOnly(checkName));
+    }
 }
\ No newline at end of file
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java
index 08daaf4..ddf136d 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java
@@ -46,10 +46,15 @@ class GuiceJamesServerStartUpCheckTest {
         @Override
         public CheckResult check() {
             return CheckResult.builder()
-                .checkName(CHECK_NAME)
+                .checkName(checkName())
                 .resultType(ResultType.GOOD)
                 .build();
         }
+
+        @Override
+        public String checkName() {
+            return CHECK_NAME;
+        }
     }
 
     private static class FailingStartUpCheck implements StartUpCheck {
@@ -59,11 +64,16 @@ class GuiceJamesServerStartUpCheckTest {
         @Override
         public CheckResult check() {
             return CheckResult.builder()
-                .checkName(CHECK_NAME)
+                .checkName(checkName())
                 .resultType(ResultType.BAD)
                 .description("Failing by intention")
                 .build();
         }
+
+        @Override
+        public String checkName() {
+            return CHECK_NAME;
+        }
     }
 
     private static class TestBlobExportMechanismStartUpCheck implements StartUpCheck {
@@ -81,10 +91,15 @@ class GuiceJamesServerStartUpCheckTest {
         @Override
         public CheckResult check() {
             return CheckResult.builder()
-                .checkName(CHECK_NAME)
+                .checkName(checkName())
                 .resultType(ResultType.GOOD)
                 .build();
         }
+
+        @Override
+        public String checkName() {
+            return CHECK_NAME;
+        }
     }
 
     private static final int LIMIT_TO_10_MESSAGES = 10;


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


[james-project] 02/06: JAMES-2696 Fix s/LMPT/LMTP typo on main documentation page

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e2ff5b50e50987a34034ddad6b818db6c5af1d55
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 20 12:04:05 2019 +0700

    JAMES-2696 Fix s/LMPT/LMTP typo on main documentation page
---
 src/site/xdoc/documentation.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/site/xdoc/documentation.xml b/src/site/xdoc/documentation.xml
index 9805ee2..490dbef 100644
--- a/src/site/xdoc/documentation.xml
+++ b/src/site/xdoc/documentation.xml
@@ -86,7 +86,7 @@
                Protocols is coming with several implementations of popular mail protocols like:
                 <ul>
                   <li>SMTP</li>
-                  <li>LMPT</li>
+                  <li>LMTP</li>
                   <li>POP3</li>
                   <li>IMAP</li>
                   <li>ManageSieve</li>


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


[james-project] 01/06: JAMES-2711 Correct documentation for Deleted Messages Vault feature

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 253748125df164e4f2d3d3d660b3f305d8ddcdb3
Author: Lê Công Tuấn <tu...@gmail.com>
AuthorDate: Mon May 20 11:10:43 2019 +0700

    JAMES-2711 Correct documentation for Deleted Messages Vault feature
---
 src/site/markdown/server/manage-webadmin.md | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 77a3ee4..5217042 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -2708,10 +2708,10 @@ To move deleted messages in the vault, you need to specifically configure the De
 
 Here are the following actions available on the 'Deleted Messages Vault'
 
- - [Restore Deleted Messages](#Restore_deleted_messages)
- - [Export Deleted Messages](#Export_deleted_messages)
- - [Purge Deleted Messages](#Purge_deleted_messages)
- - [Permanently remove Deleted Message](#Permanently_remove_deleted_message) 
+ - [Restore Deleted Messages](#Restore_Deleted_Messages)
+ - [Export Deleted Messages](#Export_Deleted_Messages)
+ - [Purge Deleted Messages](#Purge_Deleted_Messages)
+ - [Permanently Remove Deleted Message](#Permanently_Remove_Deleted_Message)
 
  Note that the 'Deleted Messages Vault' feature is only supported on top of Cassandra-Guice.
 
@@ -2765,14 +2765,17 @@ curl -XPOST http://ip:port/deletedMessages/users/userToRestore@domain.ext?action
 ```
 
 The requested Json body is made from list of criterion objects which have following structure:
+
 ```
 {
   "fieldName": "supportedFieldName",
   "operator": "supportedOperator",
-  "testedValue": "plain string represents for the matching value of corresponding field"
+  "value": "A plain string represents for the matching value of the corresponding field"
 }
 ```
+
 Deleted Messages which are matched with **all** criterions in the query body will be restored. Here are list of supported fieldName for the restoring:
+
  - subject: represents for deleted message `subject` field matching. Supports below string operators:
    - contains
    - containsIgnoreCase
@@ -2796,11 +2799,13 @@ Deleted Messages which are matched with **all** criterions in the query body wil
 Messages in the Deleted Messages Vault of an specified user that are matched with Query Json Object in the body will be appended to his 'Restored-Messages' mailbox, which will be created if needed.
 
 **Note**:
+
  - Query parameter `action` is required and should have value `restore` to represent for restoring feature. Otherwise, a bad request response will be returned
  - Query parameter `action` is case sensitive
  - fieldName & operator for passing to the routes are case sensitive
  - Currently, we only support query combinator `and` value, otherwise, requests will be rejected 
  - If you only want to restore by only one criterion, the json body could be simplified to a single criterion:
+
 ```
 {
   "fieldName": "subject", 
@@ -2808,7 +2813,9 @@ Messages in the Deleted Messages Vault of an specified user that are matched wit
   "value": "Apache James"
 }
 ```
+
  - For restoring all deleted messages, passing a query json with empty criterion list to represent `matching all deleted messages`: 
+
 ```
 {
   "combinator": "and",
@@ -2905,7 +2912,7 @@ Response code:
 
 You may want to call this endpoint on a regular basis.
 
-### Permanently remove Deleted Message
+### Permanently Remove Deleted Message
 
 Delete a Deleted Message with MessageId
 


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


[james-project] 06/06: JAMES-2774 Restart docker RabbitMQ each tests in RabbitMQEventBusTest

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5dc293c14b5d07643a9f6a786793319b2a9cef42
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon May 20 16:55:01 2019 +0700

    JAMES-2774 Restart docker RabbitMQ each tests in RabbitMQEventBusTest
---
 .../james/mailbox/events/RabbitMQEventBusTest.java    | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index 83eccba..e0c7a72 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -66,10 +66,12 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.stubbing.Answer;
 
 import com.rabbitmq.client.Connection;
+
 import reactor.core.publisher.Mono;
 import reactor.rabbitmq.BindingSpecification;
 import reactor.rabbitmq.ExchangeSpecification;
@@ -85,8 +87,23 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
     KeyContract.SingleEventBusKeyContract, KeyContract.MultipleEventBusKeyContract,
     ErrorHandlingContract {
 
+    static class RestartingRabbitMQExtension extends RabbitMQExtension {
+
+        @Override
+        public void beforeEach(ExtensionContext extensionContext) throws Exception {
+            getRabbitMQ().start();
+            super.beforeEach(extensionContext);
+        }
+
+        @Override
+        public void afterEach(ExtensionContext context) {
+            super.afterEach(context);
+            getRabbitMQ().stop();
+        }
+    }
+
     @RegisterExtension
-    static RabbitMQExtension rabbitMQExtension = new RabbitMQExtension();
+    static RestartingRabbitMQExtension rabbitMQExtension = new RestartingRabbitMQExtension();
 
     private RabbitMQEventBus eventBus;
     private RabbitMQEventBus eventBus2;


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


[james-project] 04/06: JAMES-2763 StartUpChecks should catch exceptions during checking

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ca24df5e7b8b48ebb8eef71be1d3cdbe16432447
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon May 20 15:28:02 2019 +0700

    JAMES-2763 StartUpChecks should catch exceptions during checking
---
 .../java/org/apache/james/StartUpChecksPerformer.java     | 15 ++++++++++++++-
 .../java/org/apache/james/StartUpChecksPerformerTest.java |  2 --
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java b/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java
index 0dead1a..cbc52fa 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/StartUpChecksPerformer.java
@@ -182,10 +182,23 @@ public class StartUpChecksPerformer {
         public List<StartUpCheck.CheckResult> check() {
             return Flux.fromIterable(startUpChecks)
                 .publishOn(Schedulers.elastic())
-                .map(StartUpCheck::check)
+                .map(this::checkQuietly)
                 .collect(Guavate.toImmutableList())
                 .block();
         }
+
+        private StartUpCheck.CheckResult checkQuietly(StartUpCheck startUpCheck) {
+            try {
+                return startUpCheck.check();
+            } catch (Exception e) {
+                LOGGER.error("Error during the {} check", startUpCheck.checkName(), e);
+                return StartUpCheck.CheckResult.builder()
+                    .checkName(startUpCheck.checkName())
+                    .resultType(StartUpCheck.ResultType.BAD)
+                    .description(e.getMessage())
+                    .build();
+            }
+        }
     }
 
     private static final Logger LOGGER = LoggerFactory.getLogger(StartUpChecksPerformer.class);
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java b/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java
index 53b9064..cddb6e9 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java
@@ -25,7 +25,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.StartUpChecksPerformer.StartUpCheck.CheckResult;
 import org.apache.james.StartUpChecksPerformer.StartUpCheck.ResultType;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 class StartUpChecksPerformerTest {
@@ -106,7 +105,6 @@ class StartUpChecksPerformerTest {
                     .containsOnly(BAD_CHECK_1, BAD_CHECK_2));
     }
 
-    @Disabled("performCheck() now doesn't support this")
     @Test
     void performCheckShouldNotPropagateUnExpectedExceptionDuringChecking() {
         String checkName = "throwing check name";


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


[james-project] 05/06: JAMES-2765 Avoid scrolling for quota search

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2e361b291cfa75ad3bcb0250cacb212b18310864
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 20 15:54:25 2019 +0700

    JAMES-2765 Avoid scrolling for quota search
    
    We can easily rely on from+limit at the request level and avoid the scroll entirely.
    
    Scrolling is expensive so should rather be avoided - scroll context is kept for a long time, waisting ES server resources.
---
 .../elasticsearch/ElasticSearchQuotaSearcher.java  | 34 +++++++++-------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
index 19cefef..b08c4d8 100644
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
@@ -21,20 +21,19 @@ package org.apache.james.quota.search.elasticsearch;
 
 import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.USER;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
-import java.util.stream.Stream;
 
 import org.apache.james.backends.es.v6.AliasName;
 import org.apache.james.backends.es.v6.NodeMappingFactory;
 import org.apache.james.backends.es.v6.ReadAliasName;
-import org.apache.james.backends.es.v6.search.ScrollIterable;
 import org.apache.james.core.User;
 import org.apache.james.quota.search.QuotaQuery;
 import org.apache.james.quota.search.QuotaSearcher;
 import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.RestHighLevelClient;
-import org.elasticsearch.common.unit.TimeValue;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.sort.SortBuilders;
@@ -43,8 +42,6 @@ import org.elasticsearch.search.sort.SortOrder;
 import com.github.steveash.guavate.Guavate;
 
 public class ElasticSearchQuotaSearcher implements QuotaSearcher {
-    private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
-
     private final RestHighLevelClient client;
     private final AliasName readAlias;
     private final QuotaQueryConverter quotaQueryConverter;
@@ -57,25 +54,24 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
 
     @Override
     public List<User> search(QuotaQuery query) {
-        Stream<User> results = new ScrollIterable(client, prepareSearch(query))
-            .stream()
-            .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits()
-                .getHits()))
-            .map(SearchHit::getId)
-            .map(User::fromUsername)
-            .skip(query.getOffset().getValue());
-
-        return query.getLimit().getValue()
-            .map(results::limit)
-            .orElse(results)
-            .collect(Guavate.toImmutableList());
+        try {
+            return Arrays.stream(client.search(prepareSearch(query), RequestOptions.DEFAULT)
+                .getHits()
+                .getHits())
+                .map(SearchHit::getId)
+                .map(User::fromUsername)
+                .collect(Guavate.toImmutableList());
+        } catch (IOException e) {
+            throw new RuntimeException("Unexpected exception while executing " + query, e);
+        }
     }
 
     private SearchRequest prepareSearch(QuotaQuery query) {
         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
             .query(quotaQueryConverter.from(query))
             .sort(SortBuilders.fieldSort(USER)
-                .order(SortOrder.ASC));
+                .order(SortOrder.ASC))
+            .from(query.getOffset().getValue());
 
         query.getLimit()
             .getValue()
@@ -83,8 +79,6 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
 
         return new SearchRequest(readAlias.getValue())
             .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
-            .scroll(TIMEOUT)
             .source(sourceBuilder);
     }
-
 }
\ No newline at end of file


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