diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModule.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModule.java index 14a581e505276..91dc9aa137779 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModule.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModule.java @@ -99,6 +99,7 @@ import org.neo4j.logging.LogProvider; import org.neo4j.ssl.SslPolicy; import org.neo4j.udc.UsageData; +import org.neo4j.unsafe.impl.internal.dragons.FeatureToggles; /** * This implementation of {@link org.neo4j.kernel.impl.factory.EditionModule} creates the implementations of services @@ -106,6 +107,8 @@ */ public class EnterpriseCoreEditionModule extends EditionModule { + static boolean idReuse = FeatureToggles.flag( EnterpriseCoreEditionModule.class, "idReuse", false ); + private final ConsensusModule consensusModule; private final CoreTopologyService topologyService; private final LogProvider logProvider; @@ -224,11 +227,12 @@ public void registerEditionSpecificProcedures( Procedures procedures ) throws Ke coreStateMachinesModule = new CoreStateMachinesModule( identityModule.myself(), platformModule, clusterStateDirectory.get(), config, replicationModule.getReplicator(), consensusModule.raftMachine(), dependencies, localDatabase ); + this.idTypeConfigurationProvider = coreStateMachinesModule.idTypeConfigurationProvider; + createIdComponents( platformModule, dependencies, coreStateMachinesModule.idGeneratorFactory ); dependencies.satisfyDependency( idGeneratorFactory ); dependencies.satisfyDependency( idController ); - this.idTypeConfigurationProvider = coreStateMachinesModule.idTypeConfigurationProvider; this.labelTokenHolder = coreStateMachinesModule.labelTokenHolder; this.propertyKeyTokenHolder = coreStateMachinesModule.propertyKeyTokenHolder; this.relationshipTypeTokenHolder = coreStateMachinesModule.relationshipTypeTokenHolder; @@ -252,9 +256,17 @@ public void registerEditionSpecificProcedures( Procedures procedures ) throws Ke protected void createIdComponents( PlatformModule platformModule, Dependencies dependencies, IdGeneratorFactory editionIdGeneratorFactory ) { - super.createIdComponents( platformModule, dependencies, editionIdGeneratorFactory ); - this.idGeneratorFactory = - new FreeIdFilteredIdGeneratorFactory( this.idGeneratorFactory, coreStateMachinesModule.freeIdCondition ); + if ( idReuse ) + { + super.createIdComponents( platformModule, dependencies, editionIdGeneratorFactory ); + this.idGeneratorFactory = new FreeIdFilteredIdGeneratorFactory( this.idGeneratorFactory, + coreStateMachinesModule.freeIdCondition ); + } + else + { + idController = createDefaultIdController(); + this.idGeneratorFactory = new FreeIdFilteredIdGeneratorFactory( editionIdGeneratorFactory, () -> false ); + } } static Predicate fileWatcherFileNameFilter() diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/scenarios/ClusterIdReuseIT.java b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/ClusterIdReuseIT.java similarity index 97% rename from enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/scenarios/ClusterIdReuseIT.java rename to enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/ClusterIdReuseIT.java index 08dd9eab8ef05..dc74710f8bdac 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/scenarios/ClusterIdReuseIT.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/ClusterIdReuseIT.java @@ -17,10 +17,11 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package org.neo4j.causalclustering.scenarios; +package org.neo4j.causalclustering.core; import org.apache.commons.lang3.mutable.MutableLong; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -51,9 +52,16 @@ public class ClusterIdReuseIT @Before public void setUp() throws Exception { + EnterpriseCoreEditionModule.idReuse = true; cluster = clusterRule.startCluster(); } + @After + public void tearDown() + { + EnterpriseCoreEditionModule.idReuse = false; + } + @Test public void shouldReuseIdsInCluster() throws Exception { diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModuleIntegrationTest.java b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModuleIntegrationTest.java index 41aaaa1d85601..55bb66c94dfb6 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModuleIntegrationTest.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/EnterpriseCoreEditionModuleIntegrationTest.java @@ -19,6 +19,7 @@ */ package org.neo4j.causalclustering.core; +import org.junit.After; import org.junit.Rule; import org.junit.Test; @@ -31,15 +32,19 @@ import org.neo4j.graphdb.DependencyResolver; import org.neo4j.kernel.impl.index.IndexConfigStore; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.BufferedIdController; +import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.DefaultIdController; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.IdController; import org.neo4j.kernel.impl.store.MetaDataStore; +import org.neo4j.kernel.impl.store.id.IdGenerator; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; +import org.neo4j.kernel.impl.store.id.IdType; import org.neo4j.kernel.impl.storemigration.StoreFile; import org.neo4j.kernel.impl.storemigration.StoreFileType; import org.neo4j.kernel.impl.transaction.log.PhysicalLogFile; import org.neo4j.test.causalclustering.ClusterRule; import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -49,10 +54,40 @@ public class EnterpriseCoreEditionModuleIntegrationTest @Rule public ClusterRule clusterRule = new ClusterRule( getClass() ); + private Cluster cluster; + + @After + public void tearDown() + { + EnterpriseCoreEditionModule.idReuse = false; + } + + @Test + public void createNonBufferedIdComponentsByDefaultWithoutIdReuseCapability() throws Exception + { + cluster = clusterRule.startCluster(); + CoreClusterMember leader = cluster.awaitLeader(); + DependencyResolver dependencyResolver = leader.database().getDependencyResolver(); + + IdController idController = dependencyResolver.resolveDependency( IdController.class ); + IdGeneratorFactory idGeneratorFactory = dependencyResolver.resolveDependency( IdGeneratorFactory.class ); + + assertThat( idController, instanceOf( DefaultIdController.class ) ); + assertThat( idGeneratorFactory, instanceOf( FreeIdFilteredIdGeneratorFactory.class ) ); + + IdGenerator idGenerator = idGeneratorFactory.get( IdType.NODE ); + idGenerator.freeId( 1 ); + idGenerator.freeId( 2 ); + idGenerator.freeId( 3 ); + + assertEquals( 0, idGenerator.getDefragCount() ); + } + @Test - public void createBufferedIdComponentsByDefault() throws Exception + public void createBufferedIdComponentsWhenConfigured() throws Exception { - Cluster cluster = clusterRule.startCluster(); + EnterpriseCoreEditionModule.idReuse = true; + cluster = clusterRule.startCluster(); CoreClusterMember leader = cluster.awaitLeader(); DependencyResolver dependencyResolver = leader.database().getDependencyResolver();