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