Skip to content

Commit

Permalink
Simplified CommitProcessFactory
Browse files Browse the repository at this point in the history
 * removed unused parameters from CommitProcessFactory#create()
 * extracted HA implementation of CommitProcessFactory to a top
   level class HighlyAvailableCommitProcessFactory and added test
 * extracted community implementation of CommitProcessFactory
   to a top level class CommunityCommitProcessFactory and added test

Co-authored-by: @MishaDemianenko
  • Loading branch information
lutovich committed Oct 28, 2015
1 parent b20f498 commit b1aba21
Show file tree
Hide file tree
Showing 9 changed files with 302 additions and 113 deletions.
Expand Up @@ -1042,10 +1042,9 @@ private KernelModule buildKernel( IntegrityValidator integrityValidator, Transac
UpdateableSchemaState updateableSchemaState, LabelScanStore labelScanStore,
SchemaIndexProviderMap schemaIndexProviderMap, ProcedureCache procedureCache )
{
final TransactionCommitProcess transactionCommitProcess =
commitProcessFactory.create( appender, kernelHealth, neoStores, storeApplier,
new NeoStoreInjectedTransactionValidator( integrityValidator ), indexUpdatesValidator,
config );
NeoStoreInjectedTransactionValidator validator = new NeoStoreInjectedTransactionValidator( integrityValidator );
TransactionCommitProcess transactionCommitProcess = commitProcessFactory.create( appender, storeApplier,
validator, indexUpdatesValidator, config );

/*
* This is used by legacy indexes and constraint indexes whenever a transaction is to be spawned
Expand Down
Expand Up @@ -19,17 +19,14 @@
*/
package org.neo4j.kernel.impl.api;

import org.neo4j.kernel.KernelHealth;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.index.IndexUpdatesValidator;
import org.neo4j.kernel.impl.store.NeoStores;
import org.neo4j.kernel.impl.transaction.log.TransactionAppender;
import org.neo4j.kernel.impl.transaction.state.NeoStoreInjectedTransactionValidator;

public interface CommitProcessFactory
{
TransactionCommitProcess create( TransactionAppender appender, KernelHealth kernelHealth,
NeoStores neoStores, TransactionRepresentationStoreApplier storeApplier,
NeoStoreInjectedTransactionValidator txValidator,
IndexUpdatesValidator indexUpdatesValidator, Config config );
TransactionCommitProcess create( TransactionAppender appender, TransactionRepresentationStoreApplier storeApplier,
NeoStoreInjectedTransactionValidator txValidator, IndexUpdatesValidator indexUpdatesValidator,
Config config );
}
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2002-2015 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.factory;

import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.CommitProcessFactory;
import org.neo4j.kernel.impl.api.ReadOnlyTransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationStoreApplier;
import org.neo4j.kernel.impl.api.index.IndexUpdatesValidator;
import org.neo4j.kernel.impl.transaction.log.TransactionAppender;
import org.neo4j.kernel.impl.transaction.state.NeoStoreInjectedTransactionValidator;

public class CommunityCommitProcessFactory implements CommitProcessFactory
{
@Override
public TransactionCommitProcess create( TransactionAppender appender,
TransactionRepresentationStoreApplier storeApplier, NeoStoreInjectedTransactionValidator txValidator,
IndexUpdatesValidator indexUpdatesValidator, Config config )
{
if ( config.get( GraphDatabaseSettings.read_only ) )
{
return new ReadOnlyTransactionCommitProcess();
}
return new TransactionRepresentationCommitProcess( appender, storeApplier, indexUpdatesValidator );
}
}
Expand Up @@ -31,18 +31,11 @@
import org.neo4j.kernel.GraphDatabaseAPI;
import org.neo4j.kernel.IdGeneratorFactory;
import org.neo4j.kernel.KernelData;
import org.neo4j.kernel.KernelHealth;
import org.neo4j.kernel.NeoStoreDataSource;
import org.neo4j.kernel.Version;
import org.neo4j.kernel.api.exceptions.InvalidTransactionTypeKernelException;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.CommitProcessFactory;
import org.neo4j.kernel.impl.api.ReadOnlyTransactionCommitProcess;
import org.neo4j.kernel.impl.api.SchemaWriteGuard;
import org.neo4j.kernel.impl.api.TransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationStoreApplier;
import org.neo4j.kernel.impl.api.index.IndexUpdatesValidator;
import org.neo4j.kernel.impl.api.index.RemoveOrphanConstraintIndexesOnStartup;
import org.neo4j.kernel.impl.constraints.ConstraintSemantics;
import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics;
Expand All @@ -58,12 +51,9 @@
import org.neo4j.kernel.impl.locking.ResourceTypes;
import org.neo4j.kernel.impl.locking.community.CommunityLockManger;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.store.NeoStores;
import org.neo4j.kernel.impl.storemigration.ConfigMapUpgradeConfiguration;
import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory;
import org.neo4j.kernel.impl.transaction.log.TransactionAppender;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager;
import org.neo4j.kernel.impl.transaction.state.NeoStoreInjectedTransactionValidator;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.kernel.lifecycle.LifecycleListener;
Expand Down Expand Up @@ -105,7 +95,7 @@ public CommunityEditionModule( PlatformModule platformModule )
dependencies.satisfyDependency(
createKernelData( fileSystem, pageCache, storeDir, config, graphDatabaseFacade, life ) );

commitProcessFactory = createCommitProcessFactory();
commitProcessFactory = new CommunityCommitProcessFactory();

headerInformationFactory = createHeaderInformationFactory();

Expand Down Expand Up @@ -159,30 +149,6 @@ private UsageDataKeys.Edition determineEdition()

}

public static CommitProcessFactory createCommitProcessFactory()
{
return new CommitProcessFactory()
{
@Override
public TransactionCommitProcess create( TransactionAppender appender,
KernelHealth kernelHealth, NeoStores neoStores,
TransactionRepresentationStoreApplier storeApplier,
NeoStoreInjectedTransactionValidator txValidator,
IndexUpdatesValidator indexUpdatesValidator,
Config config )
{
if ( config.get( GraphDatabaseSettings.read_only ) )
{
return new ReadOnlyTransactionCommitProcess();
}
else
{
return new TransactionRepresentationCommitProcess( appender, storeApplier, indexUpdatesValidator );
}
}
};
}

protected SchemaWriteGuard createSchemaWriteGuard()
{
return new SchemaWriteGuard()
Expand Down
@@ -0,0 +1,66 @@
/*
* Copyright (c) 2002-2015 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.factory;

import org.junit.Test;

import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.ReadOnlyTransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationStoreApplier;
import org.neo4j.kernel.impl.api.index.IndexUpdatesValidator;
import org.neo4j.kernel.impl.transaction.log.TransactionAppender;
import org.neo4j.kernel.impl.transaction.state.NeoStoreInjectedTransactionValidator;

import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.neo4j.helpers.collection.MapUtil.stringMap;

public class CommunityCommitProcessFactoryTest
{
@Test
public void createReadOnlyCommitProcess()
{
CommunityCommitProcessFactory factory = new CommunityCommitProcessFactory();

Config config = new Config( stringMap( GraphDatabaseSettings.read_only.name(), "true" ) );

TransactionCommitProcess commitProcess = factory.create( mock( TransactionAppender.class ),
mock( TransactionRepresentationStoreApplier.class ), mock( NeoStoreInjectedTransactionValidator.class ),
mock( IndexUpdatesValidator.class ), config );

assertThat( commitProcess, instanceOf( ReadOnlyTransactionCommitProcess.class ) );
}

@Test
public void createRegularCommitProcess()
{
CommunityCommitProcessFactory factory = new CommunityCommitProcessFactory();

TransactionCommitProcess commitProcess = factory.create( mock( TransactionAppender.class ),
mock( TransactionRepresentationStoreApplier.class ), mock( NeoStoreInjectedTransactionValidator.class ),
mock( IndexUpdatesValidator.class ), new Config() );

assertThat( commitProcess, instanceOf( TransactionRepresentationCommitProcess.class ) );
}
}
Expand Up @@ -45,7 +45,7 @@
import org.neo4j.kernel.impl.core.PropertyKeyTokenHolder;
import org.neo4j.kernel.impl.core.RelationshipTypeTokenHolder;
import org.neo4j.kernel.impl.core.StartupStatisticsProvider;
import org.neo4j.kernel.impl.factory.CommunityEditionModule;
import org.neo4j.kernel.impl.factory.CommunityCommitProcessFactory;
import org.neo4j.kernel.impl.locking.Locks;
import org.neo4j.kernel.impl.store.StoreFactory;
import org.neo4j.kernel.impl.storemigration.StoreUpgrader;
Expand Down Expand Up @@ -92,7 +92,7 @@ public NeoStoreDataSource getDataSource( File storeDir, FileSystemAbstraction fs
fs, mock( StoreUpgrader.class ), mock( TransactionMonitor.class ), kernelHealth,
mock( PhysicalLogFile.Monitor.class ), TransactionHeaderInformationFactory.DEFAULT,
new StartupStatisticsProvider(), mock( NodeManager.class ), null, null,
CommunityEditionModule.createCommitProcessFactory(), mock( PageCache.class ),
new CommunityCommitProcessFactory(), mock( PageCache.class ),
mock( ConstraintSemantics.class), new Monitors(), new Tracers( "null", NullLog.getInstance() ) );

return dataSource;
Expand Down
@@ -0,0 +1,81 @@
/*
* Copyright (c) 2002-2015 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* 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/>.
*/
package org.neo4j.kernel.ha.factory;

import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.ha.DelegateInvocationHandler;
import org.neo4j.kernel.ha.cluster.modeswitch.CommitProcessSwitcher;
import org.neo4j.kernel.ha.cluster.modeswitch.ComponentSwitcherContainer;
import org.neo4j.kernel.ha.com.RequestContextFactory;
import org.neo4j.kernel.ha.com.master.Master;
import org.neo4j.kernel.ha.transaction.TransactionPropagator;
import org.neo4j.kernel.impl.api.CommitProcessFactory;
import org.neo4j.kernel.impl.api.ReadOnlyTransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess;
import org.neo4j.kernel.impl.api.TransactionRepresentationStoreApplier;
import org.neo4j.kernel.impl.api.index.IndexUpdatesValidator;
import org.neo4j.kernel.impl.transaction.log.TransactionAppender;
import org.neo4j.kernel.impl.transaction.state.NeoStoreInjectedTransactionValidator;

import static java.lang.reflect.Proxy.newProxyInstance;

class HighlyAvailableCommitProcessFactory implements CommitProcessFactory
{
private final ComponentSwitcherContainer componentSwitcherContainer;
private final Master master;
private final TransactionPropagator transactionPropagator;
private final RequestContextFactory requestContextFactory;

private final DelegateInvocationHandler<TransactionCommitProcess> commitProcessDelegate =
new DelegateInvocationHandler<>( TransactionCommitProcess.class );

HighlyAvailableCommitProcessFactory( ComponentSwitcherContainer componentSwitcherContainer, Master master,
TransactionPropagator transactionPropagator, RequestContextFactory requestContextFactory )
{
this.componentSwitcherContainer = componentSwitcherContainer;
this.master = master;
this.transactionPropagator = transactionPropagator;
this.requestContextFactory = requestContextFactory;
}

@Override
public TransactionCommitProcess create( TransactionAppender appender,
TransactionRepresentationStoreApplier storeApplier, NeoStoreInjectedTransactionValidator txValidator,
IndexUpdatesValidator indexUpdatesValidator, Config config )
{
if ( config.get( GraphDatabaseSettings.read_only ) )
{
return new ReadOnlyTransactionCommitProcess();
}

TransactionCommitProcess commitProcess = new TransactionRepresentationCommitProcess( appender, storeApplier,
indexUpdatesValidator );

CommitProcessSwitcher commitProcessSwitcher = new CommitProcessSwitcher( transactionPropagator,
master, commitProcessDelegate, requestContextFactory, txValidator, commitProcess );

componentSwitcherContainer.add( commitProcessSwitcher );

return (TransactionCommitProcess) newProxyInstance( TransactionCommitProcess.class.getClassLoader(),
new Class[]{TransactionCommitProcess.class}, commitProcessDelegate );
}
}

0 comments on commit b1aba21

Please sign in to comment.