Skip to content

Commit

Permalink
Disable id reuse by default, allow turn it on by idReuse feature flag
Browse files Browse the repository at this point in the history
in EnterpriseCoreEditionModule.
  • Loading branch information
MishaDemianenko committed Jun 29, 2017
1 parent 2000f70 commit 128ad1c
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 7 deletions.
Expand Up @@ -99,13 +99,16 @@
import org.neo4j.logging.LogProvider; import org.neo4j.logging.LogProvider;
import org.neo4j.ssl.SslPolicy; import org.neo4j.ssl.SslPolicy;
import org.neo4j.udc.UsageData; 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 * This implementation of {@link org.neo4j.kernel.impl.factory.EditionModule} creates the implementations of services
* that are specific to the Enterprise Core edition that provides a core cluster. * that are specific to the Enterprise Core edition that provides a core cluster.
*/ */
public class EnterpriseCoreEditionModule extends EditionModule public class EnterpriseCoreEditionModule extends EditionModule
{ {
static boolean idReuse = FeatureToggles.flag( EnterpriseCoreEditionModule.class, "idReuse", false );

private final ConsensusModule consensusModule; private final ConsensusModule consensusModule;
private final CoreTopologyService topologyService; private final CoreTopologyService topologyService;
private final LogProvider logProvider; private final LogProvider logProvider;
Expand Down Expand Up @@ -224,11 +227,12 @@ public void registerEditionSpecificProcedures( Procedures procedures ) throws Ke
coreStateMachinesModule = new CoreStateMachinesModule( identityModule.myself(), platformModule, clusterStateDirectory.get(), coreStateMachinesModule = new CoreStateMachinesModule( identityModule.myself(), platformModule, clusterStateDirectory.get(),
config, replicationModule.getReplicator(), consensusModule.raftMachine(), dependencies, localDatabase ); config, replicationModule.getReplicator(), consensusModule.raftMachine(), dependencies, localDatabase );


this.idTypeConfigurationProvider = coreStateMachinesModule.idTypeConfigurationProvider;

createIdComponents( platformModule, dependencies, coreStateMachinesModule.idGeneratorFactory ); createIdComponents( platformModule, dependencies, coreStateMachinesModule.idGeneratorFactory );
dependencies.satisfyDependency( idGeneratorFactory ); dependencies.satisfyDependency( idGeneratorFactory );
dependencies.satisfyDependency( idController ); dependencies.satisfyDependency( idController );


this.idTypeConfigurationProvider = coreStateMachinesModule.idTypeConfigurationProvider;
this.labelTokenHolder = coreStateMachinesModule.labelTokenHolder; this.labelTokenHolder = coreStateMachinesModule.labelTokenHolder;
this.propertyKeyTokenHolder = coreStateMachinesModule.propertyKeyTokenHolder; this.propertyKeyTokenHolder = coreStateMachinesModule.propertyKeyTokenHolder;
this.relationshipTypeTokenHolder = coreStateMachinesModule.relationshipTypeTokenHolder; this.relationshipTypeTokenHolder = coreStateMachinesModule.relationshipTypeTokenHolder;
Expand All @@ -252,9 +256,17 @@ public void registerEditionSpecificProcedures( Procedures procedures ) throws Ke
protected void createIdComponents( PlatformModule platformModule, Dependencies dependencies, protected void createIdComponents( PlatformModule platformModule, Dependencies dependencies,
IdGeneratorFactory editionIdGeneratorFactory ) IdGeneratorFactory editionIdGeneratorFactory )
{ {
super.createIdComponents( platformModule, dependencies, editionIdGeneratorFactory ); if ( idReuse )
this.idGeneratorFactory = {
new FreeIdFilteredIdGeneratorFactory( this.idGeneratorFactory, coreStateMachinesModule.freeIdCondition ); super.createIdComponents( platformModule, dependencies, editionIdGeneratorFactory );
this.idGeneratorFactory = new FreeIdFilteredIdGeneratorFactory( this.idGeneratorFactory,
coreStateMachinesModule.freeIdCondition );
}
else
{
idController = createDefaultIdController();
this.idGeneratorFactory = new FreeIdFilteredIdGeneratorFactory( editionIdGeneratorFactory, () -> false );
}
} }


static Predicate<String> fileWatcherFileNameFilter() static Predicate<String> fileWatcherFileNameFilter()
Expand Down
Expand Up @@ -17,10 +17,11 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.neo4j.causalclustering.scenarios; package org.neo4j.causalclustering.core;




import org.apache.commons.lang3.mutable.MutableLong; import org.apache.commons.lang3.mutable.MutableLong;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
Expand Down Expand Up @@ -51,9 +52,16 @@ public class ClusterIdReuseIT
@Before @Before
public void setUp() throws Exception public void setUp() throws Exception
{ {
EnterpriseCoreEditionModule.idReuse = true;
cluster = clusterRule.startCluster(); cluster = clusterRule.startCluster();
} }


@After
public void tearDown()
{
EnterpriseCoreEditionModule.idReuse = false;
}

@Test @Test
public void shouldReuseIdsInCluster() throws Exception public void shouldReuseIdsInCluster() throws Exception
{ {
Expand Down
Expand Up @@ -19,6 +19,7 @@
*/ */
package org.neo4j.causalclustering.core; package org.neo4j.causalclustering.core;


import org.junit.After;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;


Expand All @@ -31,15 +32,19 @@
import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.kernel.impl.index.IndexConfigStore; 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.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.storageengine.impl.recordstorage.id.IdController;
import org.neo4j.kernel.impl.store.MetaDataStore; 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.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.storemigration.StoreFile; import org.neo4j.kernel.impl.storemigration.StoreFile;
import org.neo4j.kernel.impl.storemigration.StoreFileType; import org.neo4j.kernel.impl.storemigration.StoreFileType;
import org.neo4j.kernel.impl.transaction.log.PhysicalLogFile; import org.neo4j.kernel.impl.transaction.log.PhysicalLogFile;
import org.neo4j.test.causalclustering.ClusterRule; import org.neo4j.test.causalclustering.ClusterRule;


import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
Expand All @@ -49,10 +54,40 @@ public class EnterpriseCoreEditionModuleIntegrationTest
@Rule @Rule
public ClusterRule clusterRule = new ClusterRule( getClass() ); 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 @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(); CoreClusterMember leader = cluster.awaitLeader();
DependencyResolver dependencyResolver = leader.database().getDependencyResolver(); DependencyResolver dependencyResolver = leader.database().getDependencyResolver();


Expand Down

0 comments on commit 128ad1c

Please sign in to comment.