JAMES-3148 Cleanup Mailbox recents 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 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 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.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 @@
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 @@
this.firstUnseenDAO = firstUnseenDAO;
this.deletedMessageDAO = deletedMessageDAO;
this.counterDAO = counterDAO;
+ this.recentsDAO = recentsDAO;
}
@Override
@@ -132,6 +135,7 @@
.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 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 @@
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 @@
cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
readStatement = createReadStatement(session);
deleteStatement = createDeleteStatement(session);
+ deleteAllStatement = createDeleteAllStatement(session);
addStatement = createAddStatement(session);
this.cassandraUtils = cassandraUtils;
}
@@ -72,12 +74,19 @@
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 @@
.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.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 @@
.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 @@
}
@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();