From f076bf214a17f0a8267bf466212dc0b4bbf18fa8 Mon Sep 17 00:00:00 2001 From: Mikhaylo Demianenko Date: Tue, 23 Aug 2016 10:27:07 +0200 Subject: [PATCH] Using generic dependency resolution mechanics to resolve GraphDatabaseQueryService. Use dependency resolver to resolve GraphDatabaseQueryService instances instead of using QueryExecutionEngine for that. Remove `queryService` method from QueryExecutionEngine interface. --- .../org/neo4j/bolt/BoltKernelExtension.java | 29 ++++++----- .../runtime/LifecycleManagedBoltFactory.java | 17 ++++--- .../runtime/cypher/CypherStatementRunner.java | 14 +++--- .../v1/runtime/integration/SessionRule.java | 12 ++--- .../javacompat/CypherEngineProvider.java | 14 ++++-- .../internal/javacompat/ExecutionEngine.java | 6 --- .../kernel/impl/factory/ClassicCoreSPI.java | 2 +- .../kernel/impl/factory/DataSourceModule.java | 4 +- .../impl/proc/ProcedureGDBFacadeSPI.java | 2 +- .../kernel/impl/query/NoQueryEngine.java | 7 --- .../impl/query/QueryEngineProvider.java | 11 ++-- .../impl/query/QueryExecutionEngine.java | 3 -- .../org/neo4j/server/AbstractNeoServer.java | 21 +++++--- .../neo4j/server/database/CypherExecutor.java | 9 ++-- .../rest/transactional/TransactionFacade.java | 7 ++- .../rest/transactional/TransactionHandle.java | 9 ++-- .../ConcurrentTransactionAccessTest.java | 4 +- .../transactional/TransactionHandleTest.java | 50 +++++++++++-------- .../neo4j/shell/kernel/apps/cypher/Start.java | 14 ++++-- 19 files changed, 130 insertions(+), 105 deletions(-) diff --git a/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java b/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java index 76afab8eeccc2..4302ff6bcd878 100644 --- a/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java +++ b/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java @@ -23,6 +23,16 @@ import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import org.bouncycastle.operator.OperatorCreationException; + +import java.io.File; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.time.Clock; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + import org.neo4j.bolt.security.auth.Authentication; import org.neo4j.bolt.security.auth.BasicAuthentication; import org.neo4j.bolt.security.ssl.Certificates; @@ -33,11 +43,11 @@ import org.neo4j.bolt.transport.NettyServer; import org.neo4j.bolt.transport.NettyServer.ProtocolInitializer; import org.neo4j.bolt.transport.SocketTransport; +import org.neo4j.bolt.v1.runtime.BoltFactory; import org.neo4j.bolt.v1.runtime.BoltWorker; +import org.neo4j.bolt.v1.runtime.LifecycleManagedBoltFactory; import org.neo4j.bolt.v1.runtime.MonitoredWorkerFactory; import org.neo4j.bolt.v1.runtime.WorkerFactory; -import org.neo4j.bolt.v1.runtime.BoltFactory; -import org.neo4j.bolt.v1.runtime.LifecycleManagedBoltFactory; import org.neo4j.bolt.v1.runtime.concurrent.ThreadedWorkerFactory; import org.neo4j.bolt.v1.transport.BoltProtocolV1; import org.neo4j.graphdb.GraphDatabaseService; @@ -65,20 +75,13 @@ import org.neo4j.logging.Log; import org.neo4j.udc.UsageData; -import java.io.File; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.time.Clock; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; - import static java.lang.String.format; import static java.util.stream.Collectors.toList; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.Connector.ConnectorType.BOLT; import static org.neo4j.kernel.configuration.GroupSettingSupport.enumerate; -import static org.neo4j.kernel.configuration.Settings.*; +import static org.neo4j.kernel.configuration.Settings.PATH; +import static org.neo4j.kernel.configuration.Settings.derivedSetting; +import static org.neo4j.kernel.configuration.Settings.pathSetting; import static org.neo4j.kernel.impl.util.JobScheduler.Groups.boltNetworkIO; /** @@ -153,7 +156,7 @@ public Lifecycle newInstance( KernelContext context, Dependencies dependencies ) BoltFactory boltConnectionManagerFactory = life.add( new LifecycleManagedBoltFactory( api, dependencies.usageData(), logService, dependencies.txBridge(), - authentication, dependencies.dataSource(), dependencies.sessionTracker() ) ); + authentication, dependencies.sessionTracker() ) ); ThreadedWorkerFactory threadedSessions = new ThreadedWorkerFactory( boltConnectionManagerFactory, scheduler, logService ); WorkerFactory workerFactory = new MonitoredWorkerFactory( dependencies.monitors(), threadedSessions, Clock.systemUTC() ); diff --git a/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/LifecycleManagedBoltFactory.java b/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/LifecycleManagedBoltFactory.java index 6e8cb4fa60186..d17a0654f2f71 100644 --- a/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/LifecycleManagedBoltFactory.java +++ b/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/LifecycleManagedBoltFactory.java @@ -21,7 +21,8 @@ import org.neo4j.bolt.security.auth.Authentication; import org.neo4j.bolt.v1.runtime.cypher.CypherStatementRunner; -import org.neo4j.kernel.NeoStoreDataSource; +import org.neo4j.graphdb.DependencyResolver; +import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.api.bolt.BoltConnectionTracker; import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge; import org.neo4j.kernel.impl.logging.LogService; @@ -39,14 +40,14 @@ public class LifecycleManagedBoltFactory extends LifecycleAdapter implements Bol private final LogService logging; private final Authentication authentication; private final BoltConnectionTracker connectionTracker; - private final NeoStoreDataSource neoStoreDataSource; private final ThreadToStatementContextBridge txBridge; private QueryExecutionEngine queryExecutionEngine; + private GraphDatabaseQueryService queryService; public LifecycleManagedBoltFactory( GraphDatabaseAPI gds, UsageData usageData, LogService logging, - ThreadToStatementContextBridge txBridge, Authentication authentication, - NeoStoreDataSource neoStoreDataSource, BoltConnectionTracker connectionTracker) + ThreadToStatementContextBridge txBridge, Authentication authentication, + BoltConnectionTracker connectionTracker ) { this.gds = gds; this.usageData = usageData; @@ -54,7 +55,6 @@ public LifecycleManagedBoltFactory( GraphDatabaseAPI gds, UsageData usageData, L this.txBridge = txBridge; this.authentication = authentication; this.connectionTracker = connectionTracker; - this.neoStoreDataSource = neoStoreDataSource; } @Override @@ -66,7 +66,9 @@ public void init() throws Throwable @Override public void start() throws Throwable { - this.queryExecutionEngine = gds.getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); + DependencyResolver dependencyResolver = gds.getDependencyResolver(); + queryExecutionEngine = dependencyResolver.resolveDependency( QueryExecutionEngine.class ); + queryService = dependencyResolver.resolveDependency( GraphDatabaseQueryService.class ); life.start(); } @@ -85,7 +87,8 @@ public void shutdown() throws Throwable @Override public BoltStateMachine newMachine( String connectionDescriptor, Runnable onClose ) { - final CypherStatementRunner statementRunner = new CypherStatementRunner( queryExecutionEngine, txBridge ); + final CypherStatementRunner statementRunner = new CypherStatementRunner( queryExecutionEngine, txBridge, + queryService ); BoltStateMachine.SPI spi = new BoltStateMachineSPI( connectionDescriptor, usageData, gds, queryExecutionEngine, logging, authentication, txBridge, statementRunner, connectionTracker ); return new BoltStateMachine( spi, onClose ); diff --git a/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/cypher/CypherStatementRunner.java b/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/cypher/CypherStatementRunner.java index 9dab77373d826..cbc753ffc2f96 100644 --- a/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/cypher/CypherStatementRunner.java +++ b/community/bolt/src/main/java/org/neo4j/bolt/v1/runtime/cypher/CypherStatementRunner.java @@ -20,6 +20,8 @@ package org.neo4j.bolt.v1.runtime.cypher; +import java.util.Map; + import org.neo4j.bolt.v1.runtime.spi.StatementRunner; import org.neo4j.graphdb.Result; import org.neo4j.kernel.GraphDatabaseQueryService; @@ -32,8 +34,6 @@ import org.neo4j.kernel.impl.query.QueryExecutionEngine; import org.neo4j.kernel.impl.query.QuerySession; -import java.util.Map; - import static java.lang.String.format; import static org.neo4j.kernel.api.KernelTransaction.Type.implicit; @@ -43,21 +43,23 @@ public class CypherStatementRunner implements StatementRunner private final QueryExecutionEngine queryExecutionEngine; private final ThreadToStatementContextBridge txBridge; + private GraphDatabaseQueryService queryService; - public CypherStatementRunner( QueryExecutionEngine queryExecutionEngine, ThreadToStatementContextBridge txBridge ) + public CypherStatementRunner( QueryExecutionEngine queryExecutionEngine, ThreadToStatementContextBridge txBridge, + GraphDatabaseQueryService queryService ) { this.queryExecutionEngine = queryExecutionEngine; this.txBridge = txBridge; + this.queryService = queryService; } @Override public Result run( final String querySource, final AuthSubject authSubject, final String statement, final Map params ) throws KernelException { - GraphDatabaseQueryService service = queryExecutionEngine.queryService(); - InternalTransaction transaction = service.beginTransaction( implicit, authSubject ); + InternalTransaction transaction = queryService.beginTransaction( implicit, authSubject ); Neo4jTransactionalContext transactionalContext = - new Neo4jTransactionalContext( service, transaction, txBridge.get(), locker ); + new Neo4jTransactionalContext( queryService, transaction, txBridge.get(), locker ); QuerySession session = new BoltQuerySession( transactionalContext, querySource ); return queryExecutionEngine.executeQuery( statement, params, session ); } diff --git a/community/bolt/src/test/java/org/neo4j/bolt/v1/runtime/integration/SessionRule.java b/community/bolt/src/test/java/org/neo4j/bolt/v1/runtime/integration/SessionRule.java index 9b119e27ae97a..eccbb81fd41d3 100644 --- a/community/bolt/src/test/java/org/neo4j/bolt/v1/runtime/integration/SessionRule.java +++ b/community/bolt/src/test/java/org/neo4j/bolt/v1/runtime/integration/SessionRule.java @@ -19,6 +19,10 @@ */ package org.neo4j.bolt.v1.runtime.integration; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + import java.io.File; import java.io.IOException; import java.io.PrintWriter; @@ -27,10 +31,6 @@ import java.util.LinkedList; import java.util.Map; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - import org.neo4j.bolt.security.auth.Authentication; import org.neo4j.bolt.security.auth.BasicAuthentication; import org.neo4j.bolt.v1.runtime.BoltStateMachine; @@ -39,7 +39,6 @@ import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.config.Setting; import org.neo4j.graphdb.factory.GraphDatabaseSettings; -import org.neo4j.kernel.NeoStoreDataSource; import org.neo4j.kernel.api.bolt.BoltConnectionTracker; import org.neo4j.kernel.api.security.AuthManager; import org.neo4j.kernel.configuration.Config; @@ -77,8 +76,7 @@ public void evaluate() throws Throwable resolver.resolveDependency( AuthManager.class ), logService ); boltFactory = new LifecycleManagedBoltFactory( gdb, new UsageData( null ), logService, resolver.resolveDependency( ThreadToStatementContextBridge.class ), - authentication, resolver.resolveDependency( NeoStoreDataSource.class ), - BoltConnectionTracker.NOOP ); + authentication, BoltConnectionTracker.NOOP ); boltFactory.start(); try { diff --git a/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/CypherEngineProvider.java b/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/CypherEngineProvider.java index f15de84f97d78..01307d6f30ef1 100644 --- a/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/CypherEngineProvider.java +++ b/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/CypherEngineProvider.java @@ -20,11 +20,13 @@ package org.neo4j.cypher.internal.javacompat; import org.neo4j.cypher.javacompat.internal.GraphDatabaseCypherService; +import org.neo4j.graphdb.DependencyResolver; import org.neo4j.helpers.Service; -import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.query.QueryEngineProvider; import org.neo4j.kernel.impl.query.QueryExecutionEngine; +import org.neo4j.kernel.impl.util.Dependencies; +import org.neo4j.kernel.internal.GraphDatabaseAPI; @Service.Implementation(QueryEngineProvider.class) public class CypherEngineProvider extends QueryEngineProvider @@ -35,9 +37,13 @@ public CypherEngineProvider() } @Override - protected QueryExecutionEngine createEngine( GraphDatabaseAPI graphAPI ) + protected QueryExecutionEngine createEngine( Dependencies deps, GraphDatabaseAPI graphAPI ) { - LogService logService = graphAPI.getDependencyResolver().resolveDependency( LogService.class ); - return new ExecutionEngine( new GraphDatabaseCypherService( graphAPI ), logService.getInternalLogProvider() ); + GraphDatabaseCypherService queryService = new GraphDatabaseCypherService( graphAPI ); + deps.satisfyDependency( queryService ); + + DependencyResolver resolver = graphAPI.getDependencyResolver(); + LogService logService = resolver.resolveDependency( LogService.class ); + return new ExecutionEngine( queryService, logService.getInternalLogProvider() ); } } diff --git a/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/ExecutionEngine.java b/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/ExecutionEngine.java index ec9b86462760b..b61c86a37606a 100644 --- a/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/ExecutionEngine.java +++ b/community/cypher/cypher/src/main/java/org/neo4j/cypher/internal/javacompat/ExecutionEngine.java @@ -50,12 +50,6 @@ public ExecutionEngine( GraphDatabaseQueryService queryService, LogProvider logP inner = new org.neo4j.cypher.internal.ExecutionEngine( queryService, logProvider ); } - @Override - public GraphDatabaseQueryService queryService() - { - return inner.queryService(); - } - @Override public Result executeQuery( String query, Map parameters, QuerySession querySession ) throws QueryExecutionKernelException diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/ClassicCoreSPI.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/ClassicCoreSPI.java index e256b5dc06e80..29117ba22864a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/ClassicCoreSPI.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/ClassicCoreSPI.java @@ -139,7 +139,7 @@ public URL validateURLAccess( URL url ) throws URLAccessValidationError @Override public GraphDatabaseQueryService queryService() { - return dataSource.queryExecutor.get().queryService(); + return platform.dependencies.resolveDependency( GraphDatabaseQueryService.class ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java index 4a177af7c028b..20205cfe0b763 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java @@ -230,10 +230,8 @@ public void registered( NeoStoreDataSource dataSource ) { if ( engine == null ) { - engine = QueryEngineProvider.initialize( platformModule.graphDatabaseFacade, + engine = QueryEngineProvider.initialize( deps, platformModule.graphDatabaseFacade, dependencies.executionEngines() ); - - deps.satisfyDependency( engine ); } queryExecutor.set( engine ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java index 6eade30d2e2a4..0553e491a4711 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java @@ -186,7 +186,7 @@ public URL validateURLAccess( URL url ) throws URLAccessValidationError @Override public GraphDatabaseQueryService queryService() { - return queryExecutor.get().queryService(); + return resolver.resolveDependency( GraphDatabaseQueryService.class ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/NoQueryEngine.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/NoQueryEngine.java index 1b4732e5516fe..a75281499ca16 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/NoQueryEngine.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/NoQueryEngine.java @@ -22,7 +22,6 @@ import java.util.Map; import org.neo4j.graphdb.Result; -import org.neo4j.kernel.GraphDatabaseQueryService; enum NoQueryEngine implements QueryExecutionEngine { @@ -52,12 +51,6 @@ public boolean isPeriodicCommit( String query ) throw noQueryEngine(); } - @Override - public GraphDatabaseQueryService queryService() - { - throw noQueryEngine(); - } - private RuntimeException noQueryEngine() { return new UnsupportedOperationException( "No query engine installed." ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryEngineProvider.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryEngineProvider.java index fa4d7d1436426..ef1cb1d140631 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryEngineProvider.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryEngineProvider.java @@ -20,6 +20,7 @@ package org.neo4j.kernel.impl.query; import org.neo4j.helpers.Service; +import org.neo4j.kernel.impl.util.Dependencies; import org.neo4j.kernel.internal.GraphDatabaseAPI; import static java.lang.String.format; @@ -31,9 +32,10 @@ public QueryEngineProvider( String name ) super( name ); } - protected abstract QueryExecutionEngine createEngine( GraphDatabaseAPI graphAPI ); + protected abstract QueryExecutionEngine createEngine( Dependencies deps, GraphDatabaseAPI graphAPI ); - public static QueryExecutionEngine initialize( GraphDatabaseAPI graphAPI, Iterable providers ) + public static QueryExecutionEngine initialize( Dependencies deps, GraphDatabaseAPI graphAPI, + Iterable providers ) { QueryEngineProvider provider = null; for ( QueryEngineProvider candidate : providers ) @@ -49,9 +51,10 @@ public static QueryExecutionEngine initialize( GraphDatabaseAPI graphAPI, Iterab } if ( provider == null ) { - return NoQueryEngine.INSTANCE; + return noEngine(); } - return provider.createEngine( graphAPI ); + QueryExecutionEngine engine = provider.createEngine( deps, graphAPI ); + return deps.satisfyDependency( engine ); } public static QueryExecutionEngine noEngine() diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryExecutionEngine.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryExecutionEngine.java index a217c72ce0f26..b6333372919ff 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryExecutionEngine.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/QueryExecutionEngine.java @@ -22,12 +22,9 @@ import java.util.Map; import org.neo4j.graphdb.Result; -import org.neo4j.kernel.GraphDatabaseQueryService; public interface QueryExecutionEngine { - GraphDatabaseQueryService queryService(); - Result executeQuery( String query, Map parameters, QuerySession querySession ) throws QueryExecutionKernelException; Result profileQuery( String query, Map parameters, QuerySession querySession) throws QueryExecutionKernelException; diff --git a/community/server/src/main/java/org/neo4j/server/AbstractNeoServer.java b/community/server/src/main/java/org/neo4j/server/AbstractNeoServer.java index 3bce8208f865e..bad4ce2a7d3f1 100644 --- a/community/server/src/main/java/org/neo4j/server/AbstractNeoServer.java +++ b/community/server/src/main/java/org/neo4j/server/AbstractNeoServer.java @@ -19,6 +19,10 @@ */ package org.neo4j.server; +import com.sun.jersey.api.core.HttpContext; +import org.apache.commons.configuration.Configuration; +import org.bouncycastle.operator.OperatorCreationException; + import java.io.File; import java.io.IOException; import java.net.URI; @@ -32,10 +36,6 @@ import java.util.regex.Pattern; import javax.servlet.Filter; -import com.sun.jersey.api.core.HttpContext; -import org.apache.commons.configuration.Configuration; -import org.bouncycastle.operator.OperatorCreationException; - import org.neo4j.bolt.security.ssl.Certificates; import org.neo4j.bolt.security.ssl.KeyStoreFactory; import org.neo4j.bolt.security.ssl.KeyStoreInformation; @@ -45,6 +45,7 @@ import org.neo4j.helpers.HostnamePort; import org.neo4j.helpers.RunCarefully; import org.neo4j.io.fs.DefaultFileSystemAbstraction; +import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.api.security.AuthManager; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.guard.Guard; @@ -88,11 +89,14 @@ import static java.lang.Math.round; import static java.lang.String.format; import static java.util.concurrent.TimeUnit.MILLISECONDS; - import static org.neo4j.helpers.Clock.SYSTEM_CLOCK; import static org.neo4j.helpers.collection.Iterables.map; import static org.neo4j.kernel.impl.util.JobScheduler.Groups.serverTransactionTimeout; -import static org.neo4j.server.configuration.ServerSettings.*; +import static org.neo4j.server.configuration.ServerSettings.HttpConnector; +import static org.neo4j.server.configuration.ServerSettings.httpConnector; +import static org.neo4j.server.configuration.ServerSettings.http_logging_enabled; +import static org.neo4j.server.configuration.ServerSettings.http_logging_rotation_keep_number; +import static org.neo4j.server.configuration.ServerSettings.http_logging_rotation_size; import static org.neo4j.server.database.InjectableProvider.providerForSingleton; import static org.neo4j.server.exception.ServerStartupErrors.translateToServerStartupError; @@ -245,10 +249,11 @@ private TransactionFacade createTransactionalActions() transactionRegistry.rollbackSuspendedTransactionsIdleSince( maxAge ); }, runEvery, MILLISECONDS ); + DependencyResolver dependencyResolver = database.getGraph().getDependencyResolver(); return new TransactionFacade( new TransitionalPeriodTransactionMessContainer( database.getGraph() ), - database.getGraph().getDependencyResolver().resolveDependency( QueryExecutionEngine.class ), - transactionRegistry, logProvider + dependencyResolver.resolveDependency( QueryExecutionEngine.class ), + dependencyResolver.resolveDependency( GraphDatabaseQueryService.class ), transactionRegistry, logProvider ); } diff --git a/community/server/src/main/java/org/neo4j/server/database/CypherExecutor.java b/community/server/src/main/java/org/neo4j/server/database/CypherExecutor.java index 4c590422c64d8..e99f08771f73a 100644 --- a/community/server/src/main/java/org/neo4j/server/database/CypherExecutor.java +++ b/community/server/src/main/java/org/neo4j/server/database/CypherExecutor.java @@ -22,9 +22,10 @@ import javax.servlet.http.HttpServletRequest; import org.neo4j.cypher.internal.javacompat.ExecutionEngine; +import org.neo4j.graphdb.DependencyResolver; import org.neo4j.kernel.GraphDatabaseQueryService; -import org.neo4j.kernel.api.security.AccessMode; import org.neo4j.kernel.api.KernelTransaction; +import org.neo4j.kernel.api.security.AccessMode; import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge; import org.neo4j.kernel.impl.coreapi.InternalTransaction; import org.neo4j.kernel.impl.coreapi.PropertyContainerLocker; @@ -57,9 +58,9 @@ public ExecutionEngine getExecutionEngine() @Override public void start() throws Throwable { - this.executionEngine = (ExecutionEngine) database.getGraph().getDependencyResolver() - .resolveDependency( QueryExecutionEngine.class ); - this.service = executionEngine.queryService(); + DependencyResolver dependencyResolver = database.getGraph().getDependencyResolver(); + this.executionEngine = (ExecutionEngine) dependencyResolver.resolveDependency( QueryExecutionEngine.class ); + this.service = dependencyResolver.resolveDependency( GraphDatabaseQueryService.class ); this.txBridge = service.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class ); } diff --git a/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionFacade.java b/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionFacade.java index a800c81be027c..d202933bfd151 100644 --- a/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionFacade.java +++ b/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionFacade.java @@ -23,6 +23,7 @@ import java.io.OutputStream; import java.net.URI; +import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.api.security.AccessMode; import org.neo4j.kernel.impl.query.QueryExecutionEngine; import org.neo4j.logging.LogProvider; @@ -55,12 +56,14 @@ public class TransactionFacade private final QueryExecutionEngine engine; private final TransactionRegistry registry; private final LogProvider logProvider; + private GraphDatabaseQueryService queryService; public TransactionFacade( TransitionalPeriodTransactionMessContainer kernel, QueryExecutionEngine engine, - TransactionRegistry registry, LogProvider logProvider ) + GraphDatabaseQueryService queryService, TransactionRegistry registry, LogProvider logProvider ) { this.kernel = kernel; this.engine = engine; + this.queryService = queryService; this.registry = registry; this.logProvider = logProvider; } @@ -68,7 +71,7 @@ public TransactionFacade( TransitionalPeriodTransactionMessContainer kernel, Que public TransactionHandle newTransactionHandle( TransactionUriScheme uriScheme, boolean implicitTransaction, AccessMode mode ) throws TransactionLifecycleException { - return new TransactionHandle( kernel, engine, registry, uriScheme, implicitTransaction, mode, logProvider ); + return new TransactionHandle( kernel, engine, queryService, registry, uriScheme, implicitTransaction, mode, logProvider ); } public TransactionHandle findTransactionHandle( long txId ) throws TransactionLifecycleException diff --git a/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionHandle.java b/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionHandle.java index 5203d04444609..2ef6eb10f0bfd 100644 --- a/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionHandle.java +++ b/community/server/src/main/java/org/neo4j/server/rest/transactional/TransactionHandle.java @@ -30,6 +30,7 @@ import org.neo4j.graphdb.Result; import org.neo4j.graphdb.security.AuthorizationViolationException; import org.neo4j.kernel.DeadlockDetectedException; +import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.api.KernelTransaction.Type; import org.neo4j.kernel.api.exceptions.KernelException; import org.neo4j.kernel.api.exceptions.Status; @@ -76,13 +77,15 @@ public class TransactionHandle implements TransactionTerminationHandle private final Log log; private final long id; private TransitionalTxManagementKernelTransaction context; + private GraphDatabaseQueryService queryService; TransactionHandle( TransitionalPeriodTransactionMessContainer txManagerFacade, QueryExecutionEngine engine, - TransactionRegistry registry, TransactionUriScheme uriScheme, boolean implicitTransaction, AccessMode mode, - LogProvider logProvider ) + GraphDatabaseQueryService queryService, TransactionRegistry registry, TransactionUriScheme uriScheme, + boolean implicitTransaction, AccessMode mode, LogProvider logProvider ) { this.txManagerFacade = txManagerFacade; this.engine = engine; + this.queryService = queryService; this.registry = registry; this.uriScheme = uriScheme; this.type = implicitTransaction ? Type.implicit : Type.explicit; @@ -311,7 +314,7 @@ private void executeStatements( StatementDeserializer statements, ExecutionResul } hasPrevious = true; - QuerySession querySession = txManagerFacade.create( engine.queryService(), type, mode, request ); + QuerySession querySession = txManagerFacade.create( queryService, type, mode, request ); Result result = safelyExecute( statement, hasPeriodicCommit, querySession ); output.statementResult( result, statement.includeStats(), statement.resultDataContents() ); output.notifications( result.getNotifications() ); diff --git a/community/server/src/test/java/org/neo4j/server/rest/transactional/ConcurrentTransactionAccessTest.java b/community/server/src/test/java/org/neo4j/server/rest/transactional/ConcurrentTransactionAccessTest.java index 98cbbba6cbe6f..b808268bcce13 100644 --- a/community/server/src/test/java/org/neo4j/server/rest/transactional/ConcurrentTransactionAccessTest.java +++ b/community/server/src/test/java/org/neo4j/server/rest/transactional/ConcurrentTransactionAccessTest.java @@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRequest; import org.neo4j.helpers.Clock; +import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.security.AccessMode; import org.neo4j.logging.NullLogProvider; @@ -47,9 +48,10 @@ public void shouldThrowSpecificExceptionOnConcurrentTransactionAccess() throws E TransactionRegistry registry = new TransactionHandleRegistry( mock( Clock.class), 0, NullLogProvider.getInstance() ); TransitionalPeriodTransactionMessContainer kernel = mock( TransitionalPeriodTransactionMessContainer.class ); + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); when(kernel.newTransaction( any( KernelTransaction.Type.class ), any( AccessMode.class ) ) ) .thenReturn( mock(TransitionalTxManagementKernelTransaction.class) ); - TransactionFacade actions = new TransactionFacade( kernel, null, registry, NullLogProvider.getInstance() ); + TransactionFacade actions = new TransactionFacade( kernel, null, queryService, registry, NullLogProvider.getInstance() ); final TransactionHandle transactionHandle = actions.newTransactionHandle( new DisgustingUriScheme(), true, AccessMode.Static.FULL ); diff --git a/community/server/src/test/java/org/neo4j/server/rest/transactional/TransactionHandleTest.java b/community/server/src/test/java/org/neo4j/server/rest/transactional/TransactionHandleTest.java index 478fe164ac630..d88530740ce19 100644 --- a/community/server/src/test/java/org/neo4j/server/rest/transactional/TransactionHandleTest.java +++ b/community/server/src/test/java/org/neo4j/server/rest/transactional/TransactionHandleTest.java @@ -85,8 +85,7 @@ public void shouldExecuteStatements() throws Exception when( executionEngine.executeQuery( "query", map(), querySession ) ).thenReturn( executionResult ); TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, true, FULL, - NullLogProvider.getInstance() ); + TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when @@ -122,8 +121,7 @@ public void shouldSuspendTransactionAndReleaseForOtherRequestsAfterExecutingStat Result executionResult = mock( Result.class ); when( executionEngine.executeQuery( "query", map(), querySession ) ).thenReturn( executionResult ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, true, FULL, - NullLogProvider.getInstance() ); + TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when @@ -158,8 +156,7 @@ public void shouldResumeTransactionWhenExecutingStatementsOnSecondRequest() thro when( kernel.create( any( GraphDatabaseQueryService.class ), any( Type.class ), any( AccessMode.class ), any( HttpServletRequest.class )) ).thenReturn( querySession ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, true, FULL, - NullLogProvider.getInstance() ); + TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); handle.execute( statements( new Statement( "query", map(), false, (ResultDataContent[]) null ) ), output, @@ -207,8 +204,7 @@ public void shouldCommitSinglePeriodicCommitStatement() throws Exception TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, true, FULL, - NullLogProvider.getInstance() ); + TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); Statement statement = new Statement( queryText, map(), false, (ResultDataContent[]) null ); @@ -243,7 +239,8 @@ public void shouldCommitTransactionAndTellRegistryToForgetItsHandle() throws Exc Result result = mock( Result.class ); when( engine.executeQuery( "query", map(), querySession ) ).thenReturn( result ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, engine, registry, uriScheme, false, FULL, + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + TransactionHandle handle = new TransactionHandle( kernel, engine, queryService, registry, uriScheme, false, FULL, NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); @@ -273,8 +270,9 @@ public void shouldRollbackTransactionAndTellRegistryToForgetItsHandle() throws E TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, mock( QueryExecutionEngine.class ), registry, - uriScheme, true, FULL, NullLogProvider.getInstance() ); + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + TransactionHandle handle = new TransactionHandle( kernel, mock( QueryExecutionEngine.class ), queryService, + registry, uriScheme, true, FULL, NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when @@ -307,7 +305,8 @@ public void shouldCreateTransactionContextOnlyWhenFirstNeeded() throws Exception any( HttpServletRequest.class )) ).thenReturn( querySession ); when( engine.executeQuery( "query", map(), querySession ) ).thenReturn( executionResult ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, engine, registry, uriScheme, true, FULL, + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + TransactionHandle handle = new TransactionHandle( kernel, engine, queryService, registry, uriScheme, true, FULL, NullLogProvider.getInstance() ); // then @@ -346,8 +345,7 @@ public void shouldRollbackTransactionIfExecutionErrorOccurs() throws Exception when( executionEngine.executeQuery( "query", map(), querySession ) ).thenThrow( new NullPointerException() ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, true, FULL, - NullLogProvider.getInstance() ); + TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when @@ -386,8 +384,8 @@ public void shouldLogMessageIfCommitErrorOccurs() throws Exception any( HttpServletRequest.class )) ).thenReturn( querySession ); when( engine.executeQuery( "query", map(), querySession ) ).thenReturn( executionResult ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = - new TransactionHandle( kernel, engine, registry, uriScheme, false, FULL, logProvider ); + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + TransactionHandle handle = new TransactionHandle( kernel, engine, queryService, registry, uriScheme, false, FULL, logProvider ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when @@ -421,7 +419,8 @@ public void shouldLogMessageIfCypherSyntaxErrorOccurs() throws Exception TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, false, FULL, + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + TransactionHandle handle = new TransactionHandle( kernel, executionEngine, queryService, registry, uriScheme, false, FULL, NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); @@ -448,7 +447,8 @@ public void shouldHandleExecutionEngineThrowingUndeclaredCheckedExceptions() thr TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); - TransactionHandle handle = new TransactionHandle( mockKernel(), executionEngine, registry, uriScheme, false, FULL, + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + TransactionHandle handle = new TransactionHandle( mockKernel(), executionEngine, queryService, registry, uriScheme, false, FULL, NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); @@ -475,8 +475,7 @@ public void shouldInterruptTransaction() throws Exception TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); - TransactionHandle handle = new TransactionHandle( kernel, executionEngine, registry, uriScheme, true, FULL, - NullLogProvider.getInstance() ); + TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); Statement statement = new Statement( "MATCH (n) RETURN n", map(), false, (ResultDataContent[]) null ); @@ -498,8 +497,9 @@ public void deadlockExceptionHasCorrectStatus() throws Exception when( executionEngine.executeQuery( anyString(), anyMap(), any( QuerySession.class ) ) ) .thenThrow( new DeadlockDetectedException( "deadlock" ) ); + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); TransactionHandle handle = new TransactionHandle( mockKernel(), executionEngine, - mock( TransactionRegistry.class ), uriScheme, true, FULL, NullLogProvider.getInstance() ); + queryService, mock( TransactionRegistry.class ), uriScheme, true, FULL, NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); @@ -511,6 +511,14 @@ public void deadlockExceptionHasCorrectStatus() throws Exception verify( output ).errors( argThat( hasErrors( Status.Transaction.DeadlockDetected ) ) ); } + private TransactionHandle getTransactionHandle( TransitionalPeriodTransactionMessContainer kernel, + QueryExecutionEngine executionEngine, TransactionRegistry registry ) + { + GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); + return new TransactionHandle( kernel, executionEngine, queryService, registry, uriScheme, true, FULL, + NullLogProvider.getInstance() ); + } + private static final TransactionUriScheme uriScheme = new TransactionUriScheme() { @Override diff --git a/community/shell/src/main/java/org/neo4j/shell/kernel/apps/cypher/Start.java b/community/shell/src/main/java/org/neo4j/shell/kernel/apps/cypher/Start.java index 7c8e5efe08509..8d0deea11ba56 100644 --- a/community/shell/src/main/java/org/neo4j/shell/kernel/apps/cypher/Start.java +++ b/community/shell/src/main/java/org/neo4j/shell/kernel/apps/cypher/Start.java @@ -24,6 +24,7 @@ import java.text.MessageFormat; import java.util.Map; +import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.Result; import org.neo4j.helpers.Service; import org.neo4j.kernel.GraphDatabaseQueryService; @@ -172,11 +173,16 @@ protected QueryExecutionEngine getEngine() { if ( this.engine == null ) { - this.engine = getServer().getDb().getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); + this.engine = getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); } return this.engine; } + private DependencyResolver getDependencyResolver() + { + return getServer().getDb().getDependencyResolver(); + } + protected long now() { return System.currentTimeMillis(); @@ -184,10 +190,10 @@ protected long now() private QuerySession shellSession( Session session ) { - GraphDatabaseQueryService graph = this.engine.queryService(); + DependencyResolver dependencyResolver = getDependencyResolver(); + GraphDatabaseQueryService graph = dependencyResolver.resolveDependency( GraphDatabaseQueryService.class ); InternalTransaction transaction = graph.beginTransaction( KernelTransaction.Type.implicit, AccessMode.Static.FULL ); - Statement statement = - graph.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class ).get(); + Statement statement = dependencyResolver.resolveDependency( ThreadToStatementContextBridge.class ).get(); Neo4jTransactionalContext context = new Neo4jTransactionalContext( graph, transaction, statement, new PropertyContainerLocker() ); return new ShellQuerySession( session, context );