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

Reply via email to