You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2018/05/28 15:43:15 UTC

[6/7] james-project git commit: MAILBOX-339 Implementing migration to remove UDT primary key

MAILBOX-339 Implementing migration to remove UDT primary key


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9a515e07
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9a515e07
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9a515e07

Branch: refs/heads/master
Commit: 9a515e073f471627da7cbae6c743e6507643e9fc
Parents: 11fed81
Author: benwa <bt...@linagora.com>
Authored: Fri May 25 11:11:01 2018 +0700
Committer: Matthieu Baechler <ma...@apache.org>
Committed: Mon May 28 17:40:31 2018 +0200

----------------------------------------------------------------------
 .../versions/CassandraSchemaVersionManager.java |   2 +-
 .../mail/CassandraMailboxPathDAOImpl.java       |  32 ++++-
 .../mail/migration/MailboxPathV2Migration.java  | 102 ++++++++++++++
 .../mail/CassandraMailboxPathDAOImplTest.java   |  49 +++++++
 .../mail/CassandraMailboxPathDAOTest.java       |  13 +-
 .../migration/MailboxPathV2MigrationTest.java   | 135 +++++++++++++++++++
 .../modules/server/CassandraRoutesModule.java   |   3 +
 7 files changed, 326 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
index 40b4a7d..d953f7e 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
@@ -34,7 +34,7 @@ import com.google.common.base.Preconditions;
 
 public class CassandraSchemaVersionManager {
     public static final SchemaVersion MIN_VERSION = new SchemaVersion(2);
-    public static final SchemaVersion MAX_VERSION = new SchemaVersion(5);
+    public static final SchemaVersion MAX_VERSION = new SchemaVersion(6);
     public static final SchemaVersion DEFAULT_VERSION = MIN_VERSION;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CassandraSchemaVersionManager.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
index 11080e2..41f5dd0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.count;
 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;
@@ -53,13 +54,17 @@ import com.google.common.annotations.VisibleForTesting;
 
 public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
 
+    private static final int FIRST_CELL = 0;
+
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final MailboxBaseTupleUtil mailboxBaseTupleUtil;
     private final CassandraUtils cassandraUtils;
     private final PreparedStatement delete;
     private final PreparedStatement insert;
     private final PreparedStatement select;
+    private final PreparedStatement selectAllForUser;
     private final PreparedStatement selectAll;
+    private final PreparedStatement countAll;
 
     @Inject
     public CassandraMailboxPathDAOImpl(Session session, CassandraTypesProvider typesProvider, CassandraUtils cassandraUtils) {
@@ -69,7 +74,9 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
         this.insert = prepareInsert(session);
         this.delete = prepareDelete(session);
         this.select = prepareSelect(session);
+        this.selectAllForUser = prepareSelectAllForUser(session);
         this.selectAll = prepareSelectAll(session);
+        this.countAll = prepareCountAll(session);
     }
 
     @VisibleForTesting
@@ -99,12 +106,22 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
             .and(eq(MAILBOX_NAME, bindMarker(MAILBOX_NAME))));
     }
 
-    private PreparedStatement prepareSelectAll(Session session) {
+    private PreparedStatement prepareSelectAllForUser(Session session) {
         return session.prepare(select(FIELDS)
             .from(TABLE_NAME)
             .where(eq(NAMESPACE_AND_USER, bindMarker(NAMESPACE_AND_USER))));
     }
 
+    private PreparedStatement prepareSelectAll(Session session) {
+        return session.prepare(select(FIELDS)
+            .from(TABLE_NAME));
+    }
+
+    private PreparedStatement prepareCountAll(Session session) {
+        return session.prepare(select(count(NAMESPACE_AND_USER))
+            .from(TABLE_NAME));
+    }
+
     public CompletableFuture<Optional<CassandraIdAndPath>> retrieveId(MailboxPath mailboxPath) {
         return cassandraAsyncExecutor.executeSingleRow(
             select.bind()
@@ -118,7 +135,7 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
     @Override
     public CompletableFuture<Stream<CassandraIdAndPath>> listUserMailboxes(String namespace, String user) {
         return cassandraAsyncExecutor.execute(
-            selectAll.bind()
+            selectAllForUser.bind()
                 .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(namespace, user)))
             .thenApply(resultSet -> cassandraUtils.convertToStream(resultSet)
                 .map(this::fromRowToCassandraIdAndPath)
@@ -182,4 +199,15 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
             .setString(MAILBOX_NAME, mailboxPath.getName()));
     }
 
+    public CompletableFuture<Stream<CassandraIdAndPath>> readAll() {
+        return cassandraAsyncExecutor.execute(selectAll.bind())
+            .thenApply(cassandraUtils::convertToStream)
+            .thenApply(stream -> stream.map(this::fromRowToCassandraIdAndPath));
+    }
+
+    public CompletableFuture<Long> countAll() {
+        return cassandraAsyncExecutor.executeSingleRow(countAll.bind())
+            .thenApply(optional -> optional.map(row -> row.getLong(FIRST_CELL)).orElse(0L));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
new file mode 100644
index 0000000..70f4a8e
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
@@ -0,0 +1,102 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.mail.migration;
+
+import java.util.Optional;
+import java.util.function.Supplier;
+
+import javax.inject.Inject;
+
+import org.apache.james.backends.cassandra.migration.Migration;
+import org.apache.james.mailbox.cassandra.mail.CassandraIdAndPath;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAOImpl;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV2DAO;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MailboxPathV2Migration implements Migration {
+
+    public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
+        private final Supplier<Long> countSupplier;
+        private final long initialCount;
+
+        public AdditionalInformation(Supplier<Long> countSupplier) {
+            this.countSupplier = countSupplier;
+            this.initialCount = countSupplier.get();
+        }
+
+        public long getRemainingCount() {
+            return countSupplier.get();
+        }
+
+        public long getInitialCount() {
+            return initialCount;
+        }
+    }
+
+    public static final Logger LOGGER = LoggerFactory.getLogger(MailboxPathV2Migration.class);
+    private final CassandraMailboxPathDAOImpl daoV1;
+    private final CassandraMailboxPathV2DAO daoV2;
+    private final AdditionalInformation additionalInformation;
+
+    @Inject
+    public MailboxPathV2Migration(CassandraMailboxPathDAOImpl daoV1, CassandraMailboxPathV2DAO daoV2) {
+        this.daoV1 = daoV1;
+        this.daoV2 = daoV2;
+        this.additionalInformation = new AdditionalInformation(() -> daoV1.countAll().join());
+    }
+
+    @Override
+    public Result run() {
+        try {
+            return daoV1.readAll()
+                .join()
+                .map(this::migrate)
+                .reduce(Result.COMPLETED, Task::combine);
+        } catch (Exception e) {
+            LOGGER.error("Error while performing migration", e);
+            return Result.PARTIAL;
+        }
+    }
+
+    public Result migrate(CassandraIdAndPath idAndPath) {
+        try {
+            daoV2.save(idAndPath.getMailboxPath(), idAndPath.getCassandraId()).join();
+
+            daoV1.delete(idAndPath.getMailboxPath()).join();
+            return Result.COMPLETED;
+        } catch (Exception e) {
+            LOGGER.error("Error while performing migration for path {}", idAndPath.getMailboxPath(), e);
+            return Result.PARTIAL;
+        }
+    }
+
+    @Override
+    public String type() {
+        return "Cassandra_mailboxPathV2Migration";
+    }
+
+    @Override
+    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
+        return Optional.of(additionalInformation);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
index c532bd7..d1ab133 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
@@ -19,10 +19,59 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+import com.github.steveash.guavate.Guavate;
+
 public class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest {
 
     @Override
     CassandraMailboxPathDAO testee() {
         return new CassandraMailboxPathDAOImpl(cassandra.getConf(), cassandra.getTypesProvider());
     }
+
+    @Test
+    public void countAllShouldReturnEntryCount() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
+        testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).join();
+        testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).join();
+
+        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
+
+        assertThat(daoV1.countAll().join())
+            .isEqualTo(3);
+    }
+
+    @Test
+    public void countAllShouldReturnZeroByDefault() {
+        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
+
+        assertThat(daoV1.countAll().join())
+            .isEqualTo(0);
+    }
+
+    @Test
+    public void readAllShouldReturnAllStoredData() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).join();
+        testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).join();
+        testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).join();
+
+        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
+
+        assertThat(daoV1.readAll().join().collect(Guavate.toImmutableList()))
+            .containsOnly(
+                new CassandraIdAndPath(INBOX_ID, USER_INBOX_MAILBOXPATH),
+                new CassandraIdAndPath(OUTBOX_ID, USER_OUTBOX_MAILBOXPATH),
+                new CassandraIdAndPath(otherMailboxId, OTHER_USER_MAILBOXPATH));
+    }
+
+    @Test
+    public void readAllShouldReturnEmptyByDefault() {
+        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
+
+        assertThat(daoV1.readAll().join().collect(Guavate.toImmutableList()))
+            .isEmpty();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
index ded624c..14741a7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
@@ -38,11 +38,11 @@ import com.github.steveash.guavate.Guavate;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 public abstract class CassandraMailboxPathDAOTest {
-    private static final String USER = "user";
-    private static final String OTHER_USER = "other";
-    private static final CassandraId INBOX_ID = CassandraId.timeBased();
-    private static final CassandraId OUTBOX_ID = CassandraId.timeBased();
-    private static final CassandraId otherMailboxId = CassandraId.timeBased();
+    protected static final String USER = "user";
+    protected static final String OTHER_USER = "other";
+    protected static final CassandraId INBOX_ID = CassandraId.timeBased();
+    protected static final CassandraId OUTBOX_ID = CassandraId.timeBased();
+    protected static final CassandraId otherMailboxId = CassandraId.timeBased();
 
     public static final MailboxPath USER_INBOX_MAILBOXPATH = MailboxPath.forUser(USER, "INBOX");
     public static final CassandraIdAndPath INBOX_ID_AND_PATH = new CassandraIdAndPath(INBOX_ID, USER_INBOX_MAILBOXPATH);
@@ -53,7 +53,7 @@ public abstract class CassandraMailboxPathDAOTest {
     
     protected CassandraCluster cassandra;
 
-    private CassandraMailboxPathDAO testee;
+    protected CassandraMailboxPathDAO testee;
 
     abstract CassandraMailboxPathDAO testee();
 
@@ -61,7 +61,6 @@ public abstract class CassandraMailboxPathDAOTest {
     public void setUp() throws Exception {
         cassandra = CassandraCluster.create(new CassandraMailboxModule(), cassandraServer.getIp(), cassandraServer.getBindingPort());
         testee = testee();
-
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
new file mode 100644
index 0000000..249ec59
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
@@ -0,0 +1,135 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.mail.migration;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.init.CassandraConfiguration;
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.mailbox.cassandra.ids.CassandraId;
+import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
+import org.apache.james.mailbox.cassandra.mail.CassandraIdAndPath;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxMapper;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAOImpl;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV2DAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
+import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+public class MailboxPathV2MigrationTest {
+
+    private static final MailboxPath MAILBOX_PATH_1 = MailboxPath.forUser("bob", "Important");
+    private static final int UID_VALIDITY_1 = 452;
+    private static final SimpleMailbox MAILBOX_1 = new SimpleMailbox(MAILBOX_PATH_1, UID_VALIDITY_1);
+    private static final CassandraId MAILBOX_ID_1 = CassandraId.timeBased();
+
+    @BeforeClass
+    public static void setUpClass() {
+        MAILBOX_1.setMailboxId(MAILBOX_ID_1);
+    }
+
+    @ClassRule
+    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
+    private CassandraMailboxPathDAOImpl daoV1;
+    private CassandraMailboxPathV2DAO daoV2;
+    private CassandraMailboxMapper mailboxMapper;
+    private CassandraMailboxDAO mailboxDAO;
+
+    @Before
+    public void setUp() {
+        CassandraCluster cassandra = CassandraCluster.create(
+            new CassandraModuleComposite(
+                new CassandraMailboxModule(),
+                new CassandraAclModule()),
+            cassandraServer.getIp(),
+            cassandraServer.getBindingPort());
+
+        daoV1 = new CassandraMailboxPathDAOImpl(
+            cassandra.getConf(),
+            cassandra.getTypesProvider(),
+            CassandraUtils.WITH_DEFAULT_CONFIGURATION);
+        daoV2 = new CassandraMailboxPathV2DAO(
+            cassandra.getConf(),
+            CassandraUtils.WITH_DEFAULT_CONFIGURATION);
+
+        CassandraUserMailboxRightsDAO userMailboxRightsDAO = new CassandraUserMailboxRightsDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
+        mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider());
+        mailboxMapper = new CassandraMailboxMapper(
+            mailboxDAO,
+            daoV1,
+            daoV2,
+            userMailboxRightsDAO,
+            new CassandraACLMapper(cassandra.getConf(), userMailboxRightsDAO, CassandraConfiguration.DEFAULT_CONFIGURATION));
+    }
+
+    @Test
+    public void newValuesShouldBeSavedInMostRecentDAO() throws Exception {
+        mailboxMapper.save(MAILBOX_1);
+
+        assertThat(daoV2.retrieveId(MAILBOX_PATH_1).join())
+            .contains(new CassandraIdAndPath(MAILBOX_ID_1, MAILBOX_PATH_1));
+    }
+
+    @Test
+    public void newValuesShouldNotBeSavedInOldDAO() throws Exception {
+        mailboxMapper.save(MAILBOX_1);
+
+        assertThat(daoV1.retrieveId(MAILBOX_PATH_1).join())
+            .isEmpty();
+    }
+
+    @Test
+    public void readingOldValuesShouldNotMigrateThem() throws Exception {
+        daoV1.save(MAILBOX_PATH_1, MAILBOX_ID_1).join();
+        mailboxDAO.save(MAILBOX_1).join();
+
+        mailboxMapper.findMailboxByPath(MAILBOX_PATH_1);
+
+        SoftAssertions softly = new SoftAssertions();
+        softly.assertThat(daoV1.retrieveId(MAILBOX_PATH_1).join()).isNotEmpty();
+        softly.assertThat(daoV2.retrieveId(MAILBOX_PATH_1).join()).isEmpty();
+        softly.assertAll();
+    }
+
+    @Test
+    public void migrationTaskShouldMoveDataToMostRecentDao() {
+        daoV1.save(MAILBOX_PATH_1, MAILBOX_ID_1).join();
+
+        new MailboxPathV2Migration(daoV1, daoV2).run();
+
+        SoftAssertions softly = new SoftAssertions();
+        softly.assertThat(daoV1.retrieveId(MAILBOX_PATH_1).join()).isEmpty();
+        softly.assertThat(daoV2.retrieveId(MAILBOX_PATH_1).join())
+            .contains(new CassandraIdAndPath(MAILBOX_ID_1, MAILBOX_PATH_1));
+        softly.assertAll();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a515e07/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java b/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
index 040ca47..7513df4 100644
--- a/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-cassandra/src/main/java/org/apache/james/modules/server/CassandraRoutesModule.java
@@ -25,6 +25,7 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManage
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
 import org.apache.james.mailbox.cassandra.mail.migration.AttachmentMessageIdCreation;
 import org.apache.james.mailbox.cassandra.mail.migration.AttachmentV2Migration;
+import org.apache.james.mailbox.cassandra.mail.migration.MailboxPathV2Migration;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.routes.CassandraMailboxMergingRoutes;
 import org.apache.james.webadmin.routes.CassandraMigrationRoutes;
@@ -39,6 +40,7 @@ public class CassandraRoutesModule extends AbstractModule {
     private static final SchemaVersion FROM_V2_TO_V3 = new SchemaVersion(2);
     private static final SchemaVersion FROM_V3_TO_V4 = new SchemaVersion(3);
     private static final SchemaVersion FROM_V4_TO_V5 = new SchemaVersion(4);
+    private static final SchemaVersion FROM_V5_TO_V6 = new SchemaVersion(5);
 
     @Override
     protected void configure() {
@@ -54,6 +56,7 @@ public class CassandraRoutesModule extends AbstractModule {
         allMigrationClazzBinder.addBinding(FROM_V2_TO_V3).toInstance(() -> Migration.Result.COMPLETED);
         allMigrationClazzBinder.addBinding(FROM_V3_TO_V4).to(AttachmentV2Migration.class);
         allMigrationClazzBinder.addBinding(FROM_V4_TO_V5).to(AttachmentMessageIdCreation.class);
+        allMigrationClazzBinder.addBinding(FROM_V5_TO_V6).to(MailboxPathV2Migration.class);
 
         bind(SchemaVersion.class)
             .annotatedWith(Names.named(CassandraMigrationService.LATEST_VERSION))


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