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 <btell...@linagora.com> Authored: Wed Jul 5 08:54:52 2017 +0700 Committer: Antoine Duprat <adup...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org