From 7cf94d523b0d5b2b4da7d3f9d6f22bf9c6702c5b Mon Sep 17 00:00:00 2001 From: Davide Grohmann Date: Fri, 19 Feb 2016 16:17:42 +0100 Subject: [PATCH] Add KernelTransactionType A transaction should know if it has been implictly created by Neo4j or explicitly created by the end user --- .../java/org/neo4j/kernel/api/KernelAPI.java | 6 +- .../neo4j/kernel/api/KernelTransaction.java | 15 +++ .../org/neo4j/kernel/impl/api/Kernel.java | 4 +- .../api/KernelTransactionImplementation.java | 11 ++- .../kernel/impl/api/KernelTransactions.java | 11 +-- ...emoveOrphanConstraintIndexesOnStartup.java | 2 +- .../api/state/ConstraintIndexCreator.java | 8 +- .../core/IsolatedTransactionTokenCreator.java | 4 +- .../kernel/impl/factory/ClassicCoreSPI.java | 4 +- .../impl/factory/GraphDatabaseFacade.java | 96 +++++++++++-------- .../factory/GraphDatabaseFacadeFactory.java | 4 +- .../kernel/impl/index/LegacyIndexStore.java | 2 +- .../impl/proc/ProcedureGDBFacadeSPI.java | 12 +-- .../kernel/impl/proc/ProcedureGDSFactory.java | 8 +- .../kernel/api/KernelTransactionFactory.java | 4 +- .../KernelTransactionImplementationTest.java | 43 +++------ .../kernel/api/KernelTransactionTestBase.java | 3 +- .../api/KernelSchemaStateFlushingTest.java | 14 +-- .../impl/api/KernelTransactionsTest.java | 58 +++++------ .../ConstraintIndexCreatorTest.java | 18 ++-- .../api/index/IndexPopulationJobTest.java | 15 ++- .../impl/api/integrationtest/KernelIT.java | 4 +- .../KernelIntegrationTest.java | 8 +- .../kernel/impl/core/ManyPropertyKeysIT.java | 5 +- .../kernel/impl/store/NeoStoresTest.java | 2 +- .../schema/IndexPopulationFlipRaceIT.java | 5 +- .../TestMigrateToDenseNodeSupport.java | 2 +- .../server/rest/domain/GraphDbHelper.java | 12 +-- .../java/upgrade/StoreMigratorFrom21IT.java | 3 +- .../StoreUpgradeIntegrationTest.java | 13 +-- 30 files changed, 208 insertions(+), 188 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelAPI.java b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelAPI.java index d308710c5bd3c..889e2fe957674 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/KernelAPI.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/KernelAPI.java @@ -28,7 +28,7 @@ * and write operations are supported as well as creating transactions. * * Changes to the graph (i.e. write operations) are performed via a - * {@link #newTransaction() transaction context} where changes done + * {@link #newTransaction(KernelTransaction.Type) transaction context} where changes done * inside the transaction are visible in read operations for {@link Statement statements} * executed within that transaction context. */ @@ -37,8 +37,10 @@ public interface KernelAPI /** * Creates and returns a new {@link KernelTransaction} capable of modifying the * underlying graph. + * + * @param type the type of the new transaction: implicit (internally created) or explicit (created by the user) */ - KernelTransaction newTransaction() throws TransactionFailureException; + KernelTransaction newTransaction( KernelTransaction.Type type ) throws TransactionFailureException; /** * Registers a {@link TransactionHook} that will receive notifications about committing transactions 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 a8750dd11a2ee..617c6808baadf 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 @@ -73,6 +73,11 @@ */ public interface KernelTransaction extends AutoCloseable { + enum Type { + implicit, + explicit + } + interface CloseListener { void notify( boolean success ); @@ -140,4 +145,14 @@ interface CloseListener * @param listener {@link CloseListener} to get these notifications. */ void registerCloseListener( CloseListener listener ); + + /** + * Kernel transaction type + * + * Implicit if created internally in the database + * Explicit if created by the end user + * + * @return the transaction type: implicit or explicit + */ + Type transactionType(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/Kernel.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/Kernel.java index c891c70dd2def..3590a58e54049 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/Kernel.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/Kernel.java @@ -81,10 +81,10 @@ public Kernel( KernelTransactions transactionFactory, } @Override - public KernelTransaction newTransaction() throws TransactionFailureException + public KernelTransaction newTransaction( KernelTransaction.Type type ) throws TransactionFailureException { health.assertHealthy( TransactionFailureException.class ); - KernelTransaction transaction = transactions.newInstance(); + KernelTransaction transaction = transactions.newInstance( type ); transactionMonitor.transactionStarted(); return transaction; } 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 7387a79d026a2..d845a314b7c1b 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 @@ -140,6 +140,7 @@ TransactionType upgradeToSchemaTransaction() throws InvalidTransactionTypeKernel private long startTimeMillis; private long lastTransactionIdWhenStarted; private TransactionEvent transactionEvent; + private Type type; public KernelTransactionImplementation( StatementOperationParts operations, SchemaWriteGuard schemaWriteGuard, @@ -173,8 +174,9 @@ public KernelTransactionImplementation( StatementOperationParts operations, /** * Reset this transaction to a vanilla state, turning it into a logically new transaction. */ - public KernelTransactionImplementation initialize( long lastCommittedTx, Locks.Client locks ) + public KernelTransactionImplementation initialize( long lastCommittedTx, Locks.Client locks, Type type ) { + this.type = type; this.locks = locks; this.closing = closed = failure = success = terminated = beforeHookInvoked = false; this.transactionType = TransactionType.READ; @@ -591,6 +593,7 @@ private void afterRollback() private void release() { locks.close(); + type = null; transactionEvent = null; legacyIndexTransactionState = null; txState = null; @@ -606,6 +609,12 @@ public void registerCloseListener( CloseListener listener ) closeListener = listener; } + @Override + public Type transactionType() + { + return type; + } + @Override public String toString() { 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 28fcf1bfad3ee..573f49afa4314 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 @@ -54,7 +54,7 @@ * for enumerating all running transactions. During normal operation, acquiring new transactions and enumerating live * ones requires no synchronization (although the live list is not guaranteed to be exact). */ -public class KernelTransactions extends LifecycleAdapter implements Factory +public class KernelTransactions extends LifecycleAdapter { // Transaction dependencies @@ -86,8 +86,7 @@ public class KernelTransactions extends LifecycleAdapter implements Factory allTransactions = newSetFromMap( - new ConcurrentHashMap<>() ); + private final Set allTransactions = newSetFromMap( new ConcurrentHashMap<>() ); public KernelTransactions( Locks locks, ConstraintIndexCreator constraintIndexCreator, @@ -141,11 +140,11 @@ public KernelTransactionImplementation newInstance() } }; - @Override - public KernelTransaction newInstance() + public KernelTransaction newInstance( KernelTransaction.Type type ) { assertDatabaseIsRunning(); - return localTxPool.acquire().initialize( transactionIdStore.getLastCommittedTransactionId(), locks.newClient() ); + return localTxPool.acquire() + .initialize( transactionIdStore.getLastCommittedTransactionId(), locks.newClient(), type ); } /** diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RemoveOrphanConstraintIndexesOnStartup.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RemoveOrphanConstraintIndexesOnStartup.java index 68ee9d8977266..c88f7942bcdca 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RemoveOrphanConstraintIndexesOnStartup.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RemoveOrphanConstraintIndexesOnStartup.java @@ -47,7 +47,7 @@ public RemoveOrphanConstraintIndexesOnStartup( KernelAPI kernel, LogProvider log public void perform() { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { for ( Iterator indexes = statement.readOperations().uniqueIndexesGetAll(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java index cf437f6cc7036..3c2292e1e418a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java @@ -60,7 +60,7 @@ public ConstraintIndexCreator( Supplier kernelSupplier, IndexingServi public long createUniquenessConstraintIndex( KernelStatement state, SchemaReadOperations schema, int labelId, int propertyKeyId ) throws ConstraintVerificationFailedKernelException, TransactionFailureException, - CreateConstraintFailureException, DropIndexFailureException + CreateConstraintFailureException, DropIndexFailureException { IndexDescriptor descriptor = createConstraintIndex( labelId, propertyKeyId ); UniquenessConstraint constraint = new UniquenessConstraint( labelId, propertyKeyId ); @@ -97,8 +97,8 @@ public long createUniquenessConstraintIndex( KernelStatement state, SchemaReadOp public void dropUniquenessConstraintIndex( IndexDescriptor descriptor ) throws TransactionFailureException, DropIndexFailureException { - try ( KernelTransaction transaction = kernelSupplier.get().newTransaction(); - Statement statement = transaction.acquireStatement() ) + try ( KernelTransaction transaction = kernelSupplier.get().newTransaction( KernelTransaction.Type.implicit ); + Statement statement = transaction.acquireStatement() ) { // NOTE: This creates the index (obviously) but it DOES NOT grab a schema // write lock. It is assumed that the transaction that invoked this "inner" transaction @@ -141,7 +141,7 @@ private void awaitIndexPopulation( UniquenessConstraint constraint, long indexId public IndexDescriptor createConstraintIndex( final int labelId, final int propertyKeyId ) { - try ( KernelTransaction transaction = kernelSupplier.get().newTransaction(); + try ( KernelTransaction transaction = kernelSupplier.get().newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { // NOTE: This creates the index (obviously) but it DOES NOT grab a schema diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/IsolatedTransactionTokenCreator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/IsolatedTransactionTokenCreator.java index cc9bcf00f7038..929926175885f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/IsolatedTransactionTokenCreator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/IsolatedTransactionTokenCreator.java @@ -39,7 +39,7 @@ public abstract class IsolatedTransactionTokenCreator implements TokenCreator private final Supplier kernelSupplier; public IsolatedTransactionTokenCreator( Supplier kernelSupplier, - IdGeneratorFactory idGeneratorFactory ) + IdGeneratorFactory idGeneratorFactory ) { this.kernelSupplier = kernelSupplier; this.idGeneratorFactory = idGeneratorFactory; @@ -49,7 +49,7 @@ public IsolatedTransactionTokenCreator( Supplier kernelSupplier, public synchronized int getOrCreate( String name ) throws org.neo4j.kernel.api.exceptions.KernelException { KernelAPI kernel = kernelSupplier.get(); - try ( KernelTransaction transaction = kernel.newTransaction() ) + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ) ) { try ( Statement statement = transaction.acquireStatement() ) { 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 ca97cf52fc896..d3a89efd5fb2a 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 @@ -157,12 +157,12 @@ public void shutdown() } @Override - public KernelTransaction beginTransaction() + public KernelTransaction beginTransaction( KernelTransaction.Type type ) { try { availability.assertDatabaseAvailable(); - KernelTransaction kernelTx = dataSource.kernelAPI.get().newTransaction(); + KernelTransaction kernelTx = dataSource.kernelAPI.get().newTransaction( type ); kernelTx.registerCloseListener( (s) -> dataSource.threadToTransactionBridge.unbindTransactionFromCurrentThread() ); dataSource.threadToTransactionBridge.bindTransactionToCurrentThread( kernelTx ); return kernelTx; 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 40643918dff15..7e3707caef8ff 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 @@ -63,7 +63,6 @@ import org.neo4j.kernel.api.index.InternalIndexState; import org.neo4j.kernel.api.legacyindex.AutoIndexing; import org.neo4j.kernel.api.properties.Property; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.api.TokenAccess; import org.neo4j.kernel.impl.api.legacyindex.InternalAutoIndexing; import org.neo4j.kernel.impl.api.operations.KeyReadOperations; @@ -89,18 +88,18 @@ import org.neo4j.storageengine.api.EntityType; import static java.lang.String.format; - import static org.neo4j.collection.primitive.PrimitiveLongCollections.map; import static org.neo4j.helpers.collection.IteratorUtil.emptyIterator; import static org.neo4j.kernel.impl.api.operations.KeyReadOperations.NO_SUCH_LABEL; import static org.neo4j.kernel.impl.api.operations.KeyReadOperations.NO_SUCH_PROPERTY_KEY; /** - * Implementation of the GraphDatabaseService/GraphDatabaseService interfaces - the "Core API". Given an {@link SPI} implementation, this provides users with + * Implementation of the GraphDatabaseService/GraphDatabaseService interfaces - the "Core API". Given an {@link SPI} + * implementation, this provides users with * a clean facade to interact with the database. */ public class GraphDatabaseFacade - implements GraphDatabaseAPI + implements GraphDatabaseAPI { private static final long MAX_NODE_ID = IdType.NODE.getMaxValue(); private static final long MAX_RELATIONSHIP_ID = IdType.RELATIONSHIP.getMaxValue(); @@ -109,21 +108,26 @@ public class GraphDatabaseFacade private IndexManager indexManager; private NodeProxy.NodeActions nodeActions; private RelationshipProxy.RelationshipActions relActions; - private Config config; private SPI spi; /** - * This is what you need to implemenent to get your very own {@link GraphDatabaseFacade}. This SPI exists as a thin layer to make it easy to provide - * alternate {@link org.neo4j.graphdb.GraphDatabaseService} instances without having to re-implement this whole API implementation. + * This is what you need to implemenent to get your very own {@link GraphDatabaseFacade}. This SPI exists as a thin + * layer to make it easy to provide + * alternate {@link org.neo4j.graphdb.GraphDatabaseService} instances without having to re-implement this whole API + * implementation. */ public interface SPI { - /** Check if database is available, waiting up to {@code timeout} if it isn't. If the timeout expires before database available, this returns false */ + /** + * Check if database is available, waiting up to {@code timeout} if it isn't. If the timeout expires before + * database available, this returns false + */ boolean databaseIsAvailable( long timeout ); DependencyResolver resolver(); StoreId storeId(); + File storeDir(); /** Eg. Neo4j Enterprise HA, Neo4j Community Standalone.. */ @@ -134,12 +138,14 @@ public interface SPI /** * Begin a new kernel transaction. If a transaction is already associated to the current context * (meaning, non-null is returned from {@link #currentTransaction()}), this should fail. + * * @throws org.neo4j.graphdb.TransactionFailureException if unable to begin, or a transaction already exists. */ - KernelTransaction beginTransaction(); + KernelTransaction beginTransaction( KernelTransaction.Type type ); /** - * Retrieve the transaction associated with the current context. For the classic implementation of the Core API, the context is the current thread. + * Retrieve the transaction associated with the current context. For the classic implementation of the Core API, + * the context is the current thread. * Must not return null, and must return the underlying transaction even if it has been terminated. * * @throws org.neo4j.graphdb.NotInTransactionException if no transaction present @@ -154,14 +160,16 @@ public interface SPI Statement currentStatement(); /** Execute a cypher statement */ - Result executeQuery( String query, Map parameters, QuerySession querySession ); + Result executeQuery( String query, Map parameters, QuerySession querySession ); AutoIndexing autoIndexing(); void registerKernelEventHandler( KernelEventHandler handler ); + void unregisterKernelEventHandler( KernelEventHandler handler ); void registerTransactionEventHandler( TransactionEventHandler handler ); + void unregisterTransactionEventHandler( TransactionEventHandler handler ); URL validateURLAccess( URL url ) throws URLAccessValidationError; @@ -174,23 +182,26 @@ public GraphDatabaseFacade() /** * Create a new Core API facade, backed by the given SPI. */ - public void init( Config config, SPI spi ) + public void init( SPI spi ) { IndexProviderImpl idxProvider = new IndexProviderImpl( this, spi::currentStatement ); this.spi = spi; - this.config = config; this.relActions = new StandardRelationshipActions( spi::currentStatement, spi::currentTransaction, - this::assertTransactionOpen, (id) -> new NodeProxy( nodeActions, id ), this ); - this.nodeActions = new StandardNodeActions( spi::currentStatement, spi::currentTransaction, this::assertTransactionOpen, relActions, this ); + this::assertTransactionOpen, ( id ) -> new NodeProxy( nodeActions, id ), this ); + this.nodeActions = + new StandardNodeActions( spi::currentStatement, spi::currentTransaction, this::assertTransactionOpen, + relActions, this ); this.schema = new SchemaImpl( spi::currentStatement ); - this.indexManager = new IndexManagerImpl( spi::currentStatement, idxProvider, - new AutoIndexerFacade( - () -> new ReadOnlyIndexFacade<>(idxProvider.getOrCreateNodeIndex( InternalAutoIndexing.NODE_AUTO_INDEX, null ) ), - spi.autoIndexing().nodes() ), - new RelationshipAutoIndexerFacade( - () -> new ReadOnlyRelationshipIndexFacade( idxProvider.getOrCreateRelationshipIndex( InternalAutoIndexing.RELATIONSHIP_AUTO_INDEX, null ) ), - spi.autoIndexing().relationships() ) ); + AutoIndexerFacade nodeAutoIndexer = new AutoIndexerFacade<>( + () -> new ReadOnlyIndexFacade<>( + idxProvider.getOrCreateNodeIndex( InternalAutoIndexing.NODE_AUTO_INDEX, null ) ), + spi.autoIndexing().nodes() ); + RelationshipAutoIndexerFacade relAutoIndexer = new RelationshipAutoIndexerFacade( + () -> new ReadOnlyRelationshipIndexFacade( idxProvider + .getOrCreateRelationshipIndex( InternalAutoIndexing.RELATIONSHIP_AUTO_INDEX, null ) ), + spi.autoIndexing().relationships() ); + this.indexManager = new IndexManagerImpl( spi::currentStatement, idxProvider, nodeAutoIndexer, relAutoIndexer ); } @Override @@ -266,14 +277,14 @@ public Relationship getRelationshipById( long id ) if ( id < 0 || id > MAX_RELATIONSHIP_ID ) { throw new NotFoundException( format( "Relationship %d not found", id ), - new EntityNotFoundException( EntityType.RELATIONSHIP, id )); + new EntityNotFoundException( EntityType.RELATIONSHIP, id ) ); } try ( Statement statement = spi.currentStatement() ) { if ( !statement.readOperations().relationshipExists( id ) ) { throw new NotFoundException( format( "Relationship %d not found", id ), - new EntityNotFoundException( EntityType.RELATIONSHIP, id )); + new EntityNotFoundException( EntityType.RELATIONSHIP, id ) ); } return new RelationshipProxy( relActions, id ); @@ -308,23 +319,28 @@ public void shutdown() @Override public Transaction beginTx() { - if( spi.isInOpenTransaction() ) + return beginTransaction( KernelTransaction.Type.explicit ); + } + + private Transaction beginTransaction( KernelTransaction.Type type ) + { + if ( spi.isInOpenTransaction() ) { return new PlaceboTransaction( spi::currentTransaction, spi::currentStatement ); } - KernelTransaction kernelTx = spi.beginTransaction(); + KernelTransaction kernelTx = spi.beginTransaction( type ); return new TopLevelTransaction( kernelTx, spi::currentStatement ); - } + } - @Override - public Result execute( String query ) throws QueryExecutionException - { - return execute( query, Collections.emptyMap() ); - } + @Override + public Result execute( String query ) throws QueryExecutionException + { + return execute( query, Collections.emptyMap() ); + } @Override - public Result execute( String query, Map parameters ) throws QueryExecutionException + public Result execute( String query, Map parameters ) throws QueryExecutionException { return spi.executeQuery( query, parameters, QueryEngineProvider.embeddedSession() ); } @@ -451,7 +467,7 @@ public ResourceIterator findNodes( final Label myLabel ) @Override public ResourceIterable findNodesByLabelAndProperty( final Label myLabel, final String key, - final Object value ) + final Object value ) { return () -> nodesByLabelAndProperty( myLabel, key, value ); } @@ -508,7 +524,7 @@ private IndexDescriptor findAnyIndexByLabelAndProperty( ReadOperations readOps, } private ResourceIterator getNodesByLabelAndPropertyWithoutIndex( int propertyId, Object value, - Statement statement, int labelId ) + Statement statement, int labelId ) { return map2nodes( new PropertyValueFilteringNodeIdIterator( @@ -528,12 +544,14 @@ private ResourceIterator allNodesWithLabel( final Label myLabel ) } final PrimitiveLongIterator nodeIds = statement.readOperations().nodesGetForLabel( labelId ); - return ResourceClosingIterator.newResourceIterator( statement, map( nodeId -> new NodeProxy( nodeActions, nodeId ), nodeIds ) ); + return ResourceClosingIterator + .newResourceIterator( statement, map( nodeId -> new NodeProxy( nodeActions, nodeId ), nodeIds ) ); } private ResourceIterator map2nodes( PrimitiveLongIterator input, Statement statement ) { - return ResourceClosingIterator.newResourceIterator( statement, map( id -> new NodeProxy( nodeActions, id ), input ) ); + return ResourceClosingIterator + .newResourceIterator( statement, map( id -> new NodeProxy( nodeActions, id ), input ) ); } @Override @@ -587,7 +605,7 @@ private static class PropertyValueFilteringNodeIdIterator extends PrimitiveLongC private final Object value; PropertyValueFilteringNodeIdIterator( PrimitiveLongIterator nodesWithLabel, ReadOperations statement, - int propertyKeyId, Object value ) + int propertyKeyId, Object value ) { this.nodesWithLabel = nodesWithLabel; this.statement = statement; @@ -623,7 +641,7 @@ protected boolean fetchNext() private void assertTransactionOpen() { - if( spi.currentTransaction().shouldBeTerminated() ) + if ( spi.currentTransaction().shouldBeTerminated() ) { throw new TransactionTerminatedException(); } 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 ecf6dad4537cc..a2fde6a3f70ee 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 @@ -48,7 +48,7 @@ *

* It is abstract in order for subclasses to specify their own {@link org.neo4j.kernel.impl.factory.EditionModule} * implementations. Subclasses also have to set the edition name - * in overriden version of {@link #newFacade(File, Map, GraphDatabaseFacadeFactory.Dependencies, GraphDatabaseFacade)}, + * in overridden version of {@link #newFacade(File, Map, GraphDatabaseFacadeFactory.Dependencies, GraphDatabaseFacade)}, * which is used for logging and similar. *

* To create test versions of databases, override an edition factory (e.g. {@link org.neo4j.kernel.impl.factory @@ -130,7 +130,7 @@ public GraphDatabaseFacade newFacade( File storeDir, Map params, CoreAPIAvailabilityGuard coreAPIAvailabilityGuard = edition.coreAPIAvailabilityGuard; // Start it - graphDatabaseFacade.init( platform.config, new ClassicCoreSPI( platform, dataSource, msgLog, coreAPIAvailabilityGuard ) ); + graphDatabaseFacade.init( new ClassicCoreSPI( platform, dataSource, msgLog, coreAPIAvailabilityGuard ) ); Throwable error = null; try diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/LegacyIndexStore.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/LegacyIndexStore.java index 634edb8176023..9b567b72ee7c2 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/LegacyIndexStore.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/LegacyIndexStore.java @@ -183,7 +183,7 @@ private Map getOrCreateIndexConfig( } // We were the first one here, let's create this config - try ( KernelTransaction transaction = kernel.get().newTransaction(); + try ( KernelTransaction transaction = kernel.get().newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { switch ( entityType ) 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 ea67054c9aefa..a55a0ef911e0e 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 @@ -49,13 +49,13 @@ class ProcedureGDBFacadeSPI implements GraphDatabaseFacade.SPI private final AutoIndexing autoIndexing; private final Supplier storeId; private final CoreAPIAvailabilityGuard availability; - private final ThrowingFunction urlValidator; + private final ThrowingFunction urlValidator; private final File storeDir; public ProcedureGDBFacadeSPI( KernelTransaction transaction, Supplier queryExecutor, - File storeDir, DependencyResolver resolver, AutoIndexing autoIndexing, - Supplier storeId, CoreAPIAvailabilityGuard availability, - ThrowingFunction urlValidator ) + File storeDir, DependencyResolver resolver, AutoIndexing autoIndexing, + Supplier storeId, CoreAPIAvailabilityGuard availability, + ThrowingFunction urlValidator ) { this.transaction = transaction; this.queryExecutor = queryExecutor; @@ -117,7 +117,7 @@ public Statement currentStatement() } @Override - public Result executeQuery( String query, Map parameters, QuerySession querySession ) + public Result executeQuery( String query, Map parameters, QuerySession querySession ) { try { @@ -173,7 +173,7 @@ public void shutdown() } @Override - public KernelTransaction beginTransaction() + public KernelTransaction beginTransaction( KernelTransaction.Type type ) { throw new UnsupportedOperationException(); } 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 0d1eb3ed1e1b3..4490971e8ddaa 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 @@ -40,14 +40,12 @@ public class ProcedureGDSFactory implements ThrowingFunction { - private final Config config; private final File storeDir; private final DependencyResolver resolver; private final Supplier storeId; private final Supplier queryExecutor; private final CoreAPIAvailabilityGuard availability; private final ThrowingFunction urlValidator; - private final AutoIndexing autoIndexing = AutoIndexing.UNSUPPORTED; public ProcedureGDSFactory( Config config, File storeDir, @@ -57,7 +55,6 @@ public ProcedureGDSFactory( Config config, CoreAPIAvailabilityGuard availability, URLAccessRule urlAccessRule ) { - this.config = config; this.storeDir = storeDir; this.resolver = resolver; this.storeId = storeId; @@ -70,10 +67,9 @@ public ProcedureGDSFactory( Config config, public GraphDatabaseService apply( CallableProcedure.Context context ) throws ProcedureException { KernelTransaction transaction = context.get( CallableProcedure.Context.KERNEL_TRANSACTION ); - GraphDatabaseFacade facade = new GraphDatabaseFacade(); - facade.init( config, new ProcedureGDBFacadeSPI( transaction, queryExecutor, storeDir, resolver, AutoIndexing.UNSUPPORTED, storeId, availability, urlValidator ) ); - + facade.init( new ProcedureGDBFacadeSPI( transaction, queryExecutor, storeDir, resolver, + AutoIndexing.UNSUPPORTED, storeId, availability, urlValidator ) ); return facade; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java index b1b0afe167116..e466f5dcb88af 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java @@ -19,9 +19,9 @@ */ package org.neo4j.kernel.api; -import org.neo4j.collection.pool.Pool; import java.util.function.Supplier; +import org.neo4j.collection.pool.Pool; import org.neo4j.helpers.Clock; import org.neo4j.kernel.impl.api.KernelTransactionImplementation; import org.neo4j.kernel.impl.api.SchemaWriteGuard; @@ -64,6 +64,6 @@ static KernelTransaction kernelTransaction() mock( Pool.class ), Clock.SYSTEM_CLOCK, TransactionTracer.NULL, - storageEngine ).initialize( 0, new NoOpClient() ); + storageEngine ).initialize( 0, new NoOpClient(), KernelTransaction.Type.implicit ); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionImplementationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionImplementationTest.java index 6d74e27cd656e..1c04144fc79c7 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionImplementationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionImplementationTest.java @@ -22,8 +22,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import java.util.Arrays; import java.util.Collection; @@ -40,6 +38,7 @@ import org.neo4j.storageengine.api.lock.ResourceLocker; import org.neo4j.test.DoubleLatch; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; @@ -51,8 +50,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import static java.util.concurrent.TimeUnit.MILLISECONDS; - @RunWith( Parameterized.class ) public class KernelTransactionImplementationTest extends KernelTransactionTestBase { @@ -301,21 +298,16 @@ public void shouldAllowTerminatingFromADifferentThread() throws Exception final KernelTransaction transaction = newTransaction(); transactionConsumer.accept( transaction ); - Thread thread = new Thread( new Runnable() - { - @Override - public void run() + Thread thread = new Thread( () -> { + try { - try - { - latch.awaitStart(); - transaction.markForTermination(); - latch.finish(); - } - catch ( Exception e ) - { - childException.exception = e; - } + latch.awaitStart(); + transaction.markForTermination(); + latch.finish(); + } + catch ( Exception e ) + { + childException.exception = e; } } ); @@ -353,15 +345,10 @@ public void shouldUseStartTimeAndTxIdFromWhenStartingTxAsHeader() throws Excepti // GIVEN a transaction starting at one point in time long startingTime = clock.currentTimeMillis(); when( legacyIndexState.hasChanges() ).thenReturn( true ); - doAnswer( new Answer() - { - @Override - public Void answer( InvocationOnMock invocation ) throws Throwable - { - Collection commands = invocation.getArgumentAt( 0, Collection.class ); - commands.add( mock( Command.class ) ); - return null; - } + doAnswer( invocation -> { + Collection commands = invocation.getArgumentAt( 0, Collection.class ); + commands.add( mock( Command.class ) ); + return null; } ).when( storageEngine ).createCommands( any( Collection.class ), any( TransactionState.class ), @@ -370,7 +357,7 @@ public Void answer( InvocationOnMock invocation ) throws Throwable try ( KernelTransactionImplementation transaction = newTransaction() ) { - transaction.initialize( 5L, mock( Locks.Client.class ) ); + transaction.initialize( 5L, mock( Locks.Client.class ), KernelTransaction.Type.implicit ); try ( KernelStatement statement = transaction.acquireStatement() ) { statement.legacyIndexTxState(); // which will pull it from the supplier and the mocking above diff --git a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionTestBase.java b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionTestBase.java index db504c4ea9342..70d3bdda5c48c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionTestBase.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionTestBase.java @@ -25,6 +25,7 @@ import org.neo4j.collection.pool.Pool; import org.neo4j.helpers.FakeClock; +import org.neo4j.kernel.api.KernelTransaction.Type; import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.txstate.LegacyIndexTransactionState; import org.neo4j.kernel.impl.api.KernelTransactionImplementation; @@ -87,7 +88,7 @@ public KernelTransactionImplementation newTransaction( long lastTransactionIdWhe { return new KernelTransactionImplementation( null, schemaWriteGuard, hooks, null, null, headerInformationFactory, commitProcess, transactionMonitor, legacyIndexStateSupplier, txPool, clock, TransactionTracer.NULL, - storageEngine ).initialize( lastTransactionIdWhenStarted, new NoOpClient() ); + storageEngine ).initialize( lastTransactionIdWhenStarted, new NoOpClient(), Type.implicit ); } public class CapturingCommitProcess implements TransactionCommitProcess diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java index eefb6cd46747b..0b9031e53ba57 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java @@ -135,7 +135,7 @@ public void shouldInvalidateSchemaStateOnDropConstraint() throws Exception private UniquenessConstraint createConstraint() throws KernelException { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { UniquenessConstraint descriptor = statement.schemaWriteOperations().uniquePropertyConstraintCreate( 1, 1 ); @@ -146,7 +146,7 @@ private UniquenessConstraint createConstraint() throws KernelException private void dropConstraint( UniquenessConstraint descriptor ) throws KernelException { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { statement.schemaWriteOperations().constraintDrop( descriptor ); @@ -156,7 +156,7 @@ private void dropConstraint( UniquenessConstraint descriptor ) throws KernelExce private IndexDescriptor createIndex() throws KernelException { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { IndexDescriptor descriptor = statement.schemaWriteOperations().indexCreate( 1, 1 ); @@ -167,7 +167,7 @@ private IndexDescriptor createIndex() throws KernelException private void dropIndex( IndexDescriptor descriptor ) throws KernelException { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { statement.schemaWriteOperations().indexDrop( descriptor ); @@ -178,7 +178,7 @@ private void dropIndex( IndexDescriptor descriptor ) throws KernelException private void awaitIndexOnline( IndexDescriptor descriptor, String keyForProbing ) throws IndexNotFoundKernelException, TransactionFailureException { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { SchemaIndexTestHelper.awaitIndexOnline( statement.readOperations(), descriptor ); @@ -189,7 +189,7 @@ private void awaitIndexOnline( IndexDescriptor descriptor, String keyForProbing private void awaitSchemaStateCleared( String keyForProbing ) throws TransactionFailureException { - try ( KernelTransaction transaction = kernel.newTransaction(); + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); Statement statement = transaction.acquireStatement() ) { while ( statement.readOperations().schemaStateGetOrCreate( keyForProbing, (ignored) -> null ) != null ) @@ -202,7 +202,7 @@ private void awaitSchemaStateCleared( String keyForProbing ) throws TransactionF private String commitToSchemaState( String key, String value ) throws TransactionFailureException { - try ( KernelTransaction transaction = kernel.newTransaction() ) + try ( KernelTransaction transaction = kernel.newTransaction( KernelTransaction.Type.implicit ) ) { String result = getOrCreateFromState( transaction, key, value ); transaction.success(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java index accd59736fbc3..58b61e917b716 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java @@ -20,10 +20,9 @@ package org.neo4j.kernel.impl.api; import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import java.util.Collection; + import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.impl.locking.Locks; @@ -58,7 +57,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - import static org.neo4j.helpers.collection.IteratorUtil.asSet; import static org.neo4j.helpers.collection.IteratorUtil.asUniqueSet; @@ -71,9 +69,9 @@ public void shouldListActiveTransactions() throws Exception KernelTransactions registry = newKernelTransactions(); // When - KernelTransaction first = registry.newInstance(); - KernelTransaction second = registry.newInstance(); - KernelTransaction third = registry.newInstance(); + KernelTransaction first = registry.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction second = registry.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction third = registry.newInstance( KernelTransaction.Type.implicit ); first.close(); @@ -89,9 +87,9 @@ public void shouldDisposeTransactionsWhenAsked() throws Exception registry.disposeAll(); - KernelTransaction first = registry.newInstance(); - KernelTransaction second = registry.newInstance(); - KernelTransaction leftOpen = registry.newInstance(); + KernelTransaction first = registry.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction second = registry.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction leftOpen = registry.newInstance( KernelTransaction.Type.implicit ); first.close(); second.close(); @@ -99,7 +97,7 @@ public void shouldDisposeTransactionsWhenAsked() throws Exception registry.disposeAll(); // Then - KernelTransaction postDispose = registry.newInstance(); + KernelTransaction postDispose = registry.newInstance( KernelTransaction.Type.implicit ); assertThat( postDispose, not( equalTo( first ) ) ); assertThat( postDispose, not( equalTo( second ) ) ); @@ -115,7 +113,7 @@ public void shouldIncludeRandomBytesInAdditionalHeader() throws Exception KernelTransactions registry = newKernelTransactions( newRememberingCommitProcess( transactionRepresentation ) ); // When - try ( KernelTransaction transaction = registry.newInstance() ) + try ( KernelTransaction transaction = registry.newInstance( KernelTransaction.Type.implicit ) ) { // Just pick anything that can flag that changes have been made to this transaction ((KernelTransactionImplementation) transaction).txState().nodeDoCreate( 0 ); @@ -133,9 +131,9 @@ public void transactionCloseRemovesTxFromActiveTransactions() throws Exception { KernelTransactions kernelTransactions = newKernelTransactions(); - KernelTransaction tx1 = kernelTransactions.newInstance(); - KernelTransaction tx2 = kernelTransactions.newInstance(); - KernelTransaction tx3 = kernelTransactions.newInstance(); + KernelTransaction tx1 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction tx2 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction tx3 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); tx1.close(); tx3.close(); @@ -148,9 +146,9 @@ public void transactionRemovesItselfFromActiveTransactions() throws Exception { KernelTransactions kernelTransactions = newKernelTransactions(); - KernelTransaction tx1 = kernelTransactions.newInstance(); - KernelTransaction tx2 = kernelTransactions.newInstance(); - KernelTransaction tx3 = kernelTransactions.newInstance(); + KernelTransaction tx1 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction tx2 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction tx3 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); tx2.close(); @@ -162,9 +160,9 @@ public void disposeAllMarksAllTransactionsForTermination() throws Exception { KernelTransactions kernelTransactions = newKernelTransactions(); - KernelTransaction tx1 = kernelTransactions.newInstance(); - KernelTransaction tx2 = kernelTransactions.newInstance(); - KernelTransaction tx3 = kernelTransactions.newInstance(); + KernelTransaction tx1 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction tx2 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); + KernelTransaction tx3 = kernelTransactions.newInstance( KernelTransaction.Type.implicit ); kernelTransactions.disposeAll(); @@ -187,25 +185,13 @@ private static KernelTransactions newKernelTransactions( TransactionCommitProces when( locks.newClient() ).thenReturn( mock( Locks.Client.class ) ); StoreReadLayer readLayer = mock( StoreReadLayer.class ); - when( readLayer.acquireStatement() ).thenAnswer( new Answer() - { - @Override - public StorageStatement answer( InvocationOnMock invocation ) throws Throwable - { - return mock( StorageStatement.class ); - } - } ); + when( readLayer.acquireStatement() ).thenAnswer( invocation -> mock( StorageStatement.class ) ); StorageEngine storageEngine = mock( StorageEngine.class ); when( storageEngine.storeReadLayer() ).thenReturn( readLayer ); - doAnswer( new Answer() - { - @Override - public Void answer( InvocationOnMock invocation ) throws Throwable - { - invocation.getArgumentAt( 0, Collection.class ).add( mock( StorageCommand.class ) ); - return null; - } + doAnswer( invocation -> { + invocation.getArgumentAt( 0, Collection.class ).add( mock( StorageCommand.class ) ); + return null; } ).when( storageEngine ).createCommands( anyCollection(), any( ReadableTransactionState.class ), diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java index b71e6d48d0fb0..caa80300445dc 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java @@ -70,9 +70,9 @@ public void shouldCreateIndexInAnotherTransaction() throws Exception StubKernel kernel = new StubKernel(); when( constraintCreationContext.schemaReadOperations().indexGetCommittedId( state, descriptor, CONSTRAINT ) ) - .thenReturn( 2468l ); + .thenReturn( 2468L ); IndexProxy indexProxy = mock( IndexProxy.class ); - when( indexingService.getIndexProxy( 2468l ) ).thenReturn( indexProxy ); + when( indexingService.getIndexProxy( 2468L ) ).thenReturn( indexProxy ); ConstraintIndexCreator creator = new ConstraintIndexCreator( () -> kernel, indexingService ); @@ -80,7 +80,7 @@ public void shouldCreateIndexInAnotherTransaction() throws Exception long indexId = creator.createUniquenessConstraintIndex( state, constraintCreationContext.schemaReadOperations(), 123, 456 ); // then - assertEquals( 2468l, indexId ); + assertEquals( 2468L, indexId ); assertEquals( 1, kernel.statements.size() ); verify( kernel.statements.get( 0 ).txState() ).constraintIndexRuleDoAdd( descriptor ); verifyNoMoreInteractions( indexCreationContext.schemaWriteOperations() ); @@ -102,9 +102,9 @@ public void shouldDropIndexIfPopulationFails() throws Exception StubKernel kernel = new StubKernel(); when( constraintCreationContext.schemaReadOperations().indexGetCommittedId( state, descriptor, CONSTRAINT ) ) - .thenReturn( 2468l ); + .thenReturn( 2468L ); IndexProxy indexProxy = mock( IndexProxy.class ); - when( indexingService.getIndexProxy( 2468l ) ).thenReturn( indexProxy ); + when( indexingService.getIndexProxy( 2468L ) ).thenReturn( indexProxy ); PreexistingIndexEntryConflictException cause = new PreexistingIndexEntryConflictException("a", 2, 1); doThrow( new IndexPopulationFailedKernelException( descriptor, "some index", cause) ) .when(indexProxy).awaitStoreScanCompleted(); @@ -160,7 +160,7 @@ public class StubKernel implements KernelAPI private final List statements = new ArrayList<>(); @Override - public KernelTransaction newTransaction() + public KernelTransaction newTransaction( KernelTransaction.Type type ) { return new KernelTransaction() { @@ -224,6 +224,12 @@ public void markForTermination() public void registerCloseListener( CloseListener listener ) { } + + @Override + public Type transactionType() + { + return null; + } }; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java index e80534a42217a..647ddefca2748 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java @@ -609,7 +609,8 @@ public void before() throws Exception stateHolder = new KernelSchemaStateStore( NullLogProvider.getInstance() ); indexStoreView = indexStoreView(); - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { labelId = statement.schemaWriteOperations().labelGetOrCreateForName( FIRST.name() ); statement.schemaWriteOperations().labelGetOrCreateForName( SECOND.name() ); @@ -661,7 +662,8 @@ private IndexPopulationJob newIndexPopulationJob( Label label, String propertyKe private IndexDescriptor indexDescriptor( Label label, String propertyKey ) throws TransactionFailureException { IndexDescriptor descriptor; - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { descriptor = new IndexDescriptor( statement.readOperations().labelGetForName( label.name() ), statement.readOperations().propertyKeyGetForName( propertyKey ) ); @@ -672,7 +674,8 @@ private IndexDescriptor indexDescriptor( Label label, String propertyKey ) throw private DoubleLongRegister indexUpdatesAndSize( Label label, String propertyKey ) throws KernelException { - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { int labelId = statement.readOperations().labelGetForName( label.name() ); int propertyKeyId = statement.readOperations().propertyKeyGetForName( propertyKey ); @@ -686,7 +689,8 @@ private DoubleLongRegister indexUpdatesAndSize( Label label, String propertyKey private DoubleLongRegister indexSample( Label label, String propertyKey ) throws KernelException { - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { DoubleLongRegister result = Registers.newDoubleLongRegister(); int labelId = statement.readOperations().labelGetForName( label.name() ); @@ -720,7 +724,8 @@ private long createNode( Map properties, Label... labels ) private int getPropertyKeyForName( String name ) throws TransactionFailureException { - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { int result = statement.readOperations().propertyKeyGetForName( name ); tx.success(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java index 54c1bda6adfa1..307edb653cb9b 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java @@ -550,10 +550,10 @@ public void shouldKillTransactionsOnShutdown() throws Throwable assumeThat(kernel, instanceOf( Kernel.class )); // Then - try ( KernelTransaction tx = kernel.newTransaction() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ) ) { ((Kernel)kernel).stop(); - tx.acquireStatement().readOperations().nodeExists( 0l ); + tx.acquireStatement().readOperations().nodeExists( 0L ); fail("Should have been terminated."); } catch(TransactionTerminatedException e) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIntegrationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIntegrationTest.java index c7cf1f72f9957..118e7b3c7f93d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIntegrationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIntegrationTest.java @@ -53,28 +53,28 @@ public abstract class KernelIntegrationTest protected TokenWriteOperations tokenWriteOperationsInNewTransaction() throws KernelException { - transaction = kernel.newTransaction(); + transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); statement = transaction.acquireStatement(); return statement.tokenWriteOperations(); } protected DataWriteOperations dataWriteOperationsInNewTransaction() throws KernelException { - transaction = kernel.newTransaction(); + transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); statement = transaction.acquireStatement(); return statement.dataWriteOperations(); } protected SchemaWriteOperations schemaWriteOperationsInNewTransaction() throws KernelException { - transaction = kernel.newTransaction(); + transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); statement = transaction.acquireStatement(); return statement.schemaWriteOperations(); } protected ReadOperations readOperationsInNewTransaction() throws TransactionFailureException { - transaction = kernel.newTransaction(); + transaction = kernel.newTransaction( KernelTransaction.Type.implicit ); statement = transaction.acquireStatement(); return statement.readOperations(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java index f841ff70522be..5aaf9faad58a9 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java @@ -158,8 +158,9 @@ private Node createNodeWithProperty( GraphDatabaseService db, String key, Object private int propertyKeyCount( GraphDatabaseAPI db ) throws TransactionFailureException { - try ( KernelTransaction tx = db.getDependencyResolver().resolveDependency( KernelAPI.class ).newTransaction(); - Statement statement = tx.acquireStatement() ) + KernelAPI kernelAPI = db.getDependencyResolver().resolveDependency( KernelAPI.class ); + try ( KernelTransaction tx = kernelAPI.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { return statement.readOperations().propertyKeyCount(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java index 845a4f6789b37..96a855640230b 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java @@ -743,7 +743,7 @@ private void initializeStores( File storeDir, Map additionalConfi private void startTx() throws TransactionFailureException { - tx = ds.getKernel().newTransaction(); + tx = ds.getKernel().newTransaction( KernelTransaction.Type.implicit ); transaction = ((KernelTransactionImplementation) tx).txState(); } diff --git a/community/neo4j/src/test/java/schema/IndexPopulationFlipRaceIT.java b/community/neo4j/src/test/java/schema/IndexPopulationFlipRaceIT.java index 833c833bf2ea9..d5ed6d91e7ca4 100644 --- a/community/neo4j/src/test/java/schema/IndexPopulationFlipRaceIT.java +++ b/community/neo4j/src/test/java/schema/IndexPopulationFlipRaceIT.java @@ -136,8 +136,9 @@ private Pair createDataThatGoesIntoToThoseIndexes( int i ) private void verifyThatThereAreExactlyOneIndexEntryPerNodeInTheIndexes( int i, Pair data ) throws Exception { - try ( KernelTransaction tx = db.getDependencyResolver().resolveDependency( KernelAPI.class ).newTransaction(); - Statement statement = tx.acquireStatement() ) + KernelAPI kernelAPI = db.getDependencyResolver().resolveDependency( KernelAPI.class ); + try ( KernelTransaction tx = kernelAPI.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { int labelAId = statement.readOperations().labelGetForName( labelA( i ).name() ); int keyAId = statement.readOperations().propertyKeyGetForName( keyA( i ) ); diff --git a/community/neo4j/src/test/java/upgrade/TestMigrateToDenseNodeSupport.java b/community/neo4j/src/test/java/upgrade/TestMigrateToDenseNodeSupport.java index e25d463751236..ef020984eb07d 100644 --- a/community/neo4j/src/test/java/upgrade/TestMigrateToDenseNodeSupport.java +++ b/community/neo4j/src/test/java/upgrade/TestMigrateToDenseNodeSupport.java @@ -223,7 +223,7 @@ private void verifyProperties( Node node ) private void verifyDenseRepresentation( GraphDatabaseService db, Node node, boolean dense ) { try ( KernelTransaction tx = ((GraphDatabaseAPI)db).getDependencyResolver() - .resolveDependency( KernelAPI.class ).newTransaction(); + .resolveDependency( KernelAPI.class ).newTransaction( KernelTransaction.Type.implicit ); Statement statement = tx.acquireStatement() ) { Cursor nodeCursor = statement.readOperations().nodeCursor( node.getId() ); diff --git a/community/server/src/test/java/org/neo4j/server/rest/domain/GraphDbHelper.java b/community/server/src/test/java/org/neo4j/server/rest/domain/GraphDbHelper.java index 5739c81ef9ea3..703ffdef03c2f 100644 --- a/community/server/src/test/java/org/neo4j/server/rest/domain/GraphDbHelper.java +++ b/community/server/src/test/java/org/neo4j/server/rest/domain/GraphDbHelper.java @@ -66,9 +66,9 @@ public GraphDbHelper( Database database ) public int getNumberOfNodes() { - try ( KernelTransaction tx = - database.getGraph().getDependencyResolver().resolveDependency( KernelAPI.class ).newTransaction(); - Statement statement = tx.acquireStatement() ) + KernelAPI kernelAPI = database.getGraph().getDependencyResolver().resolveDependency( KernelAPI.class ); + try ( KernelTransaction tx = kernelAPI.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { return Math.toIntExact( statement.readOperations().nodesGetCount() ); } @@ -80,9 +80,9 @@ public int getNumberOfNodes() public int getNumberOfRelationships() { - try ( KernelTransaction tx = - database.getGraph().getDependencyResolver().resolveDependency( KernelAPI.class ).newTransaction(); - Statement statement = tx.acquireStatement() ) + KernelAPI kernelAPI = database.getGraph().getDependencyResolver().resolveDependency( KernelAPI.class ); + try ( KernelTransaction tx = kernelAPI.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { return Math.toIntExact( statement.readOperations().relationshipsGetCount() ); } diff --git a/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java b/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java index 1d7f4ccfa43cc..6251d335cea30 100644 --- a/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java +++ b/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java @@ -158,7 +158,8 @@ public void mustMendDuplicatePropertiesWhenUpgradingFromVersion21() throws Excep // Verify that there are no two properties on the entities, that have the same key: // (This is important because the verification above cannot tell if we have two keys with the same value) KernelAPI kernel = dependencyResolver.resolveDependency( KernelAPI.class ); - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { IteratorUtil.asUniqueSet( statement.readOperations().nodeGetPropertyKeys( 0 ) ); IteratorUtil.asUniqueSet( statement.readOperations().nodeGetPropertyKeys( 1 ) ); diff --git a/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java b/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java index 93b8c16aaf81c..dcced6de34f0a 100644 --- a/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java +++ b/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.FileWriter; -import java.io.FilenameFilter; import java.io.IOException; import java.util.Arrays; import java.util.Collection; @@ -345,14 +344,7 @@ public void shouldBeAbleToUpgradeAStoreWithoutIdFilesAsBackups() throws Throwabl File dir = store.prepareDirectory( testDir.graphDbDir() ); // remove id files - File[] idFiles = dir.listFiles( new FilenameFilter() - { - @Override - public boolean accept( File dir, String name ) - { - return name.endsWith( ".id" ); - } - } ); + File[] idFiles = dir.listFiles( ( dir1, name ) -> { return name.endsWith( ".id" ); } ); for ( File idFile : idFiles ) { @@ -429,7 +421,8 @@ private static void checkInstance( Store store, GraphDatabaseAPI db ) throws Ker private static void checkIndexCounts( Store store, GraphDatabaseAPI db ) throws KernelException { KernelAPI kernel = db.getDependencyResolver().resolveDependency( KernelAPI.class ); - try ( KernelTransaction tx = kernel.newTransaction(); Statement statement = tx.acquireStatement() ) + try ( KernelTransaction tx = kernel.newTransaction( KernelTransaction.Type.implicit ); + Statement statement = tx.acquireStatement() ) { Iterator indexes = getAllIndexes( db ); DoubleLongRegister register = Registers.newDoubleLongRegister();