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/03 08:51:39 UTC

[1/7] james-project git commit: JAMES-2445 Adding/removing groups/forwards should be indempotent

Repository: james-project
Updated Branches:
  refs/heads/master 21bb9757b -> 8992243e9


JAMES-2445 Adding/removing groups/forwards should be indempotent


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

Branch: refs/heads/master
Commit: 5d70b940011af916daf329d10b27e12654991a48
Parents: 21bb975
Author: benwa <bt...@linagora.com>
Authored: Mon Jul 2 12:16:47 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:49:54 2018 +0700

----------------------------------------------------------------------
 .../rrt/api/MappingAlreadyExistsException.java  | 30 ++++++++++++++++++++
 .../rrt/lib/AbstractRecipientRewriteTable.java  |  3 +-
 .../james/webadmin/routes/ForwardRoutes.java    | 15 ++++++++--
 .../james/webadmin/routes/GroupsRoutes.java     | 23 ++++++++++-----
 .../routes/DomainMappingsRoutesTest.java        | 16 +++++++++++
 .../webadmin/routes/ForwardRoutesTest.java      | 26 ++++++++++++-----
 .../james/webadmin/routes/GroupsRoutesTest.java | 26 ++++++++++++-----
 src/site/markdown/server/manage-webadmin.md     |  8 +++---
 8 files changed, 118 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/data/data-api/src/main/java/org/apache/james/rrt/api/MappingAlreadyExistsException.java
----------------------------------------------------------------------
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/api/MappingAlreadyExistsException.java b/server/data/data-api/src/main/java/org/apache/james/rrt/api/MappingAlreadyExistsException.java
new file mode 100644
index 0000000..4d80ad8
--- /dev/null
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/api/MappingAlreadyExistsException.java
@@ -0,0 +1,30 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.rrt.api;
+
+public class MappingAlreadyExistsException extends RecipientRewriteTableException {
+
+    public MappingAlreadyExistsException(String msg) {
+        super(msg);
+    }
+
+    public MappingAlreadyExistsException(String msg, Throwable t) {
+        super(msg, t);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
index bb42e52..328de7a 100644
--- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
+++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
@@ -34,6 +34,7 @@ import org.apache.james.core.User;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.lifecycle.api.Configurable;
+import org.apache.james.rrt.api.MappingAlreadyExistsException;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.Mapping.Type;
@@ -313,7 +314,7 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT
     private void checkDuplicateMapping(MappingSource source, Mapping mapping) throws RecipientRewriteTableException {
         Mappings mappings = getUserDomainMappings(source);
         if (mappings != null && mappings.contains(mapping)) {
-            throw new RecipientRewriteTableException("Mapping " + mapping + " for " + source.asString() + " already exist!");
+            throw new MappingAlreadyExistsException("Mapping " + mapping + " for " + source.asString() + " already exist!");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
index 935f88a..8ea0ec0 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
@@ -41,6 +41,7 @@ import javax.ws.rs.Produces;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.User;
 import org.apache.james.domainlist.api.DomainListException;
+import org.apache.james.rrt.api.MappingAlreadyExistsException;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.Mapping;
@@ -167,8 +168,16 @@ public class ForwardRoutes implements Routes {
         ensureUserExist(forwardBaseAddress);
         MailAddress destinationAddress = parseMailAddress(request.params(FORWARD_DESTINATION_ADDRESS));
         MappingSource source = MappingSource.fromUser(User.fromLocalPartWithDomain(forwardBaseAddress.getLocalPart(), forwardBaseAddress.getDomain()));
-        recipientRewriteTable.addForwardMapping(source, destinationAddress.asString());
-        return halt(HttpStatus.CREATED_201);
+        addForward(source, destinationAddress);
+        return halt(HttpStatus.NO_CONTENT_204);
+    }
+
+    private void addForward(MappingSource source, MailAddress destinationAddress) throws RecipientRewriteTableException {
+        try {
+            recipientRewriteTable.addForwardMapping(source, destinationAddress.asString());
+        } catch (MappingAlreadyExistsException e) {
+            // ignore
+        }
     }
 
     private void ensureUserExist(MailAddress mailAddress) throws UsersRepositoryException {
@@ -201,7 +210,7 @@ public class ForwardRoutes implements Routes {
         MailAddress destinationAddressToBeRemoved = parseMailAddress(request.params(FORWARD_DESTINATION_ADDRESS));
         MappingSource source = MappingSource.fromUser(User.fromLocalPartWithDomain(baseAddress.getLocalPart(), baseAddress.getDomain()));
         recipientRewriteTable.removeForwardMapping(source, destinationAddressToBeRemoved.asString());
-        return halt(HttpStatus.OK_200);
+        return halt(HttpStatus.NO_CONTENT_204);
     }
 
     @GET

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
index 2625a46..85771f8 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
@@ -43,6 +43,7 @@ import org.apache.james.core.MailAddress;
 import org.apache.james.core.User;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
+import org.apache.james.rrt.api.MappingAlreadyExistsException;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.Mapping;
@@ -55,7 +56,6 @@ import org.apache.james.webadmin.Constants;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
-import org.apache.james.webadmin.utils.JsonExtractException;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.eclipse.jetty.http.HttpStatus;
 import org.slf4j.Logger;
@@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSortedSet;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -149,22 +150,30 @@ public class GroupsRoutes implements Routes {
                 MAILADDRESS_ASCII_DISCLAIMER)
     })
     @ApiResponses(value = {
-        @ApiResponse(code = HttpStatus.OK_200, message = "OK", response = List.class),
+        @ApiResponse(code = HttpStatus.NO_CONTENT_204, message = "OK", response = List.class),
         @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = GROUP_ADDRESS + " or group structure format is not valid"),
         @ApiResponse(code = HttpStatus.FORBIDDEN_403, message = "server doesn't own the domain"),
         @ApiResponse(code = HttpStatus.CONFLICT_409, message = "requested group address is already used for another purpose"),
         @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500,
             message = "Internal server error - Something went bad on the server side.")
     })
-    public HaltException addToGroup(Request request, Response response) throws JsonExtractException, AddressException, RecipientRewriteTableException, UsersRepositoryException, DomainListException {
+    public HaltException addToGroup(Request request, Response response) throws RecipientRewriteTableException, UsersRepositoryException, DomainListException {
         MailAddress groupAddress = parseMailAddress(request.params(GROUP_ADDRESS));
         Domain domain = groupAddress.getDomain();
         ensureRegisteredDomain(domain);
         ensureNotShadowingAnotherAddress(groupAddress);
         MailAddress userAddress = parseMailAddress(request.params(USER_ADDRESS));
         MappingSource source = MappingSource.fromUser(User.fromLocalPartWithDomain(groupAddress.getLocalPart(), domain));
-        recipientRewriteTable.addGroupMapping(source, userAddress.asString());
-        return halt(HttpStatus.CREATED_201);
+        addGroupMember(source, userAddress);
+        return halt(HttpStatus.NO_CONTENT_204);
+    }
+
+    private void addGroupMember(MappingSource source, MailAddress userAddress) throws RecipientRewriteTableException {
+        try {
+            recipientRewriteTable.addGroupMapping(source, userAddress.asString());
+        } catch (MappingAlreadyExistsException e) {
+            // do nothing
+        }
     }
 
     private void ensureRegisteredDomain(Domain domain) throws DomainListException {
@@ -202,14 +211,14 @@ public class GroupsRoutes implements Routes {
         @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500,
             message = "Internal server error - Something went bad on the server side.")
     })
-    public HaltException removeFromGroup(Request request, Response response) throws JsonExtractException, AddressException, RecipientRewriteTableException {
+    public HaltException removeFromGroup(Request request, Response response) throws RecipientRewriteTableException {
         MailAddress groupAddress = parseMailAddress(request.params(GROUP_ADDRESS));
         MailAddress userAddress = parseMailAddress(request.params(USER_ADDRESS));
         MappingSource source = MappingSource
             .fromUser(
                 User.fromLocalPartWithDomain(groupAddress.getLocalPart(), groupAddress.getDomain()));
         recipientRewriteTable.removeGroupMapping(source, userAddress.asString());
-        return halt(HttpStatus.OK_200);
+        return halt(HttpStatus.NO_CONTENT_204);
     }
 
     @GET

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
index b41c1ba..0d36762 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
@@ -23,6 +23,7 @@ import static com.jayway.restassured.RestAssured.delete;
 import static com.jayway.restassured.RestAssured.given;
 import static com.jayway.restassured.RestAssured.put;
 import static com.jayway.restassured.RestAssured.when;
+import static com.jayway.restassured.RestAssured.with;
 import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.entry;
@@ -106,6 +107,21 @@ class DomainMappingsRoutesTest {
         }
 
         @Test
+        void addDomainMappingShouldBeIdempotent() {
+            with()
+                .body("to.com")
+                .put("from.com");
+
+            given()
+                .body("to.com")
+            .when()
+                .put("from.com")
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204)
+                .body(isEmptyString());
+        }
+
+        @Test
         void getDomainMappingsShouldReturnAllDomainMappings() throws RecipientRewriteTableException {
             String alias1 = "to_1.com";
             String alias2 = "to_2.com";

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
index 27fc7ab..89d9ded 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.webadmin.routes;
 
+import static com.jayway.restassured.RestAssured.given;
 import static com.jayway.restassured.RestAssured.when;
 import static com.jayway.restassured.RestAssured.with;
 import static org.apache.james.webadmin.Constants.SEPARATOR;
@@ -173,19 +174,30 @@ class ForwardRoutesTest {
         }
 
         @Test
-        void putUserInForwardShouldReturnCreated() {
+        void putUserInForwardShouldReturnNoContent() {
             when()
                 .put(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB)
             .then()
-                .statusCode(HttpStatus.CREATED_201);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
-        void putUserWithSlashInForwardShouldReturnCreated() {
+        void putUserShouldBeIdempotent() {
+            given()
+                .put(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB);
+
+            when()
+                .put(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB)
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
+        void putUserWithSlashInForwardShouldReturnNoContent() {
             when()
                 .put(BOB + SEPARATOR + "targets" + SEPARATOR + ALICE_WITH_ENCODED_SLASH)
             .then()
-                .statusCode(HttpStatus.CREATED_201);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -215,11 +227,11 @@ class ForwardRoutesTest {
         }
 
         @Test
-        void putUserInForwardWithEncodedSlashShouldReturnCreated() {
+        void putUserInForwardWithEncodedSlashShouldReturnNoContent() {
             when()
                 .put(ALICE_WITH_ENCODED_SLASH + SEPARATOR + "targets" + SEPARATOR + BOB)
             .then()
-                .statusCode(HttpStatus.CREATED_201);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -337,7 +349,7 @@ class ForwardRoutesTest {
             when()
                 .delete(ALICE + SEPARATOR + "targets" + SEPARATOR + BOB)
             .then()
-                .statusCode(HttpStatus.OK_200);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
index 61fb855..5da0d8c 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
@@ -21,6 +21,7 @@ package org.apache.james.webadmin.routes;
 
 import static com.jayway.restassured.RestAssured.given;
 import static com.jayway.restassured.RestAssured.when;
+import static com.jayway.restassured.RestAssured.with;
 import static org.apache.james.webadmin.Constants.SEPARATOR;
 import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -141,6 +142,17 @@ class GroupsRoutesTest {
         }
 
         @Test
+        void putShouldBeIdempotent() {
+            with()
+                .put(GROUP1 + SEPARATOR + USER_A);
+
+            given()
+                .put(GROUP1 + SEPARATOR + USER_A)
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
         void getNotRegisteredGroupShouldReturnNotFound() {
             Map<String, Object> errors = when()
                 .get("unknown@domain.travel")
@@ -159,19 +171,19 @@ class GroupsRoutesTest {
         }
 
         @Test
-        void putUserInGroupShouldReturnCreated() {
+        void putUserInGroupShouldReturnNoContent() {
             when()
                 .put(GROUP1 + SEPARATOR + USER_A)
             .then()
-                .statusCode(HttpStatus.CREATED_201);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
-        void putUserWithSlashInGroupShouldReturnCreated() {
+        void putUserWithSlashInGroupShouldReturnNoContent() {
             when()
                 .put(GROUP1 + SEPARATOR + USER_WITH_ENCODED_SLASH)
             .then()
-                .statusCode(HttpStatus.CREATED_201);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -211,11 +223,11 @@ class GroupsRoutesTest {
         }
 
         @Test
-        void putUserInGroupWithEncodedSlashShouldReturnCreated() {
+        void putUserInGroupWithEncodedSlashShouldReturnNoContent() {
             when()
                 .put(GROUP_WITH_ENCODED_SLASH + SEPARATOR + USER_A)
             .then()
-                .statusCode(HttpStatus.CREATED_201);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -344,7 +356,7 @@ class GroupsRoutesTest {
             when()
                 .delete(GROUP1 + SEPARATOR + USER_A)
             .then()
-                .statusCode(HttpStatus.OK_200);
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/5d70b940/src/site/markdown/server/manage-webadmin.md
----------------------------------------------------------------------
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index a161a97..8600ae5 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -1100,7 +1100,7 @@ Will add member@domain.com to group@domain.com, creating the group if needed
 
 Response codes:
 
- - 200: Success
+ - 204: Success
  - 400: Group structure or member is not valid
  - 403: Server does not own the requested domain
  - 409: Requested group address is already used for another purpose
@@ -1115,7 +1115,7 @@ Will remove member@domain.com from group@domain.com, removing the group if group
 
 Response codes:
 
- - 200: Success
+ - 204: Success
  - 400: Group structure or member is not valid
 
 ## Creating address forwards
@@ -1187,7 +1187,7 @@ Will add destination@domain.com to user@domain.com, creating the forward if need
 
 Response codes:
 
- - 200: Success
+ - 204: Success
  - 400: Forward structure or member is not valid
  - 403: Server does not own the requested domain
  - 404: Requested forward address does not match an existing user
@@ -1202,7 +1202,7 @@ Will remove destination@domain.com from user@domain.com, removing the forward if
 
 Response codes:
 
- - 200: Success
+ - 204: Success
  - 400: Forward structure or member is not valid
 
 ## Administrating mail repositories


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


[4/7] james-project git commit: JAMES-2446 Avoid double creation trial in tests

Posted by bt...@apache.org.
JAMES-2446 Avoid double creation trial in tests


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

Branch: refs/heads/master
Commit: 7a9a514ed21da2823f2d751e0ef827ea111ffbea
Parents: b7e2dae
Author: benwa <bt...@linagora.com>
Authored: Fri Jun 29 17:51:14 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:50:45 2018 +0700

----------------------------------------------------------------------
 .../cassandra/init/SessionWithInitializedTablesFactory.java      | 2 +-
 .../org/apache/james/backends/cassandra/CassandraCluster.java    | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7a9a514e/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactory.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactory.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactory.java
index ebfd70b..d87b41b 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactory.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactory.java
@@ -41,7 +41,7 @@ public class SessionWithInitializedTablesFactory implements Provider<Session> {
         this.session = createSession(cluster, clusterConfiguration.getKeyspace());
     }
 
-    public Session createSession(Cluster cluster, String keyspace) {
+    private Session createSession(Cluster cluster, String keyspace) {
         Session session = cluster.connect(keyspace);
         try {
             new CassandraTypesCreator(module, session)

http://git-wip-us.apache.org/repos/asf/james-project/blob/7a9a514e/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
index 8e20b52..cc885ef 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
@@ -93,7 +93,9 @@ public final class CassandraCluster implements AutoCloseable {
                 .replicationFactor(REPLICATION_FACTOR)
                 .disableDurableWrites()
                 .clusterWithInitializedKeyspace();
-            return Optional.of(new SessionWithInitializedTablesFactory(clusterConfiguration, clusterWithInitializedKeyspace, module).createSession(clusterWithInitializedKeyspace, keyspace));
+
+            return Optional.of(new SessionWithInitializedTablesFactory(clusterConfiguration, clusterWithInitializedKeyspace, module)
+                .get());
         } catch (NoHostAvailableException exception) {
             sleep(SLEEP_BEFORE_RETRY);
             return Optional.empty();


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


[3/7] james-project git commit: JAMES-2446 Disable assertions (modest performance benefit)

Posted by bt...@apache.org.
JAMES-2446 Disable assertions (modest performance benefit)


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

Branch: refs/heads/master
Commit: dbb6039c0f41b181063ccaee22dcd1d0e286c81e
Parents: 5d70b94
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Jun 26 12:01:57 2018 +0200
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:50:37 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/backends/cassandra/DockerCassandraRule.java   | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dbb6039c/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
index a612e86..5a8ea95 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
@@ -86,6 +86,8 @@ public class DockerCassandraRule implements TestRule {
                         .run("echo auto_bootstrap: false >> " + CASSANDRA_YAML)
                         .run("echo \"-Xms1500M\" >> " + JVM_OPTIONS)
                         .run("echo \"-Xmx1500M\" >> " + JVM_OPTIONS)
+                        // disable assertions (modest performance benefit)
+                        .run("sed -i -e 's/JVM_OPTS=\"$JVM_OPTS -ea\"/JVM_OPTS=\"$JVM_OPTS -da\"/' " + CASSANDRA_ENV)
                         .build()))
             .withCreateContainerCmdModifier(cmd -> cmd.getHostConfig().withBinds(new Binds(new Bind(tmpFsName, new Volume("/var/lib/cassandra")))))
             .withCreateContainerCmdModifier(cmd -> cmd.withMemory(2000 * 1024 * 1024L))


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


[6/7] james-project git commit: JAMES-2446 Avoid instanciating several time mapperFactory

Posted by bt...@apache.org.
JAMES-2446 Avoid instanciating several time mapperFactory

It leads to preparing several time Cassandra queries


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

Branch: refs/heads/master
Commit: 8992243e9f554e931ca6215d98490ab54683c952
Parents: 5a65aff
Author: benwa <bt...@linagora.com>
Authored: Sat Jun 30 19:52:01 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:50:45 2018 +0700

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMapperProvider.java    | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8992243e/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index f8b772b..968d72d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -50,12 +50,13 @@ public class CassandraMapperProvider implements MapperProvider {
     private final MessageUidProvider messageUidProvider;
     private final CassandraModSeqProvider cassandraModSeqProvider;
     private final MockMailboxSession mailboxSession = new MockMailboxSession("benwa");
-
+    private CassandraMailboxSessionMapperFactory mapperFactory;
 
     public CassandraMapperProvider(CassandraCluster cassandra) {
         this.cassandra = cassandra;
         messageUidProvider = new MessageUidProvider();
         cassandraModSeqProvider = new CassandraModSeqProvider(this.cassandra.getConf());
+        mapperFactory = createMapperFactory();
     }
 
     @Override
@@ -65,17 +66,17 @@ public class CassandraMapperProvider implements MapperProvider {
     
     @Override
     public MailboxMapper createMailboxMapper() throws MailboxException {
-        return createMapperFactory().getMailboxMapper(mailboxSession);
+        return mapperFactory.getMailboxMapper(mailboxSession);
     }
 
     @Override
     public MessageMapper createMessageMapper() throws MailboxException {
-        return createMapperFactory().getMessageMapper(mailboxSession);
+        return mapperFactory.getMessageMapper(mailboxSession);
     }
 
     @Override
     public MessageIdMapper createMessageIdMapper() throws MailboxException {
-        return createMapperFactory().getMessageIdMapper(mailboxSession);
+        return mapperFactory.getMessageIdMapper(mailboxSession);
     }
 
     private CassandraMailboxSessionMapperFactory createMapperFactory() {
@@ -85,8 +86,8 @@ public class CassandraMapperProvider implements MapperProvider {
     }
 
     @Override
-    public AttachmentMapper createAttachmentMapper() throws MailboxException {
-        return createMapperFactory().createAttachmentMapper(mailboxSession);
+    public AttachmentMapper createAttachmentMapper() {
+        return mapperFactory.createAttachmentMapper(mailboxSession);
     }
 
     @Override
@@ -95,7 +96,7 @@ public class CassandraMapperProvider implements MapperProvider {
     }
 
     @Override
-    public void clearMapper() throws MailboxException {
+    public void clearMapper() {
         cassandra.close();
     }
 
@@ -106,7 +107,7 @@ public class CassandraMapperProvider implements MapperProvider {
 
     @Override
     public AnnotationMapper createAnnotationMapper() throws MailboxException {
-        return createMapperFactory().getAnnotationMapper(mailboxSession);
+        return mapperFactory.getAnnotationMapper(mailboxSession);
     }
 
     @Override


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


[7/7] james-project git commit: JAMES-2446 Avoid reading several time Keyspace metadata

Posted by bt...@apache.org.
JAMES-2446 Avoid reading several time Keyspace metadata


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

Branch: refs/heads/master
Commit: b7e2dae16899d4959f37966fd0e5ca33f9687353
Parents: 9ac970d
Author: benwa <bt...@linagora.com>
Authored: Fri Jun 29 17:50:15 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:50:45 2018 +0700

----------------------------------------------------------------------
 .../cassandra/init/CassandraTypesProvider.java        | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/b7e2dae1/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java
index 356c7ac..3600f0d 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.components.CassandraType;
 
+import com.datastax.driver.core.KeyspaceMetadata;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.UserType;
 import com.github.steveash.guavate.Guavate;
@@ -36,18 +37,15 @@ public class CassandraTypesProvider {
 
     @Inject
     public CassandraTypesProvider(CassandraModule module, Session session) {
+        KeyspaceMetadata keyspaceMetadata = session.getCluster()
+            .getMetadata()
+            .getKeyspace(session.getLoggedKeyspace());
+
         userTypes = module.moduleTypes()
             .stream()
             .collect(Guavate.toImmutableMap(
                     CassandraType::getName,
-                    type -> getSessionType(session, type)));
-    }
-
-    private UserType getSessionType(Session session, CassandraType type) {
-        return session.getCluster()
-            .getMetadata()
-            .getKeyspace(session.getLoggedKeyspace())
-            .getUserType(type.getName());
+                    type -> keyspaceMetadata.getUserType(type.getName())));
     }
 
     public UserType getDefinedUserType(String typeName) {


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


[5/7] james-project git commit: JAMES-2446 CassandraCluster wait interval should be smaller

Posted by bt...@apache.org.
JAMES-2446 CassandraCluster wait interval should be smaller

Keep waiting period the same


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

Branch: refs/heads/master
Commit: 5a65aff0f33edb58813b681127cd388ab7578db5
Parents: 7a9a514
Author: benwa <bt...@linagora.com>
Authored: Fri Jun 29 17:52:45 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:50:45 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/backends/cassandra/CassandraCluster.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/5a65aff0/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
index cc885ef..8e9df5b 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
@@ -41,8 +41,8 @@ public final class CassandraCluster implements AutoCloseable {
 
     private static final int REPLICATION_FACTOR = 1;
 
-    private static final long SLEEP_BEFORE_RETRY = 200;
-    private static final int MAX_RETRY = 2000;
+    private static final long SLEEP_BEFORE_RETRY = 20;
+    private static final int MAX_RETRY = 20000;
 
     private final CassandraModule module;
     private Session session;


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


[2/7] james-project git commit: JAMES-2446 Use caches for keys & rows

Posted by bt...@apache.org.
JAMES-2446 Use caches for keys & rows


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

Branch: refs/heads/master
Commit: 9ac970d85b0ec1d0be841dd9ebd45fb90497bdd2
Parents: dbb6039
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Jun 26 12:02:12 2018 +0200
Committer: benwa <bt...@linagora.com>
Committed: Tue Jul 3 15:50:37 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/backends/cassandra/DockerCassandraRule.java  | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9ac970d8/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
index 5a8ea95..38ca0eb 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
@@ -88,6 +88,9 @@ public class DockerCassandraRule implements TestRule {
                         .run("echo \"-Xmx1500M\" >> " + JVM_OPTIONS)
                         // disable assertions (modest performance benefit)
                         .run("sed -i -e 's/JVM_OPTS=\"$JVM_OPTS -ea\"/JVM_OPTS=\"$JVM_OPTS -da\"/' " + CASSANDRA_ENV)
+                        // use caches for keys & rows
+                        .run("sed -i -e \"s/key_cache_size_in_mb:/key_cache_size_in_mb: 256/\" " + CASSANDRA_YAML)
+                        .run("sed -i -e \"s/row_cache_size_in_mb: 0/row_cache_size_in_mb: 512/\" " + CASSANDRA_YAML)
                         .build()))
             .withCreateContainerCmdModifier(cmd -> cmd.getHostConfig().withBinds(new Binds(new Bind(tmpFsName, new Volume("/var/lib/cassandra")))))
             .withCreateContainerCmdModifier(cmd -> cmd.withMemory(2000 * 1024 * 1024L))


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