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