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 1df0a9f47a2fc68db2e9f39309f5c26efaa5fdfa Author: Benoit Tellier <[email protected]> AuthorDate: Sun Apr 12 20:56:22 2020 +0700 JAMES-3148 Cleanup MailboxCounters DAO --- .../CassandraMailboxSessionMapperFactory.java | 3 +- .../mailbox/cassandra/DeleteMessageListener.java | 6 +++- .../cassandra/mail/CassandraMailboxCounterDAO.java | 8 ++++++ .../cassandra/CassandraMailboxManagerTest.java | 33 ++++++++++++++++++++++ .../mail/CassandraMailboxCounterDAOTest.java | 17 +++++++++++ 5 files changed, 65 insertions(+), 2 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 ba80ed4..3631d52 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 @@ -205,6 +205,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa public DeleteMessageListener deleteMessageListener() { return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, attachmentDAOV2, ownerDAO, - attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, applicableFlagDAO, firstUnseenDAO, deletedMessageDAO); + attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, applicableFlagDAO, firstUnseenDAO, deletedMessageDAO, + mailboxCounterDAO); } } 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 c0f74d9..ed70a9a 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 @@ -35,6 +35,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO; 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.CassandraMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; @@ -71,13 +72,14 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen private final CassandraApplicableFlagDAO applicableFlagDAO; private final CassandraFirstUnseenDAO firstUnseenDAO; private final CassandraDeletedMessageDAO deletedMessageDAO; + private final CassandraMailboxCounterDAO counterDAO; @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) { + CassandraFirstUnseenDAO firstUnseenDAO, CassandraDeletedMessageDAO deletedMessageDAO, CassandraMailboxCounterDAO counterDAO) { this.imapUidDAO = imapUidDAO; this.messageIdDAO = messageIdDAO; this.messageDAO = messageDAO; @@ -89,6 +91,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen this.applicableFlagDAO = applicableFlagDAO; this.firstUnseenDAO = firstUnseenDAO; this.deletedMessageDAO = deletedMessageDAO; + this.counterDAO = counterDAO; } @Override @@ -128,6 +131,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen .then(applicableFlagDAO.delete(mailboxId)) .then(firstUnseenDAO.removeAll(mailboxId)) .then(deletedMessageDAO.removeAll(mailboxId)) + .then(counterDAO.delete(mailboxId)) .block(); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java index e9fb398..80ae4ba 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java @@ -41,6 +41,7 @@ import com.datastax.driver.core.BoundStatement; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; import com.datastax.driver.core.querybuilder.Assignment; +import com.datastax.driver.core.querybuilder.QueryBuilder; import reactor.core.publisher.Mono; @@ -56,6 +57,7 @@ public class CassandraMailboxCounterDAO { private final PreparedStatement decrementMessageCountStatement; private final PreparedStatement incrementUnseenAndCountStatement; private final PreparedStatement decrementUnseenAndCountStatement; + private final PreparedStatement deleteStatement; @Inject public CassandraMailboxCounterDAO(Session session) { @@ -81,6 +83,8 @@ public class CassandraMailboxCounterDAO { .with(decr(COUNT)) .and(decr(UNSEEN)) .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); + deleteStatement = session.prepare(QueryBuilder.delete().from(TABLE_NAME) + .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); } private PreparedStatement createReadStatement(Session session) { @@ -97,6 +101,10 @@ public class CassandraMailboxCounterDAO { .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); } + public Mono<Void> delete(CassandraId mailboxId) { + return cassandraAsyncExecutor.executeVoid(bindWithMailbox(mailboxId, deleteStatement)); + } + public Mono<MailboxCounters> retrieveMailboxCounters(CassandraId mailboxId) { return cassandraAsyncExecutor.executeSingleRow(bindWithMailbox(mailboxId, readStatement)) .map(row -> MailboxCounters.builder() 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 5f78c72..36ca5d8 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 @@ -47,6 +47,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO; 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.CassandraMessageDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO; @@ -673,6 +674,38 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai .isEmpty(); } + @Test + void deleteMailboxShouldCleanUpMailboxCounters(CassandraCluster cassandraCluster) throws Exception { + inboxManager.appendMessage(MessageManager.AppendCommand.builder() + .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session); + + mailboxManager.deleteMailbox(inbox, session); + + assertThat(countersDAO(cassandraCluster).retrieveMailboxCounters((CassandraId) inboxId) + .blockOptional()) + .isEmpty(); + } + + @Test + void deleteMailboxShouldCleanUpMailboxCountersWhenFailure(CassandraCluster cassandraCluster) throws Exception { + inboxManager.appendMessage(MessageManager.AppendCommand.builder() + .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session); + + cassandraCluster.getConf().registerScenario(fail() + .times(1) + .whenQueryStartsWith("DELETE FROM mailboxCounters WHERE mailboxId=:mailboxId;")); + + mailboxManager.deleteMailbox(inbox, session); + + assertThat(countersDAO(cassandraCluster).retrieveMailboxCounters((CassandraId) inboxId) + .blockOptional()) + .isEmpty(); + } + + private CassandraMailboxCounterDAO countersDAO(CassandraCluster cassandraCluster) { + return new CassandraMailboxCounterDAO(cassandraCluster.getConf()); + } + private CassandraDeletedMessageDAO deletedMessageDAO(CassandraCluster cassandraCluster) { return new CassandraDeletedMessageDAO(cassandraCluster.getConf()); } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java index 558e58a..e00c0e0 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.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 org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.CassandraClusterExtension; @@ -143,6 +144,22 @@ class CassandraMailboxCounterDAOTest { } @Test + void retrieveMailboxCounterShouldNotReturnDeletedItems() { + testee.incrementCount(MAILBOX_ID).block(); + testee.incrementUnseen(MAILBOX_ID).block(); + + testee.delete(MAILBOX_ID).block(); + + assertThat(testee.retrieveMailboxCounters(MAILBOX_ID).blockOptional()) + .isEmpty(); + } + + @Test + void deleteShouldNotThrowWhenNoData() { + assertThatCode(() -> testee.delete(MAILBOX_ID).block()).doesNotThrowAnyException(); + } + + @Test void decrementCountShouldRemoveOne() { testee.incrementCount(MAILBOX_ID).block(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
