This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit dcc7583119a4025ebc7b8d3ce3ddfaf7216562bc Author: Benoit Tellier <[email protected]> AuthorDate: Tue Mar 31 14:59:03 2020 +0700 JAMES-2648 Add a CassandraVersionManager::isBefore with initial state caching --- .../versions/CassandraSchemaVersionManager.java | 9 ++++ .../CassandraSchemaVersionManagerTest.java | 48 ++++++++++++++++++++++ .../cassandra/CassandraRecipientRewriteTable.java | 15 +------ 3 files changed, 58 insertions(+), 14 deletions(-) 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 37a222d..ef56bdb 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 @@ -41,6 +41,7 @@ public class CassandraSchemaVersionManager { private final SchemaVersion minVersion; private final SchemaVersion maxVersion; + private final SchemaVersion initialSchemaVersion; private final CassandraSchemaVersionDAO schemaVersionDAO; public enum SchemaState { @@ -63,6 +64,14 @@ public class CassandraSchemaVersionManager { this.schemaVersionDAO = schemaVersionDAO; this.minVersion = minVersion; this.maxVersion = maxVersion; + + this.initialSchemaVersion = computeVersion(); + } + + public boolean isBefore(SchemaVersion minimum) { + return initialSchemaVersion.isBefore(minimum) + // If we started with a legacy james then maybe schema version had been updated since then + && computeVersion().isBefore(minimum); } public SchemaVersion computeVersion() { 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 852fcce..64c498e 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 @@ -63,6 +63,54 @@ class CassandraSchemaVersionManagerTest { } @Test + void isBeforeShouldReturnTrueWhenBefore() { + SchemaVersion currentVersion = minVersion; + + when(schemaVersionDAO.getCurrentSchemaVersion()) + .thenReturn(Mono.just(Optional.of(currentVersion))); + + CassandraSchemaVersionManager testee = new CassandraSchemaVersionManager( + schemaVersionDAO, + minVersion, + maxVersion); + + assertThat(testee.isBefore(maxVersion)).isTrue(); + } + + @Test + void isBeforeShouldReturnFalseWhenEquals() { + SchemaVersion currentVersion = maxVersion; + + when(schemaVersionDAO.getCurrentSchemaVersion()) + .thenReturn(Mono.just(Optional.of(currentVersion))); + + CassandraSchemaVersionManager testee = new CassandraSchemaVersionManager( + schemaVersionDAO, + minVersion, + maxVersion); + + assertThat(testee.isBefore(maxVersion)).isFalse(); + } + + @Test + void isBeforeShouldReturnFalseWhenUpdatedToEquals() { + SchemaVersion currentVersion = maxVersion; + + when(schemaVersionDAO.getCurrentSchemaVersion()) + .thenReturn(Mono.just(Optional.of(minVersion))); + + CassandraSchemaVersionManager testee = new CassandraSchemaVersionManager( + schemaVersionDAO, + minVersion, + maxVersion); + + when(schemaVersionDAO.getCurrentSchemaVersion()) + .thenReturn(Mono.just(Optional.of(maxVersion))); + + assertThat(testee.isBefore(maxVersion)).isFalse(); + } + + @Test void computeSchemaStateShouldReturnTooOldWhenVersionIsMoreThanMaxVersion() { SchemaVersion currentVersion = maxVersion.next(); diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java index 0eac424..6dc233b 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java @@ -43,7 +43,6 @@ public class CassandraRecipientRewriteTable extends AbstractRecipientRewriteTabl private final CassandraRecipientRewriteTableDAO cassandraRecipientRewriteTableDAO; private final CassandraMappingsSourcesDAO cassandraMappingsSourcesDAO; private final CassandraSchemaVersionManager versionManager; - private final SchemaVersion initialSchemaVersion; @Inject CassandraRecipientRewriteTable(CassandraRecipientRewriteTableDAO cassandraRecipientRewriteTableDAO, @@ -52,8 +51,6 @@ public class CassandraRecipientRewriteTable extends AbstractRecipientRewriteTabl this.cassandraRecipientRewriteTableDAO = cassandraRecipientRewriteTableDAO; this.cassandraMappingsSourcesDAO = cassandraMappingsSourcesDAO; this.versionManager = versionManager; - - initialSchemaVersion = versionManager.computeVersion(); } @Override @@ -100,20 +97,10 @@ public class CassandraRecipientRewriteTable extends AbstractRecipientRewriteTabl Preconditions.checkArgument(listSourcesSupportedType.contains(mapping.getType()), "Not supported mapping of type %s", mapping.getType()); - if (isLegacy()) { + if (versionManager.isBefore(MAPPINGS_SOURCES_SUPPORTED_VERSION)) { return super.listSources(mapping); } return cassandraMappingsSourcesDAO.retrieveSources(mapping).toStream(); } - - private boolean isLegacy() { - return isLegacy(initialSchemaVersion) - // If we started with a legacy james then maybe schema version had been updated since then - && isLegacy(versionManager.computeVersion()); - } - - private boolean isLegacy(SchemaVersion schemaVersion) { - return schemaVersion.isBefore(MAPPINGS_SOURCES_SUPPORTED_VERSION); - } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
