Skip to content

Commit

Permalink
Introduce database manager.
Browse files Browse the repository at this point in the history
Introduce abstraction lever that responsible for managing
databases, responsible for their lifecycle, creation and shutdown.
Should be used as a contact point for any internal API's that need to
perform a lookup of database.

Remove GraphDatabaseFacade from a global dependency resolver.
Now GraphDatabaseFacade is part of database dependencies since
database have independent facade.
Switch procedure dependency resolution to lookup GraphDatabaseAPI from
dependency resolver instead of using global platform reference.
Update kernelData to use DataSourceManager for now in most of the places.
Create query execution engine as part of database creation. Move engine
creation away from a listener to NeoStoreDataSource start.
Introduce single database database manager.
Move default db name constant.
  • Loading branch information
MishaDemianenko committed Jul 26, 2018
1 parent 2530efd commit 9251c0d
Show file tree
Hide file tree
Showing 98 changed files with 582 additions and 574 deletions.
14 changes: 7 additions & 7 deletions community/bolt/src/main/java/org/neo4j/bolt/BoltServer.java
Expand Up @@ -29,6 +29,8 @@
import org.neo4j.bolt.runtime.BoltConnectionFactory; import org.neo4j.bolt.runtime.BoltConnectionFactory;
import org.neo4j.bolt.runtime.BoltConnectionReadLimiter; import org.neo4j.bolt.runtime.BoltConnectionReadLimiter;
import org.neo4j.bolt.runtime.BoltSchedulerProvider; import org.neo4j.bolt.runtime.BoltSchedulerProvider;
import org.neo4j.bolt.runtime.BoltStateMachineFactory;
import org.neo4j.bolt.runtime.BoltStateMachineFactoryImpl;
import org.neo4j.bolt.runtime.CachedThreadPoolExecutorFactory; import org.neo4j.bolt.runtime.CachedThreadPoolExecutorFactory;
import org.neo4j.bolt.runtime.DefaultBoltConnectionFactory; import org.neo4j.bolt.runtime.DefaultBoltConnectionFactory;
import org.neo4j.bolt.runtime.ExecutorBoltSchedulerProvider; import org.neo4j.bolt.runtime.ExecutorBoltSchedulerProvider;
Expand All @@ -41,8 +43,7 @@
import org.neo4j.bolt.transport.NettyServer.ProtocolInitializer; import org.neo4j.bolt.transport.NettyServer.ProtocolInitializer;
import org.neo4j.bolt.transport.SocketTransport; import org.neo4j.bolt.transport.SocketTransport;
import org.neo4j.bolt.transport.TransportThrottleGroup; import org.neo4j.bolt.transport.TransportThrottleGroup;
import org.neo4j.bolt.runtime.BoltStateMachineFactory; import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.bolt.runtime.BoltStateMachineFactoryImpl;
import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.helpers.ListenSocketAddress; import org.neo4j.helpers.ListenSocketAddress;
Expand All @@ -56,7 +57,6 @@
import org.neo4j.kernel.configuration.ConnectorPortRegister; import org.neo4j.kernel.configuration.ConnectorPortRegister;
import org.neo4j.kernel.configuration.ssl.SslPolicyLoader; import org.neo4j.kernel.configuration.ssl.SslPolicyLoader;
import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.kernel.lifecycle.LifecycleAdapter;
import org.neo4j.kernel.monitoring.Monitors; import org.neo4j.kernel.monitoring.Monitors;
Expand All @@ -71,7 +71,7 @@
public class BoltServer extends LifecycleAdapter public class BoltServer extends LifecycleAdapter
{ {
// platform dependencies // platform dependencies
private final GraphDatabaseAPI db; private final DatabaseManager databaseManager;
private final FileSystemAbstraction fs; private final FileSystemAbstraction fs;
private final JobScheduler jobScheduler; private final JobScheduler jobScheduler;
private final AvailabilityGuard availabilityGuard; private final AvailabilityGuard availabilityGuard;
Expand All @@ -88,11 +88,11 @@ public class BoltServer extends LifecycleAdapter


private final LifeSupport life = new LifeSupport(); private final LifeSupport life = new LifeSupport();


public BoltServer( GraphDatabaseAPI db, FileSystemAbstraction fs, JobScheduler jobScheduler, AvailabilityGuard availabilityGuard, public BoltServer( DatabaseManager databaseManager, FileSystemAbstraction fs, JobScheduler jobScheduler, AvailabilityGuard availabilityGuard,
ConnectorPortRegister connectorPortRegister, NetworkConnectionTracker connectionTracker, UsageData usageData, Config config, ConnectorPortRegister connectorPortRegister, NetworkConnectionTracker connectionTracker, UsageData usageData, Config config,
Clock clock, Monitors monitors, LogService logService, DependencyResolver dependencyResolver ) Clock clock, Monitors monitors, LogService logService, DependencyResolver dependencyResolver )
{ {
this.db = db; this.databaseManager = databaseManager;
this.fs = fs; this.fs = fs;
this.jobScheduler = jobScheduler; this.jobScheduler = jobScheduler;
this.availabilityGuard = availabilityGuard; this.availabilityGuard = availabilityGuard;
Expand Down Expand Up @@ -235,6 +235,6 @@ private BoltProtocolFactory createBoltProtocolFactory( BoltConnectionFactory con


private BoltStateMachineFactory createBoltFactory( Authentication authentication, Clock clock ) private BoltStateMachineFactory createBoltFactory( Authentication authentication, Clock clock )
{ {
return new BoltStateMachineFactoryImpl( db, usageData, availabilityGuard, authentication, clock, config, logService ); return new BoltStateMachineFactoryImpl( databaseManager, usageData, availabilityGuard, authentication, clock, config, logService );
} }
} }
Expand Up @@ -32,27 +32,27 @@
import org.neo4j.bolt.v3.BoltProtocolV3; import org.neo4j.bolt.v3.BoltProtocolV3;
import org.neo4j.bolt.v3.BoltStateMachineV3; import org.neo4j.bolt.v3.BoltStateMachineV3;
import org.neo4j.bolt.v3.runtime.TransactionStateMachineV3SPI; import org.neo4j.bolt.v3.runtime.TransactionStateMachineV3SPI;
import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.AvailabilityGuard; import org.neo4j.kernel.AvailabilityGuard;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.udc.UsageData; import org.neo4j.udc.UsageData;


public class BoltStateMachineFactoryImpl implements BoltStateMachineFactory public class BoltStateMachineFactoryImpl implements BoltStateMachineFactory
{ {
private final GraphDatabaseAPI db; private final DatabaseManager databaseManager;
private final UsageData usageData; private final UsageData usageData;
private final AvailabilityGuard availabilityGuard; private final AvailabilityGuard availabilityGuard;
private final LogService logging; private final LogService logging;
private final Authentication authentication; private final Authentication authentication;
private final Config config; private final Config config;
private final Clock clock; private final Clock clock;


public BoltStateMachineFactoryImpl( GraphDatabaseAPI db, UsageData usageData, AvailabilityGuard availabilityGuard, public BoltStateMachineFactoryImpl( DatabaseManager databaseManager, UsageData usageData, AvailabilityGuard availabilityGuard,
Authentication authentication, Clock clock, Config config, LogService logging ) Authentication authentication, Clock clock, Config config, LogService logging )
{ {
this.db = db; this.databaseManager = databaseManager;
this.usageData = usageData; this.usageData = usageData;
this.availabilityGuard = availabilityGuard; this.availabilityGuard = availabilityGuard;
this.logging = logging; this.logging = logging;
Expand Down Expand Up @@ -80,21 +80,26 @@ else if ( protocolVersion == BoltProtocolV3.VERSION )


private BoltStateMachine newStateMachineV1( BoltChannel boltChannel ) private BoltStateMachine newStateMachineV1( BoltChannel boltChannel )
{ {
TransactionStateMachineSPI transactionSPI = new TransactionStateMachineV1SPI( db, availabilityGuard, getAwaitDuration(), clock ); TransactionStateMachineSPI transactionSPI =
new TransactionStateMachineV1SPI( databaseManager.getDatabaseFacade( DatabaseManager.DEFAULT_DATABASE_NAME ).get(), availabilityGuard,
getAwaitDuration(), clock );
BoltStateMachineSPI boltSPI = new BoltStateMachineV1SPI( boltChannel, usageData, logging, authentication, transactionSPI ); BoltStateMachineSPI boltSPI = new BoltStateMachineV1SPI( boltChannel, usageData, logging, authentication, transactionSPI );
return new BoltStateMachineV1( boltSPI, boltChannel, clock ); return new BoltStateMachineV1( boltSPI, boltChannel, clock );
} }


private BoltStateMachine newStateMachineV3( BoltChannel boltChannel ) private BoltStateMachine newStateMachineV3( BoltChannel boltChannel )
{ {
TransactionStateMachineSPI transactionSPI = new TransactionStateMachineV3SPI( db, availabilityGuard, getAwaitDuration(), clock ); TransactionStateMachineSPI transactionSPI =
new TransactionStateMachineV3SPI( databaseManager.getDatabaseFacade( DatabaseManager.DEFAULT_DATABASE_NAME ).get(), availabilityGuard,
getAwaitDuration(), clock );
BoltStateMachineSPI boltSPI = new BoltStateMachineV1SPI( boltChannel, usageData, logging, authentication, transactionSPI ); BoltStateMachineSPI boltSPI = new BoltStateMachineV1SPI( boltChannel, usageData, logging, authentication, transactionSPI );
return new BoltStateMachineV3( boltSPI, boltChannel, clock ); return new BoltStateMachineV3( boltSPI, boltChannel, clock );
} }


private Duration getAwaitDuration() private Duration getAwaitDuration()
{ {
long bookmarkReadyTimeout = config.get( GraphDatabaseSettings.bookmark_ready_timeout ).toMillis(); long bookmarkReadyTimeout = config.get( GraphDatabaseSettings.bookmark_ready_timeout ).toMillis();

return Duration.ofMillis( bookmarkReadyTimeout ); return Duration.ofMillis( bookmarkReadyTimeout );
} }
} }
Expand Up @@ -24,6 +24,7 @@
import org.junit.jupiter.params.provider.ValueSource; import org.junit.jupiter.params.provider.ValueSource;


import java.time.Clock; import java.time.Clock;
import java.util.Optional;


import org.neo4j.bolt.BoltChannel; import org.neo4j.bolt.BoltChannel;
import org.neo4j.bolt.runtime.BoltStateMachine; import org.neo4j.bolt.runtime.BoltStateMachine;
Expand All @@ -32,12 +33,13 @@
import org.neo4j.bolt.v1.BoltProtocolV1; import org.neo4j.bolt.v1.BoltProtocolV1;
import org.neo4j.bolt.v2.BoltProtocolV2; import org.neo4j.bolt.v2.BoltProtocolV2;
import org.neo4j.bolt.v3.BoltStateMachineV3; import org.neo4j.bolt.v3.BoltStateMachineV3;
import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.kernel.AvailabilityGuard; import org.neo4j.kernel.AvailabilityGuard;
import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.GraphDatabaseQueryService;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacade;
import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.logging.NullLogService;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.logging.NullLog; import org.neo4j.logging.NullLog;
import org.neo4j.test.OnDemandJobScheduler; import org.neo4j.test.OnDemandJobScheduler;
import org.neo4j.udc.UsageData; import org.neo4j.udc.UsageData;
Expand All @@ -57,7 +59,7 @@ class BoltStateMachineFactoryImplTest


@ParameterizedTest( name = "V{0}" ) @ParameterizedTest( name = "V{0}" )
@ValueSource( longs = {BoltProtocolV1.VERSION, BoltProtocolV2.VERSION} ) @ValueSource( longs = {BoltProtocolV1.VERSION, BoltProtocolV2.VERSION} )
void shouldCreateBoltStateMachinesV1( long protocolVersion ) throws Throwable void shouldCreateBoltStateMachinesV1( long protocolVersion )
{ {
BoltStateMachineFactoryImpl factory = newBoltFactory(); BoltStateMachineFactoryImpl factory = newBoltFactory();


Expand All @@ -68,7 +70,7 @@ void shouldCreateBoltStateMachinesV1( long protocolVersion ) throws Throwable
} }


@Test @Test
void shouldCreateBoltStateMachinesV3() throws Throwable void shouldCreateBoltStateMachinesV3()
{ {
BoltStateMachineFactoryImpl factory = newBoltFactory(); BoltStateMachineFactoryImpl factory = newBoltFactory();


Expand All @@ -80,7 +82,7 @@ void shouldCreateBoltStateMachinesV3() throws Throwable


@ParameterizedTest( name = "V{0}" ) @ParameterizedTest( name = "V{0}" )
@ValueSource( longs = {999, -1} ) @ValueSource( longs = {999, -1} )
void shouldThrowExceptionIfVersionIsUnknown( long protocolVersion ) throws Throwable void shouldThrowExceptionIfVersionIsUnknown( long protocolVersion )
{ {
BoltStateMachineFactoryImpl factory = newBoltFactory(); BoltStateMachineFactoryImpl factory = newBoltFactory();


Expand All @@ -93,20 +95,22 @@ private static BoltStateMachineFactoryImpl newBoltFactory()
return newBoltFactory( newDbMock() ); return newBoltFactory( newDbMock() );
} }


private static BoltStateMachineFactoryImpl newBoltFactory( GraphDatabaseAPI db ) private static BoltStateMachineFactoryImpl newBoltFactory( DatabaseManager databaseManager )
{ {
return new BoltStateMachineFactoryImpl( db, new UsageData( new OnDemandJobScheduler() ), new AvailabilityGuard( CLOCK, NullLog.getInstance() ), return new BoltStateMachineFactoryImpl( databaseManager, new UsageData( new OnDemandJobScheduler() ),
mock( Authentication.class ), CLOCK, Config.defaults(), NullLogService.getInstance() ); new AvailabilityGuard( CLOCK, NullLog.getInstance() ), mock( Authentication.class ), CLOCK, Config.defaults(), NullLogService.getInstance() );
} }


private static GraphDatabaseAPI newDbMock() private static DatabaseManager newDbMock()
{ {
GraphDatabaseAPI db = mock( GraphDatabaseAPI.class ); GraphDatabaseFacade db = mock( GraphDatabaseFacade.class );
DependencyResolver dependencyResolver = mock( DependencyResolver.class ); DependencyResolver dependencyResolver = mock( DependencyResolver.class );
when( db.getDependencyResolver() ).thenReturn( dependencyResolver ); when( db.getDependencyResolver() ).thenReturn( dependencyResolver );
GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class );
when( queryService.getDependencyResolver() ).thenReturn( dependencyResolver ); when( queryService.getDependencyResolver() ).thenReturn( dependencyResolver );
when( dependencyResolver.resolveDependency( GraphDatabaseQueryService.class ) ).thenReturn( queryService ); when( dependencyResolver.resolveDependency( GraphDatabaseQueryService.class ) ).thenReturn( queryService );
return db; DatabaseManager databaseManager = mock( DatabaseManager.class );
when( databaseManager.getDatabaseFacade( DatabaseManager.DEFAULT_DATABASE_NAME ) ).thenReturn( Optional.of( db ) );
return databaseManager;
} }
} }
Expand Up @@ -23,8 +23,8 @@
import java.io.File; import java.io.File;


import org.neo4j.commandline.arguments.OptionalNamedArg; import org.neo4j.commandline.arguments.OptionalNamedArg;
import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.helpers.Args; import org.neo4j.helpers.Args;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager;


public class Database extends OptionalNamedArg public class Database extends OptionalNamedArg
{ {
Expand All @@ -37,7 +37,7 @@ public Database()


public Database( String description ) public Database( String description )
{ {
super( ARG_DATABASE, "name", DataSourceManager.DEFAULT_DATABASE_NAME, description ); super( ARG_DATABASE, "name", DatabaseManager.DEFAULT_DATABASE_NAME, description );
} }


private static String validate( String dbName ) private static String validate( String dbName )
Expand Down
Expand Up @@ -32,7 +32,7 @@
import java.util.function.Consumer; import java.util.function.Consumer;


import org.neo4j.commandline.arguments.Arguments; import org.neo4j.commandline.arguments.Arguments;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager; import org.neo4j.dbms.database.DatabaseManager;


import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.containsString;
Expand Down Expand Up @@ -155,7 +155,7 @@ void showsArgumentsAndDescriptionForSpecifiedCommand() throws Exception
"This is a description of the foobar command.%n" + "This is a description of the foobar command.%n" +
"%n" + "%n" +
"options:%n" + "options:%n" +
" --database=<name> Name of database. [default:" + DataSourceManager.DEFAULT_DATABASE_NAME + "]%n" ), " --database=<name> Name of database. [default:" + DatabaseManager.DEFAULT_DATABASE_NAME + "]%n" ),
baos.toString() ); baos.toString() );
} }
} }
Expand Down
Expand Up @@ -23,7 +23,7 @@
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;


import org.neo4j.commandline.admin.IncorrectUsage; import org.neo4j.commandline.admin.IncorrectUsage;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager; import org.neo4j.dbms.database.DatabaseManager;


import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertFalse;
Expand Down Expand Up @@ -141,7 +141,7 @@ void withDatabaseUsage()
void withDatabaseDescription() void withDatabaseDescription()
{ {
assertEquals( String.format( "How to use%n%noptions:%n" + assertEquals( String.format( "How to use%n%noptions:%n" +
" --database=<name> Name of database. [default:" + DataSourceManager.DEFAULT_DATABASE_NAME + "]" ), " --database=<name> Name of database. [default:" + DatabaseManager.DEFAULT_DATABASE_NAME + "]" ),
builder.withDatabase().description( "How to use" ) ); builder.withDatabase().description( "How to use" ) );
} }


Expand All @@ -156,7 +156,7 @@ void withDatabaseToUsage()
void withDatabaseToDescription() void withDatabaseToDescription()
{ {
assertEquals( String.format( "How to use%n%noptions:%n" + assertEquals( String.format( "How to use%n%noptions:%n" +
" --database=<name> Name of database. [default:" + DataSourceManager.DEFAULT_DATABASE_NAME + "]%n" + " --database=<name> Name of database. [default:" + DatabaseManager.DEFAULT_DATABASE_NAME + "]%n" +
" --to=<destination-path> Destination file." ), " --to=<destination-path> Destination file." ),
builder.withDatabase().withTo( "Destination file." ).description( "How to use" ) ); builder.withDatabase().withTo( "Destination file." ).description( "How to use" ) );
} }
Expand All @@ -165,7 +165,7 @@ void withDatabaseToDescription()
void withDatabaseToMultilineDescription() void withDatabaseToMultilineDescription()
{ {
assertEquals( String.format( "How to use%n%noptions:%n" + assertEquals( String.format( "How to use%n%noptions:%n" +
" --database=<name> Name of database. [default:" + DataSourceManager.DEFAULT_DATABASE_NAME + "]%n" + " --database=<name> Name of database. [default:" + DatabaseManager.DEFAULT_DATABASE_NAME + "]%n" +
" --to=<destination-path> This is a long string which should wrap on right%n" + " --to=<destination-path> This is a long string which should wrap on right%n" +
" col." ), " col." ),
builder.withDatabase() builder.withDatabase()
Expand All @@ -178,7 +178,7 @@ void longNamesTriggerNewLineFormatting()
{ {
assertEquals( String.format( "How to use%n%noptions:%n" + assertEquals( String.format( "How to use%n%noptions:%n" +
" --database=<name>%n" + " --database=<name>%n" +
" Name of database. [default:" + DataSourceManager.DEFAULT_DATABASE_NAME + "]%n" + " Name of database. [default:" + DatabaseManager.DEFAULT_DATABASE_NAME + "]%n" +
" --to=<destination-path>%n" + " --to=<destination-path>%n" +
" This is a long string which should not wrap on right col.%n" + " This is a long string which should not wrap on right col.%n" +
" --loooooooooooooong-variable-name=<loooooooooooooong-variable-value>%n" + " --loooooooooooooong-variable-name=<loooooooooooooong-variable-value>%n" +
Expand Down
Expand Up @@ -24,8 +24,8 @@
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;


import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.helpers.Args; import org.neo4j.helpers.Args;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager;


import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
Expand All @@ -37,7 +37,7 @@ class DatabaseTest
@Test @Test
void parseDatabaseShouldThrowOnPath() void parseDatabaseShouldThrowOnPath()
{ {
Path path = Paths.get( "data", "databases", DataSourceManager.DEFAULT_DATABASE_NAME ); Path path = Paths.get( "data", "databases", DatabaseManager.DEFAULT_DATABASE_NAME );
IllegalArgumentException exception = assertThrows( IllegalArgumentException.class, () -> arg.parse( Args.parse( "--database=" + path ) ) ); IllegalArgumentException exception = assertThrows( IllegalArgumentException.class, () -> arg.parse( Args.parse( "--database=" + path ) ) );
assertEquals( "'database' should be a name but you seem to have specified a path: " + path, exception.getMessage() ); assertEquals( "'database' should be a name but you seem to have specified a path: " + path, exception.getMessage() );
} }
Expand Down

0 comments on commit 9251c0d

Please sign in to comment.