You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2020/10/14 02:31:41 UTC

[james-project] 15/22: JAMES-3409 Fix solving mailboxes inconsistencies

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 7ca7ebcfd9e1d0c0596be8172aa226ac9ea8b1c2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Aug 11 15:43:27 2020 +0700

    JAMES-3409 Fix solving mailboxes inconsistencies
---
 .../cassandra/mail/task/ConflictingEntry.java      |  5 +-
 .../task/SolveMailboxInconsistenciesService.java   | 94 +++++++++++-----------
 .../SolveMailboxInconsistenciesServiceTest.java    | 94 +++++++++++-----------
 3 files changed, 95 insertions(+), 98 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/ConflictingEntry.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/ConflictingEntry.java
index 34a9f1a..87074c2 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/ConflictingEntry.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/ConflictingEntry.java
@@ -21,7 +21,6 @@ package org.apache.james.mailbox.cassandra.mail.task;
 
 import java.util.Objects;
 
-import org.apache.james.mailbox.cassandra.mail.CassandraIdAndPath;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -96,8 +95,8 @@ public class ConflictingEntry {
         interface RequireMailboxPathDaoEntry {
             ConflictingEntry mailboxPathDaoEntry(DaoEntry daoEntry);
 
-            default ConflictingEntry mailboxPathDaoEntry(CassandraIdAndPath mailbox) {
-                return mailboxPathDaoEntry(mailbox.getMailboxPath(), mailbox.getCassandraId());
+            default ConflictingEntry mailboxPathDaoEntry(Mailbox mailbox) {
+                return mailboxPathDaoEntry(mailbox.generateAssociatedPath(), mailbox.getMailboxId());
             }
 
             default ConflictingEntry mailboxPathDaoEntry(MailboxPath path, MailboxId id) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java
index aa53506..8aacb18 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java
@@ -30,9 +30,8 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.mail.CassandraIdAndPath;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV2DAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV3DAO;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.task.Task;
@@ -52,7 +51,7 @@ public class SolveMailboxInconsistenciesService {
 
     @FunctionalInterface
     interface Inconsistency {
-        Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV2DAO pathV2DAO);
+        Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV3DAO pathV3DAO);
     }
 
     private static Inconsistency NO_INCONSISTENCY = (context, mailboxDAO1, pathV2DAO) -> Mono.just(Result.COMPLETED);
@@ -71,8 +70,8 @@ public class SolveMailboxInconsistenciesService {
         }
 
         @Override
-        public Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV2DAO pathV2DAO) {
-            return pathV2DAO.save(mailbox.generateAssociatedPath(), (CassandraId) mailbox.getMailboxId())
+        public Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV3DAO pathV3DAO) {
+            return pathV3DAO.save(mailbox)
                 .map(success -> {
                     if (success) {
                         notifySuccess(context);
@@ -112,27 +111,27 @@ public class SolveMailboxInconsistenciesService {
      * In order to solve this inconsistency, we can simply re-reference the mailboxPath.
      */
     private static class OrphanMailboxPathDAOEntry implements Inconsistency {
-        private final CassandraIdAndPath pathRegistration;
+        private final Mailbox mailbox;
 
-        private OrphanMailboxPathDAOEntry(CassandraIdAndPath pathRegistration) {
-            this.pathRegistration = pathRegistration;
+        private OrphanMailboxPathDAOEntry(Mailbox mailbox) {
+            this.mailbox = mailbox;
         }
 
         @Override
-        public Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV2DAO pathV2DAO) {
-            return pathV2DAO.delete(pathRegistration.getMailboxPath())
+        public Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV3DAO pathV3DAO) {
+            return pathV3DAO.delete(mailbox.generateAssociatedPath())
                 .doOnSuccess(any -> {
                     LOGGER.info("Inconsistency fixed for orphan mailboxPath {} - {}",
-                        pathRegistration.getCassandraId().serialize(),
-                        pathRegistration.getMailboxPath().asString());
-                    context.addFixedInconsistency(pathRegistration.getCassandraId());
+                        mailbox.getMailboxId().serialize(),
+                        mailbox.generateAssociatedPath().asString());
+                    context.addFixedInconsistency(mailbox.getMailboxId());
                 })
                 .map(any -> Result.COMPLETED)
                 .defaultIfEmpty(Result.COMPLETED)
                 .onErrorResume(e -> {
                     LOGGER.error("Failed fixing inconsistency for orphan mailboxPath {} - {}",
-                        pathRegistration.getCassandraId().serialize(),
-                        pathRegistration.getMailboxPath().asString(),
+                        mailbox.getMailboxId().serialize(),
+                        mailbox.generateAssociatedPath().asString(),
                         e);
                     context.incrementErrors();
                     return Mono.just(Result.PARTIAL);
@@ -152,19 +151,12 @@ public class SolveMailboxInconsistenciesService {
     private static class ConflictingEntryInconsistency implements Inconsistency {
         private final ConflictingEntry conflictingEntry;
 
-        private ConflictingEntryInconsistency(Mailbox mailbox, CassandraIdAndPath pathRegistration) {
-            boolean samePath = mailbox.generateAssociatedPath().equals(pathRegistration.getMailboxPath());
-            boolean sameId = mailbox.getMailboxId().equals(pathRegistration.getCassandraId());
-
-            Preconditions.checkState(samePath != sameId);
-
-            this.conflictingEntry = ConflictingEntry.builder()
-                .mailboxDaoEntry(mailbox)
-                .mailboxPathDaoEntry(pathRegistration);
+        private ConflictingEntryInconsistency(ConflictingEntry conflictingEntry) {
+            this.conflictingEntry = conflictingEntry;
         }
 
         @Override
-        public Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV2DAO pathV2DAO) {
+        public Mono<Result> fix(Context context, CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV3DAO pathV3DAO) {
             LOGGER.error("MailboxDAO contains mailbox {} {} which conflict with corresponding registration {} {}. " +
                 "We recommend merging these mailboxes together to prevent mail data loss.",
                 conflictingEntry.getMailboxDaoEntry().getMailboxId(), conflictingEntry.getMailboxDaoEntry().getMailboxPath(),
@@ -353,16 +345,16 @@ public class SolveMailboxInconsistenciesService {
         }
     }
 
-    private static final SchemaVersion MAILBOX_PATH_V_2_MIGRATION_PERFORMED_VERSION = new SchemaVersion(6);
+    private static final SchemaVersion MAILBOX_PATH_V_3_MIGRATION_PERFORMED_VERSION = new SchemaVersion(8);
 
     private final CassandraMailboxDAO mailboxDAO;
-    private final CassandraMailboxPathV2DAO mailboxPathV2DAO;
+    private final CassandraMailboxPathV3DAO mailboxPathV3DAO;
     private final CassandraSchemaVersionManager versionManager;
 
     @Inject
-    SolveMailboxInconsistenciesService(CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV2DAO mailboxPathV2DAO, CassandraSchemaVersionManager versionManager) {
+    SolveMailboxInconsistenciesService(CassandraMailboxDAO mailboxDAO, CassandraMailboxPathV3DAO mailboxPathV3DAO, CassandraSchemaVersionManager versionManager) {
         this.mailboxDAO = mailboxDAO;
-        this.mailboxPathV2DAO = mailboxPathV2DAO;
+        this.mailboxPathV3DAO = mailboxPathV3DAO;
         this.versionManager = versionManager;
     }
 
@@ -377,49 +369,55 @@ public class SolveMailboxInconsistenciesService {
     private void assertValidVersion() {
         SchemaVersion version = versionManager.computeVersion().block();
 
-        boolean isVersionValid = version.isAfterOrEquals(MAILBOX_PATH_V_2_MIGRATION_PERFORMED_VERSION);
+        boolean isVersionValid = version.isAfterOrEquals(MAILBOX_PATH_V_3_MIGRATION_PERFORMED_VERSION);
 
         Preconditions.checkState(isVersionValid,
-            "Schema version %s is required in order to ensure mailboxPathV2DAO to be correctly populated, got %s",
-            MAILBOX_PATH_V_2_MIGRATION_PERFORMED_VERSION.getValue(),
+            "Schema version %s is required in order to ensure mailboxPathV3DAO to be correctly populated, got %s",
+            MAILBOX_PATH_V_3_MIGRATION_PERFORMED_VERSION.getValue(),
             version.getValue());
     }
 
     private Flux<Result> processMailboxPathDaoInconsistencies(Context context) {
-        return mailboxPathV2DAO.listAll()
-            .flatMap(this::detectInconsistency)
-            .flatMap(inconsistency -> inconsistency.fix(context, mailboxDAO, mailboxPathV2DAO))
+        return mailboxPathV3DAO.listAll()
+            .flatMap(this::detectMailboxPathDaoInconsistency)
+            .flatMap(inconsistency -> inconsistency.fix(context, mailboxDAO, mailboxPathV3DAO))
             .doOnNext(any -> context.incrementProcessedMailboxPathEntries());
     }
 
     private Flux<Result> processMailboxDaoInconsistencies(Context context) {
         return mailboxDAO.retrieveAllMailboxes()
-            .flatMap(this::detectInconsistency)
-            .flatMap(inconsistency -> inconsistency.fix(context, mailboxDAO, mailboxPathV2DAO))
+            .flatMap(this::detectMailboxDaoInconsistency)
+            .flatMap(inconsistency -> inconsistency.fix(context, mailboxDAO, mailboxPathV3DAO))
             .doOnNext(any -> context.incrementProcessedMailboxEntries());
     }
 
-    private Mono<Inconsistency> detectInconsistency(Mailbox mailbox) {
-        return mailboxPathV2DAO.retrieveId(mailbox.generateAssociatedPath())
-            .map(pathRegistration -> {
-                if (pathRegistration.getCassandraId().equals(mailbox.getMailboxId())) {
+    private Mono<Inconsistency> detectMailboxDaoInconsistency(Mailbox mailbox) {
+        return mailboxPathV3DAO.retrieve(mailbox.generateAssociatedPath())
+            .map(mailboxByPath -> {
+                if (mailboxByPath.getMailboxId().equals(mailbox.getMailboxId())) {
                     return NO_INCONSISTENCY;
                 }
                 // Path entry references another mailbox.
-                return new ConflictingEntryInconsistency(mailbox, pathRegistration);
+                return new ConflictingEntryInconsistency(ConflictingEntry.builder()
+                    .mailboxDaoEntry(mailbox)
+                    .mailboxPathDaoEntry(mailboxByPath));
             })
             .defaultIfEmpty(new OrphanMailboxDAOEntry(mailbox));
     }
 
-    private Mono<Inconsistency> detectInconsistency(CassandraIdAndPath pathRegistration) {
-        return mailboxDAO.retrieveMailbox(pathRegistration.getCassandraId())
-            .map(mailbox -> {
-                if (mailbox.generateAssociatedPath().equals(pathRegistration.getMailboxPath())) {
+    private Mono<Inconsistency> detectMailboxPathDaoInconsistency(Mailbox mailboxByPath) {
+        CassandraId cassandraId = (CassandraId) mailboxByPath.getMailboxId();
+
+        return mailboxDAO.retrieveMailbox(cassandraId)
+            .map(mailboxById -> {
+                if (mailboxByPath.generateAssociatedPath().equals(mailboxById.generateAssociatedPath())) {
                     return NO_INCONSISTENCY;
                 }
                 // Mailbox references another path
-                return new ConflictingEntryInconsistency(mailbox, pathRegistration);
+                return new ConflictingEntryInconsistency(ConflictingEntry.builder()
+                    .mailboxDaoEntry(mailboxById)
+                    .mailboxPathDaoEntry(mailboxByPath));
             })
-            .defaultIfEmpty(new OrphanMailboxPathDAOEntry(pathRegistration));
+            .defaultIfEmpty(new OrphanMailboxPathDAOEntry(mailboxByPath));
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java
index 623d4a3..4bf8ec1 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java
@@ -33,9 +33,8 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.mail.CassandraIdAndPath;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
-import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV2DAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV3DAO;
 import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesService.Context;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
@@ -54,9 +53,11 @@ class SolveMailboxInconsistenciesServiceTest {
     private static final Username USER = Username.of("user");
     private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(USER, "abc");
     private static final MailboxPath NEW_MAILBOX_PATH = MailboxPath.forUser(USER, "xyz");
-    private static CassandraId CASSANDRA_ID_1 = CassandraId.timeBased();
+    private static final CassandraId CASSANDRA_ID_1 = CassandraId.timeBased();
     private static final Mailbox MAILBOX = new Mailbox(MAILBOX_PATH, UID_VALIDITY_1, CASSANDRA_ID_1);
-    private static CassandraId CASSANDRA_ID_2 = CassandraId.timeBased();
+    private static final Mailbox MAILBOX_NEW_PATH = new Mailbox(NEW_MAILBOX_PATH, UID_VALIDITY_1, CASSANDRA_ID_1);
+    private static final CassandraId CASSANDRA_ID_2 = CassandraId.timeBased();
+    private static final Mailbox MAILBOX_2 = new Mailbox(MAILBOX_PATH, UID_VALIDITY_1, CASSANDRA_ID_2);
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
@@ -67,7 +68,7 @@ class SolveMailboxInconsistenciesServiceTest {
 
 
     CassandraMailboxDAO mailboxDAO;
-    CassandraMailboxPathV2DAO mailboxPathV2DAO;
+    CassandraMailboxPathV3DAO mailboxPathV3DAO;
     CassandraSchemaVersionDAO versionDAO;
     SolveMailboxInconsistenciesService testee;
 
@@ -77,14 +78,14 @@ class SolveMailboxInconsistenciesServiceTest {
             cassandra.getConf(),
             cassandra.getTypesProvider(),
             cassandraCluster.getCassandraConsistenciesConfiguration());
-        mailboxPathV2DAO = new CassandraMailboxPathV2DAO(
+        mailboxPathV3DAO = new CassandraMailboxPathV3DAO(
             cassandra.getConf(),
             CassandraUtils.WITH_DEFAULT_CONFIGURATION,
             cassandraCluster.getCassandraConsistenciesConfiguration());
         versionDAO = new CassandraSchemaVersionDAO(cassandra.getConf());
-        testee = new SolveMailboxInconsistenciesService(mailboxDAO, mailboxPathV2DAO, new CassandraSchemaVersionManager(versionDAO));
+        testee = new SolveMailboxInconsistenciesService(mailboxDAO, mailboxPathV3DAO, new CassandraSchemaVersionManager(versionDAO));
 
-        versionDAO.updateVersion(new SchemaVersion(7)).block();
+        versionDAO.updateVersion(new SchemaVersion(8)).block();
     }
 
     @Test
@@ -94,7 +95,7 @@ class SolveMailboxInconsistenciesServiceTest {
 
         assertThatThrownBy(() -> testee.fixMailboxInconsistencies(new Context()).block())
             .isInstanceOf(IllegalStateException.class)
-            .hasMessage("Schema version 6 is required in order to ensure mailboxPathV2DAO to be correctly populated, got 5");
+            .hasMessage("Schema version 8 is required in order to ensure mailboxPathV3DAO to be correctly populated, got 5");
     }
 
     @Test
@@ -103,13 +104,13 @@ class SolveMailboxInconsistenciesServiceTest {
 
         assertThatThrownBy(() -> testee.fixMailboxInconsistencies(new Context()).block())
             .isInstanceOf(IllegalStateException.class)
-            .hasMessage("Schema version 6 is required in order to ensure mailboxPathV2DAO to be correctly populated, got 5");
+            .hasMessage("Schema version 8 is required in order to ensure mailboxPathV3DAO to be correctly populated, got 5");
     }
 
     @Test
     void fixMailboxInconsistenciesShouldNotFailWhenIsEqualToMailboxPathV2Migration() {
         versionDAO.truncateVersion().block();
-        versionDAO.updateVersion(new SchemaVersion(6)).block();
+        versionDAO.updateVersion(new SchemaVersion(8)).block();
 
         assertThatCode(() -> testee.fixMailboxInconsistencies(new Context()).block())
             .doesNotThrowAnyException();
@@ -118,7 +119,7 @@ class SolveMailboxInconsistenciesServiceTest {
     @Test
     void fixMailboxInconsistenciesShouldNotFailWhenIsAboveMailboxPathV2Migration() {
         versionDAO.truncateVersion().block();
-        versionDAO.updateVersion(new SchemaVersion(7)).block();
+        versionDAO.updateVersion(new SchemaVersion(8)).block();
 
         assertThatCode(() -> testee.fixMailboxInconsistencies(new Context()).block())
             .doesNotThrowAnyException();
@@ -133,7 +134,7 @@ class SolveMailboxInconsistenciesServiceTest {
     @Test
     void fixMailboxInconsistenciesShouldReturnCompletedWhenConsistentData() {
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX).block();
 
         assertThat(testee.fixMailboxInconsistencies(new Context()).block())
             .isEqualTo(Result.COMPLETED);
@@ -149,7 +150,7 @@ class SolveMailboxInconsistenciesServiceTest {
 
     @Test
     void fixMailboxInconsistenciesShouldReturnCompletedWhenOrphanPathData() {
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX).block();
 
         assertThat(testee.fixMailboxInconsistencies(new Context()).block())
             .isEqualTo(Result.COMPLETED);
@@ -158,7 +159,7 @@ class SolveMailboxInconsistenciesServiceTest {
     @Test
     void fixMailboxInconsistenciesShouldReturnPartialWhenDAOMisMatchOnId() {
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_2).block();
+        mailboxPathV3DAO.save(MAILBOX_2).block();
 
         assertThat(testee.fixMailboxInconsistencies(new Context()).block())
             .isEqualTo(Result.PARTIAL);
@@ -167,7 +168,7 @@ class SolveMailboxInconsistenciesServiceTest {
     @Test
     void fixMailboxInconsistenciesShouldReturnPartialWhenDAOMisMatchOnPath() {
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(NEW_MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX_NEW_PATH).block();
 
         assertThat(testee.fixMailboxInconsistencies(new Context()).block())
             .isEqualTo(Result.PARTIAL);
@@ -186,7 +187,7 @@ class SolveMailboxInconsistenciesServiceTest {
     void fixMailboxInconsistenciesShouldUpdateContextWhenConsistentData() {
         Context context = new Context();
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX).block();
 
         testee.fixMailboxInconsistencies(context).block();
 
@@ -217,7 +218,7 @@ class SolveMailboxInconsistenciesServiceTest {
     @Test
     void fixMailboxInconsistenciesShouldUpdateContextWhenOrphanPathData() {
         Context context = new Context();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX).block();
 
         testee.fixMailboxInconsistencies(context).block();
 
@@ -233,7 +234,7 @@ class SolveMailboxInconsistenciesServiceTest {
     void fixMailboxInconsistenciesShouldUpdateContextWhenDAOMisMatchOnId() {
         Context context = new Context();
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_2).block();
+        mailboxPathV3DAO.save(MAILBOX_2).block();
         mailboxDAO.save(new Mailbox(MAILBOX_PATH, UID_VALIDITY_2, CASSANDRA_ID_2)).block();
 
         testee.fixMailboxInconsistencies(context).block();
@@ -253,7 +254,7 @@ class SolveMailboxInconsistenciesServiceTest {
     void fixMailboxInconsistenciesShouldUpdateContextWhenDAOMisMatchOnPath() {
         Context context = new Context();
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(NEW_MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX_NEW_PATH).block();
 
         testee.fixMailboxInconsistencies(context).block();
 
@@ -264,7 +265,7 @@ class SolveMailboxInconsistenciesServiceTest {
                 .addFixedInconsistencies(CASSANDRA_ID_1)
                 .addConflictingEntry(ConflictingEntry.builder()
                     .mailboxDaoEntry(MAILBOX)
-                    .mailboxPathDaoEntry(NEW_MAILBOX_PATH, CASSANDRA_ID_1))
+                    .mailboxPathDaoEntry(MAILBOX_NEW_PATH))
                 .build()
                 .snapshot());
     }
@@ -275,22 +276,22 @@ class SolveMailboxInconsistenciesServiceTest {
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block()).isEmpty();
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block()).isEmpty();
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block()).isEmpty();
         });
     }
 
     @Test
     void fixMailboxInconsistenciesShouldNotAlterStateWhenConsistent() {
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
-                .containsExactlyInAnyOrder(new CassandraIdAndPath(CASSANDRA_ID_1, MAILBOX_PATH));
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
+                .containsExactlyInAnyOrder(MAILBOX);
         });
     }
 
@@ -303,21 +304,21 @@ class SolveMailboxInconsistenciesServiceTest {
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
-                .containsExactlyInAnyOrder(new CassandraIdAndPath(CASSANDRA_ID_1, MAILBOX_PATH));
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
+                .containsExactlyInAnyOrder(MAILBOX);
         });
     }
 
     @Test
     void fixMailboxInconsistenciesShouldAlterStateWhenOrphanMailboxPath() {
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .isEmpty();
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
                 .isEmpty();
         });
     }
@@ -327,18 +328,18 @@ class SolveMailboxInconsistenciesServiceTest {
         mailboxDAO.save(MAILBOX).block();
         Mailbox mailbox2 = new Mailbox(NEW_MAILBOX_PATH, UID_VALIDITY_2, CASSANDRA_ID_2);
         mailboxDAO.save(mailbox2).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_2).block();
-        mailboxPathV2DAO.save(NEW_MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX_2).block();
+        mailboxPathV3DAO.save(MAILBOX_NEW_PATH).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX, mailbox2);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
                 .containsExactlyInAnyOrder(
-                    new CassandraIdAndPath(CASSANDRA_ID_1, NEW_MAILBOX_PATH),
-                    new CassandraIdAndPath(CASSANDRA_ID_2, MAILBOX_PATH));
+                    MAILBOX_NEW_PATH,
+                    MAILBOX_2);
         });
     }
 
@@ -347,31 +348,31 @@ class SolveMailboxInconsistenciesServiceTest {
         // Note that CASSANDRA_ID_1 becomes usable
         // However in order to avoid data loss, merging CASSANDRA_ID_1 and CASSANDRA_ID_2 is still required
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(NEW_MAILBOX_PATH, CASSANDRA_ID_1).block();
+        mailboxPathV3DAO.save(MAILBOX_NEW_PATH).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
                 .containsExactlyInAnyOrder(
-                    new CassandraIdAndPath(CASSANDRA_ID_1, NEW_MAILBOX_PATH),
-                    new CassandraIdAndPath(CASSANDRA_ID_1, MAILBOX_PATH));
+                    MAILBOX_NEW_PATH,
+                    MAILBOX);
         });
     }
 
     @Test
     void fixMailboxInconsistenciesShouldAlterStateWhenDaoMisMatchOnId() {
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_2).block();
+        mailboxPathV3DAO.save(MAILBOX_2).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
                 .isEmpty();
         });
     }
@@ -379,7 +380,7 @@ class SolveMailboxInconsistenciesServiceTest {
     @Test
     void multipleRunShouldDaoMisMatchOnId() {
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_2).block();
+        mailboxPathV3DAO.save(MAILBOX_2).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
         testee.fixMailboxInconsistencies(new Context()).block();
@@ -387,8 +388,8 @@ class SolveMailboxInconsistenciesServiceTest {
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
-                .containsExactlyInAnyOrder(new CassandraIdAndPath(CASSANDRA_ID_1, MAILBOX_PATH));
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
+                .containsExactlyInAnyOrder(MAILBOX);
         });
     }
 
@@ -398,7 +399,7 @@ class SolveMailboxInconsistenciesServiceTest {
         Mailbox mailbox2 = new Mailbox(MAILBOX_PATH, UID_VALIDITY_2, CASSANDRA_ID_2);
 
         mailboxDAO.save(MAILBOX).block();
-        mailboxPathV2DAO.save(MAILBOX_PATH, CASSANDRA_ID_2).block();
+        mailboxPathV3DAO.save(MAILBOX_2).block();
         mailboxDAO.save(mailbox2).block();
 
         testee.fixMailboxInconsistencies(new Context()).block();
@@ -406,9 +407,8 @@ class SolveMailboxInconsistenciesServiceTest {
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(mailboxDAO.retrieveAllMailboxes().collectList().block())
                 .containsExactlyInAnyOrder(MAILBOX, mailbox2);
-            softly.assertThat(mailboxPathV2DAO.listAll().collectList().block())
-                .containsExactlyInAnyOrder(
-                    new CassandraIdAndPath(CASSANDRA_ID_2, MAILBOX_PATH));
+            softly.assertThat(mailboxPathV3DAO.listAll().collectList().block())
+                .containsExactlyInAnyOrder(MAILBOX_2);
         });
     }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org