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.BoltConnectionReadLimiter;
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.DefaultBoltConnectionFactory;
import org.neo4j.bolt.runtime.ExecutorBoltSchedulerProvider;
Expand All @@ -41,8 +43,7 @@
import org.neo4j.bolt.transport.NettyServer.ProtocolInitializer;
import org.neo4j.bolt.transport.SocketTransport;
import org.neo4j.bolt.transport.TransportThrottleGroup;
import org.neo4j.bolt.runtime.BoltStateMachineFactory;
import org.neo4j.bolt.runtime.BoltStateMachineFactoryImpl;
import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.helpers.ListenSocketAddress;
Expand All @@ -56,7 +57,6 @@
import org.neo4j.kernel.configuration.ConnectorPortRegister;
import org.neo4j.kernel.configuration.ssl.SslPolicyLoader;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.LifecycleAdapter;
import org.neo4j.kernel.monitoring.Monitors;
Expand All @@ -71,7 +71,7 @@
public class BoltServer extends LifecycleAdapter
{
// platform dependencies
private final GraphDatabaseAPI db;
private final DatabaseManager databaseManager;
private final FileSystemAbstraction fs;
private final JobScheduler jobScheduler;
private final AvailabilityGuard availabilityGuard;
Expand All @@ -88,11 +88,11 @@ public class BoltServer extends LifecycleAdapter

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,
Clock clock, Monitors monitors, LogService logService, DependencyResolver dependencyResolver )
{
this.db = db;
this.databaseManager = databaseManager;
this.fs = fs;
this.jobScheduler = jobScheduler;
this.availabilityGuard = availabilityGuard;
Expand Down Expand Up @@ -235,6 +235,6 @@ private BoltProtocolFactory createBoltProtocolFactory( BoltConnectionFactory con

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.BoltStateMachineV3;
import org.neo4j.bolt.v3.runtime.TransactionStateMachineV3SPI;
import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.AvailabilityGuard;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.udc.UsageData;

public class BoltStateMachineFactoryImpl implements BoltStateMachineFactory
{
private final GraphDatabaseAPI db;
private final DatabaseManager databaseManager;
private final UsageData usageData;
private final AvailabilityGuard availabilityGuard;
private final LogService logging;
private final Authentication authentication;
private final Config config;
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 )
{
this.db = db;
this.databaseManager = databaseManager;
this.usageData = usageData;
this.availabilityGuard = availabilityGuard;
this.logging = logging;
Expand Down Expand Up @@ -80,21 +80,26 @@ else if ( protocolVersion == BoltProtocolV3.VERSION )

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 );
return new BoltStateMachineV1( boltSPI, boltChannel, clock );
}

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 );
return new BoltStateMachineV3( boltSPI, boltChannel, clock );
}

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

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

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

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

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

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

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

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

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

Expand All @@ -93,20 +95,22 @@ private static BoltStateMachineFactoryImpl newBoltFactory()
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() ),
mock( Authentication.class ), CLOCK, Config.defaults(), NullLogService.getInstance() );
return new BoltStateMachineFactoryImpl( databaseManager, new UsageData( new OnDemandJobScheduler() ),
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 );
when( db.getDependencyResolver() ).thenReturn( dependencyResolver );
GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class );
when( queryService.getDependencyResolver() ).thenReturn( dependencyResolver );
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 org.neo4j.commandline.arguments.OptionalNamedArg;
import org.neo4j.dbms.database.DatabaseManager;
import org.neo4j.helpers.Args;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager;

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

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 )
Expand Down
Expand Up @@ -32,7 +32,7 @@
import java.util.function.Consumer;

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 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" +
"%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() );
}
}
Expand Down
Expand Up @@ -23,7 +23,7 @@
import org.junit.jupiter.api.Test;

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.assertFalse;
Expand Down Expand Up @@ -141,7 +141,7 @@ void withDatabaseUsage()
void withDatabaseDescription()
{
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" ) );
}

Expand All @@ -156,7 +156,7 @@ void withDatabaseToUsage()
void withDatabaseToDescription()
{
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." ),
builder.withDatabase().withTo( "Destination file." ).description( "How to use" ) );
}
Expand All @@ -165,7 +165,7 @@ void withDatabaseToDescription()
void withDatabaseToMultilineDescription()
{
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" +
" col." ),
builder.withDatabase()
Expand All @@ -178,7 +178,7 @@ void longNamesTriggerNewLineFormatting()
{
assertEquals( String.format( "How to use%n%noptions:%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" +
" This is a long string which should not wrap on right col.%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.Paths;

import org.neo4j.dbms.database.DatabaseManager;
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.assertThrows;
Expand All @@ -37,7 +37,7 @@ class DatabaseTest
@Test
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 ) ) );
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.