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 b19b1679bca69b60f5f75731d65b22b1fe8e389a
Author: Rémi KOWALSKI <rkowal...@linagora.com>
AuthorDate: Wed Oct 23 16:16:00 2019 +0200

    JAMES-2927 Avoid un-intentional tumbstones in Cassandra mail repository V2
    
    A tumbstone is created when a null value is specified in a prepared 
statement.
    
    This is due to the fact that null has the meaning `remove` and not the 
meaning `unspecified`, which is represented by no binding at all.
    
    Of course unwanted tumbstones occurs with a performance cost.
    
    The recommended method for fixing on the latest version of cassandra is to 
not bind the null value.
    
    Read this for further information: 
https://thelastpickle.com/blog/2016/09/15/Null-bindings-on-prepared-statements-and-undesired-tombstone-creation.html
---
 .../cassandra/CassandraMailRepositoryMailDaoV2.java  | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git 
a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoV2.java
 
b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoV2.java
index 69b514d..b4a2ef3 100644
--- 
a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoV2.java
+++ 
b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoV2.java
@@ -68,6 +68,7 @@ import org.apache.mailet.Mail;
 import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.PerRecipientHeaders.Header;
 
+import com.datastax.driver.core.BoundStatement;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
@@ -135,21 +136,30 @@ public class CassandraMailRepositoryMailDaoV2 implements 
CassandraMailRepository
     }
 
     public Mono<Void> store(MailRepositoryUrl url, Mail mail, BlobId headerId, 
BlobId bodyId) {
-        return Mono.fromCallable(() ->
-            insertMail.bind()
+        return Mono.fromCallable(() -> {
+            BoundStatement boundStatement = insertMail.bind()
                 .setString(REPOSITORY_NAME, url.asString())
                 .setString(MAIL_KEY, mail.getName())
                 .setString(HEADER_BLOB_ID, headerId.asString())
                 .setString(BODY_BLOB_ID, bodyId.asString())
                 .setString(STATE, mail.getState())
-                .setString(SENDER, mail.getMaybeSender().asString(null))
                 .setList(RECIPIENTS, asStringList(mail.getRecipients()))
-                .setString(ERROR_MESSAGE, mail.getErrorMessage())
                 .setString(REMOTE_ADDR, mail.getRemoteAddr())
                 .setString(REMOTE_HOST, mail.getRemoteHost())
                 .setTimestamp(LAST_UPDATED, mail.getLastUpdated())
                 .setMap(ATTRIBUTES, toRawAttributeMap(mail))
-                .setList(PER_RECIPIENT_SPECIFIC_HEADERS, 
toTupleList(mail.getPerRecipientSpecificHeaders())))
+                .setList(PER_RECIPIENT_SPECIFIC_HEADERS, 
toTupleList(mail.getPerRecipientSpecificHeaders()));
+
+            Optional.ofNullable(mail.getErrorMessage())
+                .ifPresent(errorMessage -> 
boundStatement.setString(MailRepositoryTable.ERROR_MESSAGE, 
mail.getErrorMessage()));
+
+            mail.getMaybeSender()
+                .asOptional()
+                .map(MailAddress::asString)
+                .ifPresent(mailAddress -> 
boundStatement.setString(MailRepositoryTable.SENDER, mailAddress));
+
+            return boundStatement;
+        })
             .flatMap(executor::executeVoid);
     }
 


---------------------------------------------------------------------
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