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 <[email protected]> Authored: Fri May 25 11:11:01 2018 +0700 Committer: Matthieu Baechler <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
