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 eb4633e51ee4fb205b24ccfb55ff87ed4274c0ef Author: Benoit Tellier <[email protected]> AuthorDate: Sun Apr 12 21:04:07 2020 +0700 JAMES-3148 Cleanup Mailbox recents DAO --- .../CassandraMailboxSessionMapperFactory.java | 2 +- .../mailbox/cassandra/DeleteMessageListener.java | 6 +++- .../cassandra/mail/CassandraMailboxRecentsDAO.java | 18 ++++++++++-- .../cassandra/CassandraMailboxManagerTest.java | 32 ++++++++++++++++++++++ .../mail/CassandraMailboxRecentDAOTest.java | 19 +++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java index 3631d52..def8f71 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java @@ -206,6 +206,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa public DeleteMessageListener deleteMessageListener() { return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, attachmentDAOV2, ownerDAO, attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, applicableFlagDAO, firstUnseenDAO, deletedMessageDAO, - mailboxCounterDAO); + mailboxCounterDAO, mailboxRecentsDAO); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java index ed70a9a..521a59a 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java @@ -36,6 +36,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO; import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; +import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; @@ -73,13 +74,14 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen private final CassandraFirstUnseenDAO firstUnseenDAO; private final CassandraDeletedMessageDAO deletedMessageDAO; private final CassandraMailboxCounterDAO counterDAO; + private final CassandraMailboxRecentsDAO recentsDAO; @Inject public DeleteMessageListener(CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageDAO messageDAO, CassandraAttachmentDAOV2 attachmentDAO, CassandraAttachmentOwnerDAO ownerDAO, CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraACLMapper aclMapper, CassandraUserMailboxRightsDAO rightsDAO, CassandraApplicableFlagDAO applicableFlagDAO, - CassandraFirstUnseenDAO firstUnseenDAO, CassandraDeletedMessageDAO deletedMessageDAO, CassandraMailboxCounterDAO counterDAO) { + CassandraFirstUnseenDAO firstUnseenDAO, CassandraDeletedMessageDAO deletedMessageDAO, CassandraMailboxCounterDAO counterDAO, CassandraMailboxRecentsDAO recentsDAO) { this.imapUidDAO = imapUidDAO; this.messageIdDAO = messageIdDAO; this.messageDAO = messageDAO; @@ -92,6 +94,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen this.firstUnseenDAO = firstUnseenDAO; this.deletedMessageDAO = deletedMessageDAO; this.counterDAO = counterDAO; + this.recentsDAO = recentsDAO; } @Override @@ -132,6 +135,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen .then(firstUnseenDAO.removeAll(mailboxId)) .then(deletedMessageDAO.removeAll(mailboxId)) .then(counterDAO.delete(mailboxId)) + .then(recentsDAO.delete(mailboxId)) .block(); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java index 3d91975..ed96abd 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java @@ -20,7 +20,6 @@ package org.apache.james.mailbox.cassandra.mail; import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker; -import static com.datastax.driver.core.querybuilder.QueryBuilder.delete; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; @@ -36,6 +35,7 @@ import org.apache.james.mailbox.cassandra.table.CassandraMailboxRecentsTable; import com.datastax.driver.core.BoundStatement; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; +import com.datastax.driver.core.querybuilder.QueryBuilder; import com.google.common.annotations.VisibleForTesting; import reactor.core.publisher.Flux; @@ -46,6 +46,7 @@ public class CassandraMailboxRecentsDAO { private final CassandraAsyncExecutor cassandraAsyncExecutor; private final PreparedStatement readStatement; private final PreparedStatement deleteStatement; + private final PreparedStatement deleteAllStatement; private final PreparedStatement addStatement; private CassandraUtils cassandraUtils; @@ -54,6 +55,7 @@ public class CassandraMailboxRecentsDAO { cassandraAsyncExecutor = new CassandraAsyncExecutor(session); readStatement = createReadStatement(session); deleteStatement = createDeleteStatement(session); + deleteAllStatement = createDeleteAllStatement(session); addStatement = createAddStatement(session); this.cassandraUtils = cassandraUtils; } @@ -72,12 +74,19 @@ public class CassandraMailboxRecentsDAO { private PreparedStatement createDeleteStatement(Session session) { return session.prepare( - delete() + QueryBuilder.delete() .from(CassandraMailboxRecentsTable.TABLE_NAME) .where(eq(CassandraMailboxRecentsTable.MAILBOX_ID, bindMarker(CassandraMailboxRecentsTable.MAILBOX_ID))) .and(eq(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, bindMarker(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID)))); } + private PreparedStatement createDeleteAllStatement(Session session) { + return session.prepare( + QueryBuilder.delete() + .from(CassandraMailboxRecentsTable.TABLE_NAME) + .where(eq(CassandraMailboxRecentsTable.MAILBOX_ID, bindMarker(CassandraMailboxRecentsTable.MAILBOX_ID)))); + } + private PreparedStatement createAddStatement(Session session) { return session.prepare( insertInto(CassandraMailboxRecentsTable.TABLE_NAME) @@ -103,6 +112,11 @@ public class CassandraMailboxRecentsDAO { .setLong(CassandraMailboxRecentsTable.RECENT_MESSAGE_UID, messageUid.asLong())); } + public Mono<Void> delete(CassandraId mailboxId) { + return cassandraAsyncExecutor.executeVoid(deleteAllStatement.bind() + .setUUID(CassandraMailboxRecentsTable.MAILBOX_ID, mailboxId.asUuid())); + } + public Mono<Void> addToRecent(CassandraId mailboxId, MessageUid messageUid) { return cassandraAsyncExecutor.executeVoid(addStatement.bind() .setUUID(CassandraMailboxRecentsTable.MAILBOX_ID, mailboxId.asUuid()) diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java index 36ca5d8..0865d83 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java @@ -48,6 +48,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO; import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; +import org.apache.james.mailbox.cassandra.mail.CassandraMailboxRecentsDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; @@ -702,6 +703,37 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai .isEmpty(); } + @Test + void deleteMailboxShouldCleanUpRecent(CassandraCluster cassandraCluster) throws Exception { + inboxManager.appendMessage(MessageManager.AppendCommand.builder() + .withFlags(new Flags(Flags.Flag.RECENT)) + .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session); + + mailboxManager.deleteMailbox(inbox, session); + + assertThat(new CassandraMailboxRecentsDAO(cassandraCluster.getConf()).getRecentMessageUidsInMailbox((CassandraId) inboxId) + .collectList().block()) + .isEmpty(); + } + + @Test + void deleteMailboxShouldCleanUpRecentWhenFailure(CassandraCluster cassandraCluster) throws Exception { + inboxManager.appendMessage(MessageManager.AppendCommand.builder() + .withFlags(new Flags(Flags.Flag.RECENT)) + .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session); + + + cassandraCluster.getConf().registerScenario(fail() + .times(1) + .whenQueryStartsWith("DELETE FROM mailboxRecents WHERE mailboxId=:mailboxId;")); + + mailboxManager.deleteMailbox(inbox, session); + + assertThat(new CassandraMailboxRecentsDAO(cassandraCluster.getConf()).getRecentMessageUidsInMailbox((CassandraId) inboxId) + .collectList().block()) + .isEmpty(); + } + private CassandraMailboxCounterDAO countersDAO(CassandraCluster cassandraCluster) { return new CassandraMailboxCounterDAO(cassandraCluster.getConf()); } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java index 8e05300..e773083 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java @@ -20,6 +20,7 @@ package org.apache.james.mailbox.cassandra.mail; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import java.util.stream.IntStream; @@ -78,6 +79,24 @@ class CassandraMailboxRecentDAOTest { } @Test + void getRecentMessageUidsInMailboxShouldNotReturnDeletedItems() { + testee.addToRecent(CASSANDRA_ID, UID1).block(); + testee.addToRecent(CASSANDRA_ID, UID2).block(); + + testee.delete(CASSANDRA_ID).block(); + + assertThat(testee.getRecentMessageUidsInMailbox(CASSANDRA_ID) + .collectList() + .block()) + .isEmpty(); + } + + @Test + void deleteShouldNotThrowWhenNothing() { + assertThatCode(() -> testee.delete(CASSANDRA_ID).block()).doesNotThrowAnyException(); + } + + @Test void removeFromRecentShouldNotFailIfNotExisting() { testee.removeFromRecent(CASSANDRA_ID, UID1).block(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
