MAILBOX-339 Rolling migration for mailboxPathV2
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7b38d06c Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7b38d06c Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7b38d06c Branch: refs/heads/master Commit: 7b38d06c6a172744e59996f9aab37df290d5b7b8 Parents: 9a515e0 Author: benwa <btell...@linagora.com> Authored: Fri May 25 17:17:54 2018 +0700 Committer: Matthieu Baechler <matth...@apache.org> Committed: Mon May 28 17:40:31 2018 +0200 ---------------------------------------------------------------------- .../cassandra/mail/CassandraMailboxMapper.java | 21 +++++++++++++++++++- .../migration/MailboxPathV2MigrationTest.java | 7 ++++--- 2 files changed, 24 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/7b38d06c/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java index 6433022..00e570a 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java @@ -26,6 +26,7 @@ import java.util.Optional; import java.util.StringTokenizer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; +import java.util.concurrent.CompletionStage; import java.util.function.Function; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -108,12 +109,30 @@ public class CassandraMailboxMapper implements MailboxMapper { cassandraIdOptional .map(CassandraIdAndPath::getCassandraId) .map(this::retrieveMailbox) - .orElse(CompletableFuture.completedFuture(Optional.empty()))); + .orElse(CompletableFuture.completedFuture(Optional.empty()))) + .thenCompose(maybeMailbox -> maybeMailbox.map(this::migrate) + .orElse(CompletableFuture.completedFuture(maybeMailbox))); } catch (CompletionException e) { throw DriverExceptionHelper.handleStorageException(e); } } + private CompletableFuture<Optional<SimpleMailbox>> migrate(SimpleMailbox mailbox) { + CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); + return mailboxPathV2DAO.save(mailbox.generateAssociatedPath(), mailboxId) + .thenCompose(success -> deleteIfSuccess(mailbox, success)) + .thenApply(any -> Optional.of(mailbox)); + } + + private CompletionStage<Void> deleteIfSuccess(SimpleMailbox mailbox, boolean success) { + if (success) { + return mailboxPathDAO.delete(mailbox.generateAssociatedPath()); + } + LOGGER.info("Concurrent execution lead to data race while migrating {} to 'mailboxPathV2DAO'.", + mailbox.generateAssociatedPath()); + return CompletableFuture.completedFuture(null); + } + @Override public Mailbox findMailboxById(MailboxId id) throws MailboxException { CassandraId mailboxId = (CassandraId) id; http://git-wip-us.apache.org/repos/asf/james-project/blob/7b38d06c/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 index 249ec59..00867a5 100644 --- 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 @@ -108,15 +108,16 @@ public class MailboxPathV2MigrationTest { } @Test - public void readingOldValuesShouldNotMigrateThem() throws Exception { + public void readingOldValuesShouldMigrateThem() 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.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(); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org