diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransaction.java b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransaction.java index 011141ee43505..2beaf0e94780a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransaction.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransaction.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.api; -import java.util.Map; - import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.security.AccessMode; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java index 833d1ee6a7b3a..77d3c75e124dd 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelTransactionHandle.java @@ -19,7 +19,6 @@ */ package org.neo4j.kernel.api; -import java.util.Map; import java.util.Optional; import java.util.stream.Stream; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java index 0a3b783b54efc..efe337b8e23cd 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java @@ -168,7 +168,7 @@ TransactionWriteState upgradeToSchemaWrites() throws InvalidTransactionTypeKerne private long transactionId; private long commitTime; private volatile int reuseCount; - private Map userMetaData; + private volatile Map userMetaData; /** * Lock prevents transaction {@link #markForTermination(Status)} transaction termination} from interfering with diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java index 218c17d67265c..30d8d80e01b1b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java @@ -21,20 +21,14 @@ import java.time.Clock; import java.util.Set; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.function.Function; import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.neo4j.collection.pool.LinkedQueuePool; import org.neo4j.collection.pool.MarshlandPool; import org.neo4j.function.Factory; import org.neo4j.graphdb.DatabaseShutdownException; -import org.neo4j.helpers.collection.Pair; -import org.neo4j.kernel.api.ExecutingQuery; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransactionHandle; import org.neo4j.kernel.api.exceptions.Status; @@ -210,24 +204,6 @@ public Set activeTransactions() .collect( toSet() ); } - /** - * Give an approximate set of all transactions currently running together with associated metadata as - * computed by the provided selector function. - * This is not guaranteed to be exact, as transactions may stop and start while this set is gathered. - * - * @return the (approximate) set of open transactions. - */ - public Set> activeTransactions( - Function> selector - ) - { - return allTransactions.stream() - .map( this::createHandle ) - .filter( KernelTransactionHandle::isOpen ) - .flatMap( tx -> selector.apply( tx ).map( data -> Pair.of( tx, data ) ) ) - .collect( toSet() ); - } - /** * Create new handle for the given transaction. *

@@ -322,16 +298,4 @@ private void assertCurrentThreadIsNotBlockingNewTransactions() } } - public class TxExecutingQuery - { - public final Map txMetaData; - public final ExecutingQuery query; - - public TxExecutingQuery( Map txMetaData, ExecutingQuery query ) - { - this.txMetaData = txMetaData; - this.query = query; - } - } - } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java index 3fdfde4466ec5..eecf1caba5ffa 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java @@ -216,16 +216,6 @@ public void init( SPI spi, Config config ) .getOrCreateRelationshipIndex( InternalAutoIndexing.RELATIONSHIP_AUTO_INDEX, null ) ), spi.autoIndexing().relationships() ); this.indexManager = new IndexManagerImpl( spi::currentStatement, idxProvider, nodeAutoIndexer, relAutoIndexer ); - } - - /** - * This needs to be called after data source creation, when the execution engine dependency is satisfied by the - * cypher module - * - * @see GraphDatabaseFacadeFactory#initFacade(File, Map, GraphDatabaseFacadeFactory.Dependencies, GraphDatabaseFacade) - */ - public void initTransactionalContextFactoryFromSPI() - { this.contextFactory = new Neo4jTransactionalContextFactory( spi, locker ); } @@ -387,9 +377,7 @@ public Result execute( String query, Map parameters ) throws Quer // ensure we have a tx and create a context (the tx is gonna get closed by the Cypher result) InternalTransaction transaction = beginTransaction( KernelTransaction.Type.implicit, AccessMode.Static.FULL ); - TransactionalContext context = - contextFactory.newContext( QueryEngineProvider.describe(), transaction, query, parameters ); - return spi.executeQuery( query, parameters, context ); + return execute( transaction, query, parameters ); } @Override @@ -401,7 +389,6 @@ public Result execute( String query, Map parameters, long timeout return execute( transaction, query, parameters ); } - // This version of execute is only needed for internal testing of LOAD CSV PERIODIC COMMIT. Can be refactored? public Result execute( InternalTransaction transaction, String query, Map parameters ) throws QueryExecutionException { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java index 11111600ccd6b..f56166e84a865 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java @@ -160,7 +160,6 @@ public void registered( NeoStoreDataSource dataSource ) { engine = QueryEngineProvider.initialize( platform.dependencies, platform.graphDatabaseFacade, dependencies.executionEngines() ); - graphDatabaseFacade.initTransactionalContextFactoryFromSPI(); } queryEngine.set( engine ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java index ef734263e980a..204b0058ccad3 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java @@ -73,7 +73,6 @@ public GraphDatabaseService apply( Context context ) throws ProcedureException GraphDatabaseFacade facade = new GraphDatabaseFacade(); facade.init( new ProcedureGDBFacadeSPI( owningThread, transaction, queryExecutor, storeDir, resolver, AutoIndexing.UNSUPPORTED, storeId, availability, urlValidator ), config ); - facade.initTransactionalContextFactoryFromSPI(); return facade; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/Neo4jTransactionalContextFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/Neo4jTransactionalContextFactory.java index d619de1b90745..6c19f5cfa4dd0 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/query/Neo4jTransactionalContextFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/query/Neo4jTransactionalContextFactory.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.function.Supplier; +import org.neo4j.function.Suppliers; +import org.neo4j.graphdb.DependencyResolver; import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.api.ExecutingQuery; import org.neo4j.kernel.api.Statement; @@ -34,8 +36,8 @@ public class Neo4jTransactionalContextFactory implements TransactionalContextFactory { - private final GraphDatabaseQueryService queryService; private final Supplier statementSupplier; + private final Supplier queryServiceSupplier; private final ThreadToStatementContextBridge txBridge; private final PropertyContainerLocker locker; private final DbmsOperations.Factory dbmsOpsFactory; @@ -43,7 +45,7 @@ public class Neo4jTransactionalContextFactory implements TransactionalContextFac public Neo4jTransactionalContextFactory( GraphDatabaseFacade.SPI spi, PropertyContainerLocker locker ) { - this( spi.queryService(), locker, spi::currentStatement ); + this( locker, spi::currentStatement, spi.resolver() ); } @Deprecated @@ -57,24 +59,36 @@ public Neo4jTransactionalContextFactory( GraphDatabaseQueryService queryService, Supplier statementSupplier ) { this( - queryService, - statementSupplier, - queryService.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class ), - locker, - queryService.getDependencyResolver().resolveDependency( DbmsOperations.Factory.class ), - queryService.getDependencyResolver().resolveDependency( Guard.class ) + Suppliers.singleton( queryService ), + statementSupplier, + queryService.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class ), + locker, + queryService.getDependencyResolver().resolveDependency( DbmsOperations.Factory.class ), + queryService.getDependencyResolver().resolveDependency( Guard.class ) + ); + } + + public Neo4jTransactionalContextFactory( PropertyContainerLocker locker, Supplier statementSupplier, + DependencyResolver resolver ) + { + this( () -> resolver.resolveDependency( GraphDatabaseQueryService.class ), + statementSupplier, + resolver.resolveDependency( ThreadToStatementContextBridge.class ), + locker, + resolver.resolveDependency( DbmsOperations.Factory.class ), + resolver.resolveDependency( Guard.class ) ); } public Neo4jTransactionalContextFactory( - GraphDatabaseQueryService queryService, + Supplier queryServiceSupplier, Supplier statementSupplier, ThreadToStatementContextBridge txBridge, PropertyContainerLocker locker, DbmsOperations.Factory dbmsOpsFactory, Guard guard ) { - this.queryService = queryService; + this.queryServiceSupplier = queryServiceSupplier; this.statementSupplier = statementSupplier; this.txBridge = txBridge; this.locker = locker; @@ -91,6 +105,7 @@ public Neo4jTransactionalContext newContext( ) { Statement statement = statementSupplier.get(); + GraphDatabaseQueryService queryService = queryServiceSupplier.get(); QuerySource querySourceWithUserName = querySource.append( tx.mode().name() ); ExecutingQuery executingQuery = statement.queryRegistration().startQueryExecution( querySourceWithUserName, queryText, queryParameters @@ -114,6 +129,7 @@ public Neo4jTransactionalContext newContext( public Neo4jTransactionalContext newContext( ExecutingQuery query, InternalTransaction transaction ) { Statement statement = statementSupplier.get(); + GraphDatabaseQueryService queryService = queryServiceSupplier.get(); statement.queryRegistration().registerExecutingQuery( query ); return new Neo4jTransactionalContext( diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeTest.java index f91df90bf21f6..35a29a2e0de00 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeTest.java @@ -61,14 +61,13 @@ public void setUp() ThreadToStatementContextBridge contextBridge = mock( ThreadToStatementContextBridge.class ); when( spi.queryService() ).thenReturn( queryService ); - when( queryService.getDependencyResolver() ).thenReturn( dependencyResolver ); + when( spi.resolver() ).thenReturn( dependencyResolver ); when( dependencyResolver.resolveDependency( ThreadToStatementContextBridge.class ) ) .thenReturn( contextBridge ); when( contextBridge.get() ).thenReturn( statement ); defaultConfig = Config.defaults(); graphDatabaseFacade.init( spi, defaultConfig ); - graphDatabaseFacade.initTransactionalContextFactoryFromSPI(); } @Test diff --git a/enterprise/kernel/src/main/java/org/neo4j/kernel/enterprise/builtinprocs/BuiltInProcedures.java b/enterprise/kernel/src/main/java/org/neo4j/kernel/enterprise/builtinprocs/BuiltInProcedures.java index cc700864b7cf5..1efdc8c928c3d 100644 --- a/enterprise/kernel/src/main/java/org/neo4j/kernel/enterprise/builtinprocs/BuiltInProcedures.java +++ b/enterprise/kernel/src/main/java/org/neo4j/kernel/enterprise/builtinprocs/BuiltInProcedures.java @@ -71,7 +71,8 @@ @SuppressWarnings( "unused" ) public class BuiltInProcedures { - public static Clock clock = Clocks.systemClock(); + private static Clock clock = Clocks.systemClock(); + private static final int HARD_CHAR_LIMIT = 2048; @Context public DependencyResolver resolver; @@ -81,7 +82,6 @@ public class BuiltInProcedures @Context public KernelTransaction tx; - @Context public AuthSubject authSubject; @@ -89,9 +89,9 @@ public class BuiltInProcedures public void setTXMetaData( @Name( value = "data" ) Map data ) { int totalCharSize = data.entrySet().stream() - .mapToInt( e -> e.getKey().length() + e.getValue().toString().length() ).sum(); + .mapToInt( e -> e.getKey().length() + e.getValue().toString().length() ) + .sum(); - final int HARD_CHAR_LIMIT = 2048; if ( totalCharSize >= HARD_CHAR_LIMIT ) { throw new IllegalArgumentException(