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/11/04 02:30:06 UTC
[james-project] 08/10: JAMES-2927 Avoid un-intentional tumbstones
in Cassandra mailqueue view projections
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 53c6d3095b37f2bcffa4c057c138becce2e1be62
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Oct 21 23:25:39 2019 +0200
JAMES-2927 Avoid un-intentional tumbstones in Cassandra mailqueue view projections
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
---
.../rabbitmq/view/cassandra/EnqueuedMailsDAO.java | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
index e86c4f3..c398f94 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java
@@ -47,12 +47,14 @@ import static org.apache.james.queue.rabbitmq.view.cassandra.EnqueuedMailsDaoUti
import static org.apache.james.queue.rabbitmq.view.cassandra.EnqueuedMailsDaoUtil.toTupleList;
import java.util.Date;
+import java.util.Optional;
import javax.inject.Inject;
import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
import org.apache.james.blob.api.BlobId;
import org.apache.james.blob.mail.MimeMessagePartsId;
+import org.apache.james.core.MailAddress;
import org.apache.james.queue.rabbitmq.EnqueuedItem;
import org.apache.james.queue.rabbitmq.MailQueueName;
import org.apache.james.queue.rabbitmq.view.cassandra.model.BucketedSlices.BucketId;
@@ -60,10 +62,10 @@ import org.apache.james.queue.rabbitmq.view.cassandra.model.BucketedSlices.Slice
import org.apache.james.queue.rabbitmq.view.cassandra.model.EnqueuedItemWithSlicingContext;
import org.apache.mailet.Mail;
+import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.TupleType;
-
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -120,7 +122,7 @@ public class EnqueuedMailsDAO {
Mail mail = enqueuedItem.getMail();
MimeMessagePartsId mimeMessagePartsId = enqueuedItem.getPartsId();
- return executor.executeVoid(insert.bind()
+ BoundStatement statement = insert.bind()
.setString(QUEUE_NAME, enqueuedItem.getMailQueueName().asString())
.setTimestamp(TIME_RANGE_START, Date.from(slicingContext.getTimeRangeStart()))
.setInt(BUCKET_ID, slicingContext.getBucketId().getValue())
@@ -130,14 +132,23 @@ public class EnqueuedMailsDAO {
.setString(HEADER_BLOB_ID, mimeMessagePartsId.getHeaderBlobId().asString())
.setString(BODY_BLOB_ID, mimeMessagePartsId.getBodyBlobId().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(userHeaderNameHeaderValueTriple, mail.getPerRecipientSpecificHeaders())));
+ .setList(PER_RECIPIENT_SPECIFIC_HEADERS, toTupleList(userHeaderNameHeaderValueTriple, mail.getPerRecipientSpecificHeaders()));
+
+ Optional.ofNullable(mail.getErrorMessage())
+ .ifPresent(errorMessage -> statement.setString(ERROR_MESSAGE, mail.getErrorMessage()));
+
+ mail.getMaybeSender()
+ .asOptional()
+ .map(MailAddress::asString)
+ .ifPresent(mailAddress -> statement.setString(SENDER, mailAddress));
+
+ return executor.executeVoid(statement);
}
Flux<EnqueuedItemWithSlicingContext> selectEnqueuedMails(
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org