JAMES-3148 Cleanup MailboxCounters DAO
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 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.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 @@
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 @@
this.applicableFlagDAO = applicableFlagDAO;
this.firstUnseenDAO = firstUnseenDAO;
this.deletedMessageDAO = deletedMessageDAO;
+ this.counterDAO = counterDAO;
}
@Override
@@ -128,6 +131,7 @@
.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.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 @@
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 @@
.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 @@
.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.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 @@
.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 @@
}
@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();