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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org