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 ad...@apache.org on 2017/07/10 17:54:51 UTC

[39/41] james-project git commit: JAMES-2083 Cassandra version manager should indicate schema state

JAMES-2083 Cassandra version manager should indicate schema state


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

Branch: refs/heads/master
Commit: e5e54b762d02a0220375f2eea53e05507a12542a
Parents: 2474f1b
Author: benwa <bt...@linagora.com>
Authored: Wed Jul 5 08:54:52 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Mon Jul 10 14:24:00 2017 +0200

----------------------------------------------------------------------
 .../versions/CassandraSchemaVersionManager.java | 52 ++++++++-------
 .../CassandraSchemaVersionManagerTest.java      | 70 ++++++--------------
 .../modules/mailbox/CassandraSessionModule.java | 24 ++++++-
 3 files changed, 72 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e5e54b76/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 84b25e5..2a9266e 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
@@ -19,13 +19,18 @@
 
 package org.apache.james.backends.cassandra.versions;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.TOO_OLD;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.TOO_RECENT;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.UPGRADABLE;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.UP_TO_DATE;
+
+import javax.inject.Inject;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.inject.Inject;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 
 public class CassandraSchemaVersionManager {
     public static final int MIN_VERSION = 1;
@@ -36,7 +41,14 @@ public class CassandraSchemaVersionManager {
 
     private final int minVersion;
     private final int maxVersion;
-    private final int version;
+    private final CassandraSchemaVersionDAO schemaVersionDAO;
+
+    public enum SchemaState {
+        UP_TO_DATE,
+        TOO_RECENT,
+        TOO_OLD,
+        UPGRADABLE
+    }
 
     @Inject
     public CassandraSchemaVersionManager(CassandraSchemaVersionDAO schemaVersionDAO) {
@@ -50,9 +62,13 @@ public class CassandraSchemaVersionManager {
         Preconditions.checkArgument(maxVersion >= minVersion,
             "maxVersion should not be inferior to minVersion");
 
+        this.schemaVersionDAO = schemaVersionDAO;
         this.minVersion = minVersion;
         this.maxVersion = maxVersion;
-        this.version = schemaVersionDAO
+    }
+
+    public int computeVersion() {
+        return schemaVersionDAO
             .getCurrentSchemaVersion()
             .join()
             .orElseGet(() -> {
@@ -62,10 +78,6 @@ public class CassandraSchemaVersionManager {
             });
     }
 
-    public int getVersion() {
-        return version;
-    }
-
     public int getMinimumSupportedVersion() {
         return minVersion;
     }
@@ -74,24 +86,16 @@ public class CassandraSchemaVersionManager {
         return maxVersion;
     }
 
-    public void ensureSchemaIsSupported() {
+    public SchemaState computeSchemaState() {
+        int version = computeVersion();
         if (version < minVersion) {
-
-            throw new IllegalStateException(
-                String.format("Current schema version is %d whereas minimum required version is %d. " +
-                    "Recommended version is %d", version, minVersion, maxVersion));
+            return TOO_OLD;
         } else if (version < maxVersion) {
-
-            LOGGER.warn("Current schema version is %d. Recommended version is %d", version, maxVersion);
-        } else if (version == maxVersion){
-
-            LOGGER.info("Schema version is up-to-date");
+            return UPGRADABLE;
+        } else if (version == maxVersion) {
+            return UP_TO_DATE;
         } else {
-
-            throw new IllegalStateException(
-                String.format("Current schema version is %d whereas the minimum supported version is %d. " +
-                    "Recommended version is %d.", version, minVersion, maxVersion));
+            return TOO_RECENT;
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e5e54b76/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManagerTest.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManagerTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManagerTest.java
index d6576dc..708c492 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManagerTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManagerTest.java
@@ -19,30 +19,28 @@
 
 package org.apache.james.backends.cassandra.versions;
 
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.UP_TO_DATE;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.UPGRADABLE;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.TOO_OLD;
+import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState.TOO_RECENT;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
-import static uk.org.lidalia.slf4jtest.LoggingEvent.info;
-import static uk.org.lidalia.slf4jtest.LoggingEvent.warn;
 
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
-import org.junit.After;
+import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
-import uk.org.lidalia.slf4jtest.TestLogger;
-import uk.org.lidalia.slf4jtest.TestLoggerFactory;
-
 public class CassandraSchemaVersionManagerTest {
 
     private final int minVersion = 2;
     private final int maxVersion = 4;
     private CassandraSchemaVersionDAO schemaVersionDAO;
-    private TestLogger logger = TestLoggerFactory.getTestLogger(CassandraSchemaVersionManager.class);
 
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
@@ -52,15 +50,8 @@ public class CassandraSchemaVersionManagerTest {
         schemaVersionDAO = mock(CassandraSchemaVersionDAO.class);
     }
 
-    @After
-    public void tearDown() {
-        TestLoggerFactory.clear();
-    }
-
     @Test
-    public void ensureSchemaIsSupportedShouldThrowIfSchemaVersionIsTooOld() {
-        expectedException.expect(IllegalStateException.class);
-
+    public void computeSchemaStateShouldReturnTooOldWhenVersionIsLessThanMinVersion() {
         int currentVersion = minVersion - 1;
 
         when(schemaVersionDAO.getCurrentSchemaVersion())
@@ -71,13 +62,11 @@ public class CassandraSchemaVersionManagerTest {
             minVersion,
             maxVersion);
 
-        testee.ensureSchemaIsSupported();
+        assertThat(testee.computeSchemaState()).isEqualTo(TOO_OLD);
     }
 
     @Test
-    public void ensureSchemaIsSupportedShouldThrowIfSchemaVersionIsTooRecent() {
-        expectedException.expect(IllegalStateException.class);
-
+    public void computeSchemaStateShouldReturnTooOldWhenVersionIsMoreThanMaxVersion() {
         int currentVersion = maxVersion + 1;
 
         when(schemaVersionDAO.getCurrentSchemaVersion())
@@ -88,11 +77,11 @@ public class CassandraSchemaVersionManagerTest {
             minVersion,
             maxVersion);
 
-        testee.ensureSchemaIsSupported();
+        assertThat(testee.computeSchemaState()).isEqualTo(TOO_RECENT);
     }
 
     @Test
-    public void ensureSchemaIsSupportedShouldLogOkIfSchemaIsUpToDate() {
+    public void computeSchemaStateShouldReturnUpToDateWhenVersionEqualsMaxVersion() {
         int currentVersion = maxVersion;
 
         when(schemaVersionDAO.getCurrentSchemaVersion())
@@ -103,13 +92,11 @@ public class CassandraSchemaVersionManagerTest {
             minVersion,
             maxVersion);
 
-        testee.ensureSchemaIsSupported();
-
-        assertThat(logger.getLoggingEvents()).containsExactly(info("Schema version is up-to-date"));
+        assertThat(testee.computeSchemaState()).isEqualTo(UP_TO_DATE);
     }
 
     @Test
-    public void ensureSchemaIsSupportedShouldLogAsWarningIfSchemaIsSupportedButNotUpToDate() {
+    public void computeSchemaStateShouldReturnUpgradableWhenVersionBetweenMinAnd() {
         int currentVersion = maxVersion - 1;
 
         when(schemaVersionDAO.getCurrentSchemaVersion())
@@ -120,12 +107,7 @@ public class CassandraSchemaVersionManagerTest {
             minVersion,
             maxVersion);
 
-        testee.ensureSchemaIsSupported();
-
-        assertThat(logger.getLoggingEvents())
-            .containsExactly(warn("Current schema version is %d. Recommended version is %d",
-                currentVersion,
-                maxVersion));
+        assertThat(testee.computeSchemaState()).isEqualTo(UPGRADABLE);
     }
 
     @Test
@@ -181,7 +163,7 @@ public class CassandraSchemaVersionManagerTest {
     }
 
     @Test
-    public void ensureSchemaIsSupportedShouldActAsUpToDateWhenMinMaxAndCurrentVersionsAreTheSame() {
+    public void computeSchemaStateShouldReturnUpToDateWhenMinMaxAndVersionEquals() {
         int minVersion = 4;
         int maxVersion = 4;
         int currentVersion = 4;
@@ -193,29 +175,19 @@ public class CassandraSchemaVersionManagerTest {
             minVersion,
             maxVersion);
 
-        testee.ensureSchemaIsSupported();
-
-        assertThat(logger.getLoggingEvents()).containsExactly(info("Schema version is up-to-date"));
+        assertThat(testee.computeSchemaState()).isEqualTo(UP_TO_DATE);
     }
 
     @Test
-    public void ensureSchemaIsSupportedShouldNotThrowOnNewCassandra() {
+    public void defaultComputedSchemaShouldNotBeTooOldNeitherTooRecent() {
         when(schemaVersionDAO.getCurrentSchemaVersion())
             .thenReturn(CompletableFuture.completedFuture(Optional.of(CassandraSchemaVersionManager.DEFAULT_VERSION)));
 
-        new CassandraSchemaVersionManager(schemaVersionDAO).ensureSchemaIsSupported();
-    }
-
-    @Test
-    public void ensureSchemaIsSupportedShouldNotThrowButLogWhenNoVersionNumberFoundOnCassandra() {
-        when(schemaVersionDAO.getCurrentSchemaVersion())
-            .thenReturn(CompletableFuture.completedFuture(Optional.empty()));
-
-        new CassandraSchemaVersionManager(schemaVersionDAO).ensureSchemaIsSupported();
+        SchemaState schemaState = new CassandraSchemaVersionManager(schemaVersionDAO).computeSchemaState();
 
-        assertThat(logger.getAllLoggingEvents())
-            .contains(warn("No schema version information found on Cassandra, we assume schema is at version {}",
-                CassandraSchemaVersionManager.DEFAULT_VERSION));
+        assertThat(schemaState)
+            .isNotEqualTo(TOO_RECENT)
+            .isNotEqualTo(TOO_OLD);
     }
 
     @Test
@@ -235,6 +207,6 @@ public class CassandraSchemaVersionManagerTest {
 
         CassandraSchemaVersionManager testee = new CassandraSchemaVersionManager(schemaVersionDAO);
 
-        assertThat(testee.getMinimumSupportedVersion()).isEqualTo(CassandraSchemaVersionManager.MAX_VERSION);
+        assertThat(testee.getMaximumSupportedVersion()).isEqualTo(CassandraSchemaVersionManager.MAX_VERSION);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/e5e54b76/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
index 8459560..12dc844 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
@@ -41,6 +41,7 @@ import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFact
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
+import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.SchemaState;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.mailbox.store.BatchSizes;
@@ -326,7 +327,28 @@ public class CassandraSessionModule extends AbstractModule {
 
         @Override
         public void initModule() {
-            versionManager.ensureSchemaIsSupported();
+            SchemaState schemaState = versionManager.computeSchemaState();
+            switch (schemaState) {
+                case TOO_OLD:
+                    throw new IllegalStateException(
+                        String.format("Current schema version is %d whereas minimum required version is %d. " +
+                            "Recommended version is %d", versionManager.computeVersion(), versionManager.getMinimumSupportedVersion(),
+                            versionManager.getMaximumSupportedVersion()));
+                case TOO_RECENT:
+                    throw new IllegalStateException(
+                        String.format("Current schema version is %d whereas the minimum supported version is %d. " +
+                            "Recommended version is %d.", versionManager.computeVersion(), versionManager.getMinimumSupportedVersion(),
+                            versionManager.getMaximumSupportedVersion()));
+                case UP_TO_DATE:
+                    LOGGER.info("Schema version is up-to-date");
+                    return;
+                case UPGRADABLE:
+                    LOGGER.warn("Current schema version is {}. Recommended version is {}", versionManager.computeVersion(),
+                        versionManager.getMaximumSupportedVersion());
+                    return;
+                default:
+                    throw new IllegalStateException("Unknown schema state " + schemaState);
+            }
         }
 
         @Override


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