From b30b31043cac8a0c1faade85141bfef88bc2516d Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Mon, 26 Feb 2018 10:45:14 +0100 Subject: [PATCH] Remove availability to use token store outside transaction Having the ability to use the token store outside of a transaction makes it hard to do property level security and currently we don't really have a use case for it. So until we do it is no longer allowed. --- .../neo4j/internal/kernel/api/Session.java | 2 - .../internal/kernel/api/Transaction.java | 5 + .../kernel/api/KernelAPIReadTestBase.java | 2 +- .../api/NodeTransactionStateTestBase.java | 24 ++-- .../kernel/api/NodeWriteTestBase.java | 24 ++-- .../kernel/api/RelationshipTestSupport.java | 12 +- .../RelationshipTransactionStateTestBase.java | 30 ++--- .../org/neo4j/kernel/NeoStoreDataSource.java | 106 ++++++++++-------- .../org/neo4j/kernel/impl/api/Kernel.java | 6 +- .../api/KernelTransactionImplementation.java | 14 ++- .../kernel/impl/api/KernelTransactions.java | 10 +- .../kernel/impl/newapi/KernelSession.java | 10 +- .../neo4j/kernel/impl/newapi/KernelToken.java | 41 ++++++- .../neo4j/kernel/impl/newapi/NewKernel.java | 6 +- .../kernel/api/KernelTransactionFactory.java | 6 +- .../impl/api/KernelTransactionsTest.java | 12 +- .../impl/event/TransactionEventsIT.java | 10 +- .../impl/newapi/KernelTokenArgumentTest.java | 2 +- .../impl/newapi/OperationsLockTest.java | 2 +- 19 files changed, 186 insertions(+), 138 deletions(-) diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Session.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Session.java index c5a4b53563b4f..06b9f50a990c2 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Session.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Session.java @@ -41,8 +41,6 @@ public interface Session extends AutoCloseable */ Transaction beginTransaction( Transaction.Type type ) throws KernelException; - Token token(); - @Override void close(); } diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java index f4399ac6fdedc..77a62a2439190 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java @@ -98,6 +98,11 @@ enum Type */ TokenWrite tokenWrite(); + /** + * @return Token read and write operations + */ + Token token(); + /** * @return The schema index read operations of the graph, used for finding indexes. */ diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/KernelAPIReadTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/KernelAPIReadTestBase.java index b10526fd266ab..59779543c85ee 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/KernelAPIReadTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/KernelAPIReadTestBase.java @@ -81,7 +81,7 @@ public void setupGraph() throws IOException, KernelException session = kernel.beginSession( LoginContext.AUTH_DISABLED ); cursors = new ManagedTestCursors( kernel.cursors() ); tx = session.beginTransaction( Transaction.Type.explicit ); - token = session.token(); + token = tx.token(); read = tx.dataRead(); indexRead = tx.indexRead(); schemaRead = tx.schemaRead(); diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java index 96fdde61d5f84..744148804bb54 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java @@ -72,7 +72,7 @@ public void shouldSeeNewLabeledNodeInTransaction() throws Exception try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); tx.dataWrite().nodeAddLabel( nodeId, labelId ); try ( NodeCursor node = cursors.allocateNodeCursor() ) @@ -108,8 +108,8 @@ public void shouldSeeLabelChangesInTransaction() throws Exception try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - toRetain = session.token().labelGetOrCreateForName( toRetainName ); - toDelete = session.token().labelGetOrCreateForName( toDeleteName ); + toRetain = tx.token().labelGetOrCreateForName( toRetainName ); + toDelete = tx.token().labelGetOrCreateForName( toDeleteName ); tx.dataWrite().nodeAddLabel( nodeId, toRetain ); tx.dataWrite().nodeAddLabel( nodeId, toDelete ); tx.success(); @@ -124,7 +124,7 @@ public void shouldSeeLabelChangesInTransaction() throws Exception try ( Transaction tx = session.beginTransaction() ) { - toAdd = session.token().labelGetOrCreateForName( toAddName ); + toAdd = tx.token().labelGetOrCreateForName( toAddName ); tx.dataWrite().nodeAddLabel( nodeId, toAdd ); tx.dataWrite().nodeRemoveLabel( nodeId, toDelete ); @@ -197,8 +197,8 @@ public void shouldSeeNewNodePropertyInTransaction() throws Exception try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - int prop1 = session.token().propertyKeyGetOrCreateForName( propKey1 ); - int prop2 = session.token().propertyKeyGetOrCreateForName( propKey2 ); + int prop1 = tx.token().propertyKeyGetOrCreateForName( propKey1 ); + int prop2 = tx.token().propertyKeyGetOrCreateForName( propKey2 ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, prop1, stringValue( "hello" ) ), NO_VALUE ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, prop2, stringValue( "world" ) ), NO_VALUE ); @@ -240,7 +240,7 @@ public void shouldSeeAddedPropertyFromExistingNodeWithoutPropertiesInTransaction // When/Then try ( Transaction tx = session.beginTransaction() ) { - int propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + int propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, propToken, stringValue( "hello" ) ), NO_VALUE ); try ( NodeCursor node = cursors.allocateNodeCursor(); @@ -280,7 +280,7 @@ public void shouldSeeAddedPropertyFromExistingNodeWithPropertiesInTransaction() try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - propToken1 = session.token().propertyKeyGetOrCreateForName( propKey1 ); + propToken1 = tx.token().propertyKeyGetOrCreateForName( propKey1 ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, propToken1, stringValue( "hello" ) ), NO_VALUE ); tx.success(); } @@ -288,7 +288,7 @@ public void shouldSeeAddedPropertyFromExistingNodeWithPropertiesInTransaction() // When/Then try ( Transaction tx = session.beginTransaction() ) { - propToken2 = session.token().propertyKeyGetOrCreateForName( propKey2 ); + propToken2 = tx.token().propertyKeyGetOrCreateForName( propKey2 ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, propToken2, stringValue( "world" ) ), NO_VALUE ); try ( NodeCursor node = cursors.allocateNodeCursor(); @@ -334,7 +334,7 @@ public void shouldSeeUpdatedPropertyFromExistingNodeWithPropertiesInTransaction( try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, propToken, stringValue( "hello" ) ), NO_VALUE ); tx.success(); } @@ -380,7 +380,7 @@ public void shouldSeeRemovedPropertyInTransaction() throws Exception try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, propToken, stringValue( "hello" ) ), NO_VALUE ); tx.success(); } @@ -420,7 +420,7 @@ public void shouldSeeRemovedThenAddedPropertyInTransaction() throws Exception try ( Transaction tx = session.beginTransaction() ) { nodeId = tx.dataWrite().nodeCreate(); - propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( tx.dataWrite().nodeSetProperty( nodeId, propToken, stringValue( "hello" ) ), NO_VALUE ); tx.success(); } diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeWriteTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeWriteTestBase.java index cc31d367af27c..d7c01331141c9 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeWriteTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeWriteTestBase.java @@ -145,7 +145,7 @@ public void shouldAddLabelNode() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); tx.dataWrite().nodeAddLabel( node, labelId ); tx.success(); } @@ -172,7 +172,7 @@ public void shouldAddLabelNodeOnce() throws Exception try ( Transaction tx = session.beginTransaction() ) { - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); assertFalse( tx.dataWrite().nodeAddLabel( node, labelId ) ); tx.success(); } @@ -198,7 +198,7 @@ public void shouldRemoveLabel() throws Exception try ( Transaction tx = session.beginTransaction() ) { - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); tx.dataWrite().nodeRemoveLabel( nodeId, labelId ); tx.success(); } @@ -217,7 +217,7 @@ public void shouldNotAddLabelToNonExistingNode() throws Exception final String labelName = "Town"; try ( Transaction tx = session.beginTransaction() ) { - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); exception.expect( KernelException.class ); tx.dataWrite().nodeAddLabel( node, labelId ); } @@ -238,14 +238,14 @@ public void shouldRemoveLabelOnce() throws Exception try ( Transaction tx = session.beginTransaction() ) { - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); assertTrue( tx.dataWrite().nodeRemoveLabel( nodeId, labelId ) ); tx.success(); } try ( Transaction tx = session.beginTransaction() ) { - labelId = session.token().labelGetOrCreateForName( labelName ); + labelId = tx.token().labelGetOrCreateForName( labelName ); assertFalse( tx.dataWrite().nodeRemoveLabel( nodeId, labelId ) ); tx.success(); } @@ -271,7 +271,7 @@ public void shouldAddPropertyToNode() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - int token = session.token().propertyKeyGetOrCreateForName( propertyKey ); + int token = tx.token().propertyKeyGetOrCreateForName( propertyKey ); assertThat( tx.dataWrite().nodeSetProperty( node, token, stringValue( "hello" ) ), equalTo( NO_VALUE ) ); tx.success(); } @@ -300,7 +300,7 @@ public void shouldUpdatePropertyToNode() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - int token = session.token().propertyKeyGetOrCreateForName( propertyKey ); + int token = tx.token().propertyKeyGetOrCreateForName( propertyKey ); assertThat( tx.dataWrite().nodeSetProperty( node, token, stringValue( "hello" ) ), equalTo( intValue( 42 ) ) ); tx.success(); @@ -330,7 +330,7 @@ public void shouldRemovePropertyFromNode() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - int token = session.token().propertyKeyGetOrCreateForName( propertyKey ); + int token = tx.token().propertyKeyGetOrCreateForName( propertyKey ); assertThat( tx.dataWrite().nodeRemoveProperty( node, token ), equalTo( intValue( 42 ) ) ); tx.success(); @@ -358,7 +358,7 @@ public void shouldRemoveNonExistingPropertyFromNode() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - int token = session.token().propertyKeyGetOrCreateForName( propertyKey ); + int token = tx.token().propertyKeyGetOrCreateForName( propertyKey ); assertThat( tx.dataWrite().nodeRemoveProperty( node, token ), equalTo( NO_VALUE ) ); tx.success(); @@ -388,7 +388,7 @@ public void shouldRemovePropertyFromNodeTwice() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - int token = session.token().propertyKeyGetOrCreateForName( propertyKey ); + int token = tx.token().propertyKeyGetOrCreateForName( propertyKey ); assertThat( tx.dataWrite().nodeRemoveProperty( node, token ), equalTo( intValue( 42 ) ) ); assertThat( tx.dataWrite().nodeRemoveProperty( node, token ), @@ -418,7 +418,7 @@ public void shouldUpdatePropertyToNodeInTransaction() throws Exception // When try ( Transaction tx = session.beginTransaction() ) { - int token = session.token().propertyKeyGetOrCreateForName( propertyKey ); + int token = tx.token().propertyKeyGetOrCreateForName( propertyKey ); assertThat( tx.dataWrite().nodeSetProperty( node, token, stringValue( "hello" ) ), equalTo( NO_VALUE ) ); assertThat( tx.dataWrite().nodeSetProperty( node, token, stringValue( "world" ) ), equalTo( stringValue( "hello" ) ) ); assertThat( tx.dataWrite().nodeSetProperty( node, token, intValue( 1337 ) ), equalTo( stringValue( "world" ) ) ); diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTestSupport.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTestSupport.java index f662f60ee025e..ba5b473373d3f 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTestSupport.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTestSupport.java @@ -128,26 +128,26 @@ static StartNode dense( GraphDatabaseService graphDb ) } static Map count( - Session session, + org.neo4j.internal.kernel.api.Transaction transaction, RelationshipTraversalCursor relationship ) throws KernelException { HashMap counts = new HashMap<>(); while ( relationship.next() ) { - String key = computeKey( session, relationship ); + String key = computeKey( transaction, relationship ); counts.compute( key, ( k, value ) -> value == null ? 1 : value + 1 ); } return counts; } static void assertCount( - Session session, + org.neo4j.internal.kernel.api.Transaction transaction, RelationshipTraversalCursor relationship, Map expectedCounts, int expectedType, Direction direction ) throws KernelException { - String key = computeKey( session.token().relationshipTypeName( expectedType ), direction ); + String key = computeKey( transaction.token().relationshipTypeName( expectedType ), direction ); int expectedCount = expectedCounts.getOrDefault( key, 0 ); int count = 0; @@ -223,7 +223,7 @@ private static String computeKey( StartRelationship r ) return computeKey( r.type.name(), r.direction ); } - private static String computeKey( Session session, RelationshipTraversalCursor r ) throws KernelException + private static String computeKey( org.neo4j.internal.kernel.api.Transaction transaction, RelationshipTraversalCursor r ) throws KernelException { Direction d; if ( r.sourceNodeReference() == r.targetNodeReference() ) @@ -239,7 +239,7 @@ else if ( r.sourceNodeReference() == r.originNodeReference() ) d = Direction.INCOMING; } - return computeKey( session.token().relationshipTypeName( r.label() ), d ); + return computeKey( transaction.token().relationshipTypeName( r.label() ), d ); } static String computeKey( String type, Direction direction ) diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTransactionStateTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTransactionStateTestBase.java index 4cd4c1b87604f..5a2c3cce29dc6 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTransactionStateTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/RelationshipTransactionStateTestBase.java @@ -337,8 +337,8 @@ public void shouldSeeNewRelationshipPropertyInTransaction() throws Exception long n2 = tx.dataWrite().nodeCreate(); int label = tx.tokenWrite().relationshipTypeGetOrCreateForName( "R" ); long r = tx.dataWrite().relationshipCreate( n1, label, n2 ); - int prop1 = session.token().propertyKeyGetOrCreateForName( propKey1 ); - int prop2 = session.token().propertyKeyGetOrCreateForName( propKey2 ); + int prop1 = tx.token().propertyKeyGetOrCreateForName( propKey1 ); + int prop2 = tx.token().propertyKeyGetOrCreateForName( propKey2 ); assertEquals( tx.dataWrite().relationshipSetProperty( r, prop1, stringValue( "hello" ) ), NO_VALUE ); assertEquals( tx.dataWrite().relationshipSetProperty( r, prop2, stringValue( "world" ) ), NO_VALUE ); @@ -393,7 +393,7 @@ public void shouldSeeAddedPropertyFromExistingRelationshipWithoutPropertiesInTra // When/Then try ( Transaction tx = session.beginTransaction() ) { - int propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + int propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( tx.dataWrite().relationshipSetProperty( relationshipId, propToken, stringValue( "hello" ) ), NO_VALUE ); @@ -436,7 +436,7 @@ public void shouldSeeAddedPropertyFromExistingRelationshipWithPropertiesInTransa Write write = tx.dataWrite(); relationshipId = write.relationshipCreate( write.nodeCreate(), tx.tokenWrite().relationshipTypeGetOrCreateForName( "R" ), write.nodeCreate() ); - propToken1 = session.token().propertyKeyGetOrCreateForName( propKey1 ); + propToken1 = tx.token().propertyKeyGetOrCreateForName( propKey1 ); assertEquals( write.relationshipSetProperty( relationshipId, propToken1, stringValue( "hello" ) ), NO_VALUE ); tx.success(); @@ -445,7 +445,7 @@ public void shouldSeeAddedPropertyFromExistingRelationshipWithPropertiesInTransa // When/Then try ( Transaction tx = session.beginTransaction() ) { - propToken2 = session.token().propertyKeyGetOrCreateForName( propKey2 ); + propToken2 = tx.token().propertyKeyGetOrCreateForName( propKey2 ); assertEquals( tx.dataWrite().relationshipSetProperty( relationshipId, propToken2, stringValue( "world" ) ), NO_VALUE ); @@ -499,7 +499,7 @@ public void shouldSeeUpdatedPropertyFromExistingRelationshipWithPropertiesInTran Write write = tx.dataWrite(); relationshipId = write.relationshipCreate( write.nodeCreate(), tx.tokenWrite().relationshipTypeGetOrCreateForName( "R" ), write.nodeCreate() ); - propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( write.relationshipSetProperty( relationshipId, propToken, stringValue( "hello" ) ), NO_VALUE ); tx.success(); @@ -548,7 +548,7 @@ public void shouldNotSeeRemovedPropertyInTransaction() throws Exception Write write = tx.dataWrite(); relationshipId = write.relationshipCreate( write.nodeCreate(), tx.tokenWrite().relationshipTypeGetOrCreateForName( "R" ), write.nodeCreate() ); - propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( write.relationshipSetProperty( relationshipId, propToken, stringValue( "hello" ) ), NO_VALUE ); tx.success(); @@ -592,7 +592,7 @@ public void shouldSeeRemovedThenAddedPropertyInTransaction() throws Exception Write write = tx.dataWrite(); relationshipId = write.relationshipCreate( write.nodeCreate(), tx.tokenWrite().relationshipTypeGetOrCreateForName( "R" ), write.nodeCreate() ); - propToken = session.token().propertyKeyGetOrCreateForName( propKey ); + propToken = tx.token().propertyKeyGetOrCreateForName( propKey ); assertEquals( write.relationshipSetProperty( relationshipId, propToken, stringValue( "hello" ) ), NO_VALUE ); tx.success(); @@ -1092,7 +1092,7 @@ private void assertRelationships( RelationshipDirection direction, RelationshipG } PrimitiveLongSet set = PrimitiveLongCollections.asSet( relationships ); - for ( int i = 0; i < relationships.length; i++ ) + for ( long relationship : relationships ) { assertTrue( traversal.next() ); assertTrue( set.contains( traversal.relationshipReference() ) ); @@ -1147,7 +1147,7 @@ private void traverseWithoutGroups( RelationshipTestSupport.StartNode start, boo node.allRelationships( relationship ); } - Map counts = count( session, relationship ); + Map counts = count( tx, relationship ); // then assertCounts( expectedCounts, counts ); @@ -1194,7 +1194,7 @@ private void traverseViaGroups( RelationshipTestSupport.StartNode start, boolean } // then RelationshipTestSupport - .assertCount( session, relationship, expectedCounts, group.type(), OUTGOING ); + .assertCount( tx, relationship, expectedCounts, group.type(), OUTGOING ); // incoming if ( detached ) @@ -1207,7 +1207,7 @@ private void traverseViaGroups( RelationshipTestSupport.StartNode start, boolean } // then RelationshipTestSupport - .assertCount( session, relationship, expectedCounts, group.type(), INCOMING ); + .assertCount( tx, relationship, expectedCounts, group.type(), INCOMING ); // loops if ( detached ) @@ -1220,7 +1220,7 @@ private void traverseViaGroups( RelationshipTestSupport.StartNode start, boolean } // then RelationshipTestSupport - .assertCount( session, relationship, expectedCounts, group.type(), BOTH ); + .assertCount( tx, relationship, expectedCounts, group.type(), BOTH ); } } } @@ -1234,7 +1234,7 @@ private Map modifyStartNodeRelationships( RelationshipTestSuppor { List rs = kv.getValue(); RelationshipTestSupport.StartRelationship head = rs.get( 0 ); - int type = session.token().relationshipType( head.type.name() ); + int type = tx.token().relationshipType( head.type.name() ); switch ( head.direction ) { case INCOMING: @@ -1257,7 +1257,7 @@ private Map modifyStartNodeRelationships( RelationshipTestSuppor } String newTypeName = "NEW"; - int newType = session.token().relationshipTypeGetOrCreateForName( newTypeName ); + int newType = tx.token().relationshipTypeGetOrCreateForName( newTypeName ); tx.dataWrite().relationshipCreate( tx.dataWrite().nodeCreate(), newType, start.id ); tx.dataWrite().relationshipCreate( start.id, newType, tx.dataWrite().nodeCreate() ); tx.dataWrite().relationshipCreate( start.id, newType, start.id ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java index 651cc3dea087f..7740117725a18 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -84,7 +84,6 @@ import org.neo4j.kernel.impl.locking.StatementLocksFactory; import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.newapi.DefaultCursors; -import org.neo4j.kernel.impl.newapi.KernelToken; import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.IdController; @@ -174,33 +173,33 @@ public class NeoStoreDataSource implements Lifecycle, IndexProviders enum Diagnostics implements DiagnosticsExtractor { TRANSACTION_RANGE( "Transaction log:" ) - { - @Override - void dump( NeoStoreDataSource source, Logger log ) - { - LogFiles logFiles = source.getDependencyResolver().resolveDependency( LogFiles.class ); - try { - for ( long logVersion = logFiles.getLowestLogVersion(); - logFiles.versionExists( logVersion ); logVersion++ ) + @Override + void dump( NeoStoreDataSource source, Logger log ) { - if ( logFiles.hasAnyEntries( logVersion ) ) + LogFiles logFiles = source.getDependencyResolver().resolveDependency( LogFiles.class ); + try { - LogHeader header = logFiles.extractHeader( logVersion ); - long firstTransactionIdInThisLog = header.lastCommittedTxId + 1; - log.log( "Oldest transaction " + firstTransactionIdInThisLog + - " found in log with version " + logVersion ); - return; + for ( long logVersion = logFiles.getLowestLogVersion(); + logFiles.versionExists( logVersion ); logVersion++ ) + { + if ( logFiles.hasAnyEntries( logVersion ) ) + { + LogHeader header = logFiles.extractHeader( logVersion ); + long firstTransactionIdInThisLog = header.lastCommittedTxId + 1; + log.log( "Oldest transaction " + firstTransactionIdInThisLog + + " found in log with version " + logVersion ); + return; + } + } + log.log( "No transactions found in any log" ); + } + catch ( IOException e ) + { // It's fine, we just tried to be nice and log this. Failing is OK + log.log( "Error trying to figure out oldest transaction in log" ); } } - log.log( "No transactions found in any log" ); - } - catch ( IOException e ) - { // It's fine, we just tried to be nice and log this. Failing is OK - log.log( "Error trying to figure out oldest transaction in log" ); - } - } - }; + }; private final String message; @@ -383,12 +382,14 @@ public void start() throws IOException life.add( recoveryCleanupWorkCollector ); - AllByPrioritySelectionStrategy indexProviderSelection = new AllByPrioritySelectionStrategy<>(); + AllByPrioritySelectionStrategy indexProviderSelection = + new AllByPrioritySelectionStrategy<>(); SchemaIndexProvider defaultIndexProvider = dependencyResolver.resolveDependency( SchemaIndexProvider.class, indexProviderSelection ); schemaIndexProviderMap = - new DefaultSchemaIndexProviderMap( defaultIndexProvider, indexProviderSelection.lowerPrioritizedCandidates() ); + new DefaultSchemaIndexProviderMap( defaultIndexProvider, + indexProviderSelection.lowerPrioritizedCandidates() ); dependencies.satisfyDependency( schemaIndexProviderMap ); IndexConfigStore indexConfigStore = new IndexConfigStore( storeDir, fs ); @@ -401,15 +402,17 @@ public void start() throws IOException // Check the tail of transaction logs and validate version final LogEntryReader logEntryReader = new VersionAwareLogEntryReader<>(); - LogFiles logFiles = LogFilesBuilder.builder(storeDir, fs) - .withLogEntryReader( logEntryReader ) - .withLogFileMonitor( physicalLogMonitor ) - .withConfig( config ) - .withDependencies( dependencies ).build(); + LogFiles logFiles = LogFilesBuilder.builder( storeDir, fs ) + .withLogEntryReader( logEntryReader ) + .withLogFileMonitor( physicalLogMonitor ) + .withConfig( config ) + .withDependencies( dependencies ).build(); LogTailScanner tailScanner = new LogTailScanner( logFiles, logEntryReader, monitors, failOnCorruptedLogFiles ); - monitors.addMonitorListener( new LoggingLogTailScannerMonitor( logService.getInternalLog( LogTailScanner.class ) ) ); - monitors.addMonitorListener( new ReverseTransactionCursorLoggingMonitor( logService.getInternalLog( ReversedSingleFileTransactionCursor.class ) ) ); + monitors.addMonitorListener( + new LoggingLogTailScannerMonitor( logService.getInternalLog( LogTailScanner.class ) ) ); + monitors.addMonitorListener( new ReverseTransactionCursorLoggingMonitor( + logService.getInternalLog( ReversedSingleFileTransactionCursor.class ) ) ); LogVersionUpgradeChecker.check( tailScanner, config ); // Upgrade the store before we begin @@ -422,14 +425,17 @@ public void start() throws IOException { DatabaseSchemaState databaseSchemaState = new DatabaseSchemaState( logProvider ); - SynchronizedArrayIdOrderingQueue explicitIndexTransactionOrdering = new SynchronizedArrayIdOrderingQueue( 20 ); + SynchronizedArrayIdOrderingQueue explicitIndexTransactionOrdering = + new SynchronizedArrayIdOrderingQueue( 20 ); - Supplier transactionsSnapshotSupplier = () -> kernelModule.kernelTransactions().get(); + Supplier transactionsSnapshotSupplier = + () -> kernelModule.kernelTransactions().get(); idController.initialize( transactionsSnapshotSupplier ); storageEngine = buildStorageEngine( propertyKeyTokenHolder, labelTokens, relationshipTypeTokens, explicitIndexProviderLookup, - indexConfigStore, databaseSchemaState, explicitIndexTransactionOrdering, operationalMode, versionContextSupplier ); + indexConfigStore, databaseSchemaState, explicitIndexTransactionOrdering, operationalMode, + versionContextSupplier ); life.add( logFiles ); TransactionIdStore transactionIdStore = dependencies.resolveDependency( TransactionIdStore.class ); @@ -439,7 +445,7 @@ public void start() throws IOException LogVersionRepository logVersionRepository = dependencies.resolveDependency( LogVersionRepository.class ); NeoStoreTransactionLogModule transactionLogModule = buildTransactionLogs( logFiles, config, logProvider, scheduler, storageEngine, logEntryReader, explicitIndexTransactionOrdering, transactionIdStore ); - transactionLogModule.satisfyDependencies(dependencies); + transactionLogModule.satisfyDependencies( dependencies ); buildRecovery( fs, transactionIdStore, @@ -535,7 +541,8 @@ public void start() throws IOException databaseHealth.healed(); } - private static RecordFormats selectStoreFormats( Config config, File storeDir, PageCache pageCache, LogService logService ) + private static RecordFormats selectStoreFormats( Config config, File storeDir, PageCache pageCache, + LogService logService ) { LogProvider logging = logService.getInternalLogProvider(); RecordFormats formats = RecordFormatSelector.selectNewestFormat( config, storeDir, pageCache, logging ); @@ -570,7 +577,8 @@ private StorageEngine buildStorageEngine( labelTokens, relationshipTypeTokens, schemaState, constraintSemantics, scheduler, tokenNameLookup, lockService, schemaIndexProviderMap, indexingServiceMonitor, databaseHealth, explicitIndexProviderLookup, indexConfigStore, - explicitIndexTransactionOrdering, idGeneratorFactory, idController, monitors, recoveryCleanupWorkCollector, + explicitIndexTransactionOrdering, idGeneratorFactory, idController, monitors, + recoveryCleanupWorkCollector, operationalMode, versionContextSupplier ); // We pretend that the storage engine abstract hides all details within it. Whereas that's mostly @@ -592,7 +600,8 @@ private NeoStoreTransactionLogModule buildTransactionLogs( LogFiles logFiles, Co config.augmentDefaults( GraphDatabaseSettings.keep_logical_logs, "1 files" ); } - final LogPruning logPruning = new LogPruningImpl( fs, logFiles, logProvider, new LogPruneStrategyFactory(), clock, config ); + final LogPruning logPruning = + new LogPruningImpl( fs, logFiles, logProvider, new LogPruneStrategyFactory(), clock, config ); final LogRotation logRotation = new LogRotationImpl( monitors.newMonitor( LogRotation.Monitor.class ), logFiles, databaseHealth ); @@ -642,7 +651,8 @@ private void buildRecovery( life.add( recovery ); } - private NeoStoreKernelModule buildKernel( LogFiles logFiles, TransactionAppender appender, IndexingService indexingService, + private NeoStoreKernelModule buildKernel( LogFiles logFiles, TransactionAppender appender, + IndexingService indexingService, StoreReadLayer storeLayer, DatabaseSchemaState databaseSchemaState, LabelScanStore labelScanStore, StorageEngine storageEngine, IndexConfigStore indexConfigStore, TransactionIdStore transactionIdStore, AvailabilityGuard availabilityGuard, SystemNanoClock clock, PropertyAccessor propertyAccessor ) @@ -667,22 +677,22 @@ private NeoStoreKernelModule buildKernel( LogFiles logFiles, TransactionAppender StatementOperationParts statementOperationParts = dependencies.satisfyDependency( buildStatementOperations( storeLayer, autoIndexing, - constraintIndexCreator, databaseSchemaState, explicitIndexStore, cpuClockRef, heapAllocationRef ) ); + constraintIndexCreator, databaseSchemaState, explicitIndexStore, cpuClockRef, + heapAllocationRef ) ); TransactionHooks hooks = new TransactionHooks(); - KernelToken token = new KernelToken( storageEngine.storeReadLayer() ); KernelTransactions kernelTransactions = life.add( new KernelTransactions( statementLocksFactory, constraintIndexCreator, statementOperationParts, schemaWriteGuard, transactionHeaderInformationFactory, transactionCommitProcess, indexConfigStore, explicitIndexProviderLookup, hooks, transactionMonitor, availabilityGuard, tracers, storageEngine, procedures, transactionIdStore, clock, - cpuClockRef, heapAllocationRef, accessCapability, token, DefaultCursors::new, autoIndexing, - explicitIndexStore, versionContextSupplier ) ); + cpuClockRef, heapAllocationRef, accessCapability, DefaultCursors::new, autoIndexing, + explicitIndexStore, versionContextSupplier ) ); buildTransactionMonitor( kernelTransactions, clock, config ); final Kernel kernel = new Kernel( kernelTransactions, hooks, databaseHealth, transactionMonitor, procedures, - config, storageEngine, token ); + config, storageEngine ); kernel.registerTransactionHook( transactionEventHandlers ); life.add( kernel ); @@ -839,7 +849,8 @@ public DependencyResolver getDependencyResolver() private StatementOperationParts buildStatementOperations( StoreReadLayer storeReadLayer, AutoIndexing autoIndexing, ConstraintIndexCreator constraintIndexCreator, DatabaseSchemaState databaseSchemaState, - ExplicitIndexStore explicitIndexStore, AtomicReference cpuClockRef, AtomicReference heapAllocationRef ) + ExplicitIndexStore explicitIndexStore, AtomicReference cpuClockRef, + AtomicReference heapAllocationRef ) { // The passed in StoreReadLayer is the bottom most layer: Read-access to committed data. // To it we add: @@ -856,7 +867,8 @@ private StatementOperationParts buildStatementOperations( StoreReadLayer storeRe stateHandlingContext, queryRegistrationOperations ); // + Constraints ConstraintEnforcingEntityOperations constraintEnforcingEntityOperations = - new ConstraintEnforcingEntityOperations( constraintSemantics, parts.entityWriteOperations(), parts.entityReadOperations(), + new ConstraintEnforcingEntityOperations( constraintSemantics, parts.entityWriteOperations(), + parts.entityReadOperations(), parts.schemaWriteOperations(), parts.schemaReadOperations() ); // + Data integrity DataIntegrityValidatingStatementOperations dataIntegrityContext = 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 b3ff8817b5930..229360364a6cb 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 @@ -34,7 +34,6 @@ import org.neo4j.kernel.api.proc.CallableUserAggregationFunction; import org.neo4j.kernel.api.proc.CallableUserFunction; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.newapi.KernelToken; import org.neo4j.kernel.impl.newapi.NewKernel; import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.transaction.TransactionMonitor; @@ -80,8 +79,7 @@ public class Kernel extends LifecycleAdapter implements InwardKernel private final NewKernel newKernel; public Kernel( KernelTransactions transactionFactory, TransactionHooks hooks, DatabaseHealth health, - TransactionMonitor transactionMonitor, Procedures procedures, Config config, StorageEngine engine, - KernelToken token ) + TransactionMonitor transactionMonitor, Procedures procedures, Config config, StorageEngine engine ) { this.transactions = transactionFactory; this.hooks = hooks; @@ -89,7 +87,7 @@ public Kernel( KernelTransactions transactionFactory, TransactionHooks hooks, Da this.transactionMonitor = transactionMonitor; this.procedures = procedures; this.config = config; - this.newKernel = new NewKernel( engine, token, this ); + this.newKernel = new NewKernel( engine, this ); } @Override 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 9ed1a77155afc..ec15d0abe3f06 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 @@ -44,6 +44,7 @@ import org.neo4j.internal.kernel.api.RelationshipScanCursor; import org.neo4j.internal.kernel.api.SchemaRead; import org.neo4j.internal.kernel.api.SchemaWrite; +import org.neo4j.internal.kernel.api.Token; import org.neo4j.internal.kernel.api.TokenRead; import org.neo4j.internal.kernel.api.TokenWrite; import org.neo4j.internal.kernel.api.Write; @@ -182,7 +183,7 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati TransactionMonitor transactionMonitor, Supplier explicitIndexTxStateSupplier, Pool pool, Clock clock, AtomicReference cpuClockRef, AtomicReference heapAllocationRef, TransactionTracer transactionTracer, LockTracer lockTracer, PageCursorTracerSupplier cursorTracerSupplier, - StorageEngine storageEngine, AccessCapability accessCapability, KernelToken token, DefaultCursors cursors, AutoIndexing autoIndexing, + StorageEngine storageEngine, AccessCapability accessCapability, DefaultCursors cursors, AutoIndexing autoIndexing, ExplicitIndexStore explicitIndexStore, VersionContextSupplier versionContextSupplier ) { this.statementOperations = statementOperations; @@ -214,7 +215,7 @@ procedures, accessCapability, lockTracer, statementOperations, new ClockContext( allStoreHolder, new IndexTxStateUpdater( storageEngine.storeReadLayer(), allStoreHolder ), storageStatement, - this, token, cursors, autoIndexing ); + this, new KernelToken( storeLayer, this ), cursors, autoIndexing ); } /** @@ -744,6 +745,15 @@ public TokenWrite tokenWrite() return operations.token(); } + @Override + public Token token() + { + currentStatement.assertAllows( AccessMode::allowsTokenCreates, "Token create" ); + accessCapability.assertCanWrite(); + + return operations.token(); + } + @Override public TokenRead tokenRead() { 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 8e78fe8f5591c..8e19b68559123 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 @@ -48,7 +48,6 @@ import org.neo4j.kernel.impl.locking.StatementLocks; import org.neo4j.kernel.impl.locking.StatementLocksFactory; import org.neo4j.kernel.impl.newapi.DefaultCursors; -import org.neo4j.kernel.impl.newapi.KernelToken; import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.store.TransactionId; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; @@ -97,7 +96,6 @@ public class KernelTransactions extends LifecycleAdapter implements Supplier cursorsSupplier; - private final KernelToken token; private final AutoIndexing autoIndexing; private final ExplicitIndexStore explicitIndexStore; @@ -138,7 +136,7 @@ public KernelTransactions( StatementLocksFactory statementLocksFactory, StorageEngine storageEngine, Procedures procedures, TransactionIdStore transactionIdStore, SystemNanoClock clock, AtomicReference cpuClockRef, AtomicReference heapAllocationRef, AccessCapability accessCapability, - KernelToken token, Supplier cursorsSupplier, + Supplier cursorsSupplier, AutoIndexing autoIndexing, ExplicitIndexStore explicitIndexStore, VersionContextSupplier versionContextSupplier ) { @@ -167,7 +165,6 @@ public KernelTransactions( StatementLocksFactory statementLocksFactory, this.clock = clock; doBlockNewTransactions(); this.cursorsSupplier = cursorsSupplier; - this.token = token; } public Supplier explicitIndexTxStateSupplier() @@ -178,7 +175,8 @@ public Supplier explicitIndexTxStateSupplier() public KernelTransaction newInstance( KernelTransaction.Type type, LoginContext loginContext, long timeout ) { assertCurrentThreadIsNotBlockingNewTransactions(); - SecurityContext securityContext = loginContext.authorize( token ); + SecurityContext securityContext = loginContext.authorize( (p) -> storageEngine + .storeReadLayer().propertyKeyGetOrCreateForName( p ) ); try { while ( !newTransactionsLock.readLock().tryLock( 1, TimeUnit.SECONDS ) ) @@ -362,7 +360,7 @@ public KernelTransactionImplementation newInstance() constraintIndexCreator, procedures, transactionHeaderInformationFactory, transactionCommitProcess, transactionMonitor, explicitIndexTxStateSupplier, localTxPool, clock, cpuClockRef, heapAllocationRef, tracers.transactionTracer, tracers.lockTracer, - tracers.pageCursorTracerSupplier, storageEngine, accessCapability, token, + tracers.pageCursorTracerSupplier, storageEngine, accessCapability, cursorsSupplier.get(), autoIndexing, explicitIndexStore, versionContextSupplier ); this.transactions.add( tx ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelSession.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelSession.java index 23436c5794dbf..a9bbd07d17c1b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelSession.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelSession.java @@ -33,13 +33,11 @@ class KernelSession implements Session { private final InwardKernel kernel; private final LoginContext loginContext; - private final KernelToken token; - KernelSession( KernelToken token, InwardKernel kernel, LoginContext loginContext ) + KernelSession( InwardKernel kernel, LoginContext loginContext ) { this.kernel = kernel; this.loginContext = loginContext; - this.token = token; } @Override @@ -54,12 +52,6 @@ public Transaction beginTransaction( KernelTransaction.Type type ) throws Kernel return kernel.newTransaction( type, loginContext ); } - @Override - public KernelToken token() - { - return token; - } - @Override public void close() { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java index 4ee98cba32144..5b1493d17d910 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/KernelToken.java @@ -19,21 +19,29 @@ */ package org.neo4j.kernel.impl.newapi; +import java.util.Iterator; + +import org.neo4j.helpers.collection.Iterators; +import org.neo4j.internal.kernel.api.NamedToken; import org.neo4j.internal.kernel.api.Token; import org.neo4j.internal.kernel.api.exceptions.LabelNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.schema.IllegalTokenNameException; import org.neo4j.internal.kernel.api.exceptions.schema.TooManyLabelsException; +import org.neo4j.internal.kernel.api.security.AccessMode; import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException; +import org.neo4j.kernel.impl.api.KernelTransactionImplementation; import org.neo4j.storageengine.api.StoreReadLayer; public class KernelToken implements Token { private final StoreReadLayer store; + private final KernelTransactionImplementation ktx; - public KernelToken( StoreReadLayer store ) + public KernelToken( StoreReadLayer store, KernelTransactionImplementation ktx ) { this.store = store; + this.ktx = ktx; } @Override @@ -45,51 +53,82 @@ public int labelGetOrCreateForName( String labelName ) throws IllegalTokenNameEx @Override public int propertyKeyGetOrCreateForName( String propertyKeyName ) throws IllegalTokenNameException { + ktx.assertOpen(); return store.propertyKeyGetOrCreateForName( checkValidTokenName( propertyKeyName ) ); } @Override public int relationshipTypeGetOrCreateForName( String relationshipTypeName ) throws IllegalTokenNameException { + ktx.assertOpen(); return store.relationshipTypeGetOrCreateForName( checkValidTokenName( relationshipTypeName ) ); } @Override public String nodeLabelName( int labelId ) throws LabelNotFoundKernelException { + ktx.assertOpen(); return store.labelGetName( labelId ); } @Override public int nodeLabel( String name ) { + ktx.assertOpen(); return store.labelGetForName( name ); } @Override public int relationshipType( String name ) { + ktx.assertOpen(); return store.relationshipTypeGetForName( name ); } @Override public String relationshipTypeName( int relationshipTypeId ) throws RelationshipTypeIdNotFoundKernelException { + ktx.assertOpen(); return store.relationshipTypeGetName( relationshipTypeId ); } @Override public int propertyKey( String name ) { + ktx.assertOpen(); return store.propertyKeyGetForName( name ); } @Override public String propertyKeyName( int propertyKeyId ) throws PropertyKeyIdNotFoundKernelException { + ktx.assertOpen(); return store.propertyKeyGetName( propertyKeyId ); } + @Override + public Iterator labelsGetAllTokens() + { + ktx.assertOpen(); + return store.labelsGetAllTokens(); + } + + @Override + public Iterator propertyKeyGetAllTokens() + { + ktx.assertOpen(); + AccessMode mode = ktx.securityContext().mode(); + return Iterators.stream( store.propertyKeyGetAllTokens() ). + filter( propKey -> mode.allowsPropertyReads( propKey.id() ) ).iterator(); + } + + @Override + public Iterator relationshipTypesGetAllTokens() + { + ktx.assertOpen(); + return store.relationshipTypeGetAllTokens(); + } + private String checkValidTokenName( String name ) throws IllegalTokenNameException { if ( name == null || name.isEmpty() ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java index 5908f20d71da0..f6c1a95c06a1e 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java @@ -34,7 +34,6 @@ public class NewKernel implements Kernel, Modes { private final StorageEngine engine; - private final KernelToken token; private final InwardKernel kernel; private StorageStatement statement; @@ -42,10 +41,9 @@ public class NewKernel implements Kernel, Modes private volatile boolean isRunning; - public NewKernel( StorageEngine engine, KernelToken token, InwardKernel kernel ) + public NewKernel( StorageEngine engine, InwardKernel kernel ) { this.engine = engine; - this.token = token; this.kernel = kernel; this.isRunning = false; } @@ -61,7 +59,7 @@ public CursorFactory cursors() public KernelSession beginSession( LoginContext loginContext ) { assert isRunning : "kernel is not running, so it is not possible to use it"; - return new KernelSession( token, kernel, loginContext ); + return new KernelSession( kernel, loginContext ); } @Override 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 34635ad85d461..224d244034df2 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 @@ -23,7 +23,6 @@ import java.util.function.Supplier; import org.neo4j.collection.pool.Pool; -import org.neo4j.internal.kernel.api.Token; import org.neo4j.internal.kernel.api.security.LoginContext; import org.neo4j.io.pagecache.tracing.cursor.PageCursorTracerSupplier; import org.neo4j.io.pagecache.tracing.cursor.context.EmptyVersionContextSupplier; @@ -42,7 +41,6 @@ import org.neo4j.kernel.impl.locking.SimpleStatementLocks; import org.neo4j.kernel.impl.locking.StatementLocks; import org.neo4j.kernel.impl.newapi.DefaultCursors; -import org.neo4j.kernel.impl.newapi.KernelToken; import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; import org.neo4j.kernel.impl.transaction.TransactionMonitor; @@ -103,12 +101,12 @@ static Instances kernelTransactionWithInternals( LoginContext loginContext ) Clocks.systemClock(), new AtomicReference<>( CpuClock.NOT_AVAILABLE ), new AtomicReference<>( HeapAllocation.NOT_AVAILABLE ), NULL, LockTracer.NONE, PageCursorTracerSupplier.NULL, - storageEngine, new CanWrite(), new KernelToken( storeReadLayer ), new DefaultCursors(), AutoIndexing.UNSUPPORTED, + storageEngine, new CanWrite(), new DefaultCursors(), AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class), EmptyVersionContextSupplier.EMPTY ); StatementLocks statementLocks = new SimpleStatementLocks( new NoOpClient() ); - transaction.initialize( 0, 0, statementLocks, KernelTransaction.Type.implicit, loginContext.authorize( mock( Token.class ) ), 0L, 1L ); + transaction.initialize( 0, 0, statementLocks, KernelTransaction.Type.implicit, loginContext.authorize( (s) -> -1 ), 0L, 1L ); return new Instances( transaction, storageEngine, storeReadLayer, storageStatement ); } 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 a7676e18ac153..ae3fd67d8cec1 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 @@ -55,7 +55,6 @@ import org.neo4j.kernel.impl.locking.SimpleStatementLocksFactory; import org.neo4j.kernel.impl.locking.StatementLocksFactory; import org.neo4j.kernel.impl.newapi.DefaultCursors; -import org.neo4j.kernel.impl.newapi.KernelToken; import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.store.TransactionId; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; @@ -586,10 +585,11 @@ private static KernelTransactions createTransactions( StorageEngine storageEngin StatementLocksFactory statementLocksFactory, StatementOperationParts statementOperations, SystemNanoClock clock, AvailabilityGuard availabilityGuard ) { - return new KernelTransactions( statementLocksFactory, null, statementOperations, null, DEFAULT, commitProcess, null, null, new TransactionHooks(), + return new KernelTransactions( statementLocksFactory, null, statementOperations, + null, DEFAULT, commitProcess, null, null, new TransactionHooks(), mock( TransactionMonitor.class ), availabilityGuard, tracers, storageEngine, new Procedures(), transactionIdStore, clock, new AtomicReference<>( CpuClock.NOT_AVAILABLE ), new AtomicReference<>( HeapAllocation.NOT_AVAILABLE ), new CanWrite(), - new KernelToken( storageEngine.storeReadLayer() ), DefaultCursors::new, AutoIndexing.UNSUPPORTED, + DefaultCursors::new, AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY ); } @@ -602,7 +602,7 @@ private static TestKernelTransactions createTestTransactions( StorageEngine stor null, DEFAULT, commitProcess, null, null, new TransactionHooks(), mock( TransactionMonitor.class ), availabilityGuard, tracers, storageEngine, new Procedures(), transactionIdStore, clock, - new CanWrite(), new KernelToken( storageEngine.storeReadLayer() ), DefaultCursors::new, + new CanWrite(), DefaultCursors::new, AutoIndexing.UNSUPPORTED, EmptyVersionContextSupplier.EMPTY ); } @@ -652,13 +652,13 @@ private static class TestKernelTransactions extends KernelTransactions ExplicitIndexProviderLookup explicitIndexProviderLookup, TransactionHooks hooks, TransactionMonitor transactionMonitor, AvailabilityGuard availabilityGuard, Tracers tracers, StorageEngine storageEngine, Procedures procedures, TransactionIdStore transactionIdStore, SystemNanoClock clock, - AccessCapability accessCapability, KernelToken token, Supplier cursors, + AccessCapability accessCapability, Supplier cursors, AutoIndexing autoIndexing, VersionContextSupplier versionContextSupplier ) { super( statementLocksFactory, constraintIndexCreator, statementOperations, schemaWriteGuard, txHeaderFactory, transactionCommitProcess, indexConfigStore, explicitIndexProviderLookup, hooks, transactionMonitor, availabilityGuard, tracers, storageEngine, procedures, transactionIdStore, clock, new AtomicReference<>( CpuClock.NOT_AVAILABLE ), new AtomicReference<>( HeapAllocation.NOT_AVAILABLE ), - accessCapability, token, cursors, autoIndexing, mock( ExplicitIndexStore.class ), versionContextSupplier ); + accessCapability, cursors, autoIndexing, mock( ExplicitIndexStore.class ), versionContextSupplier ); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/event/TransactionEventsIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/event/TransactionEventsIT.java index e795f05764dc7..23ff037ed9df2 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/event/TransactionEventsIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/event/TransactionEventsIT.java @@ -35,6 +35,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.function.Function; import org.neo4j.concurrent.BinaryLatch; import org.neo4j.graphdb.GraphDatabaseService; @@ -46,14 +47,13 @@ import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.event.TransactionData; import org.neo4j.graphdb.event.TransactionEventHandler; -import org.neo4j.internal.kernel.api.Token; +import org.neo4j.internal.kernel.api.security.AccessMode; +import org.neo4j.internal.kernel.api.security.AuthSubject; import org.neo4j.internal.kernel.api.security.LoginContext; +import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.Statement; -import org.neo4j.internal.kernel.api.security.AccessMode; import org.neo4j.kernel.api.security.AnonymousContext; -import org.neo4j.internal.kernel.api.security.AuthSubject; -import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge; import org.neo4j.test.mockito.matcher.RootCauseMatcher; import org.neo4j.test.rule.DatabaseRule; @@ -197,7 +197,7 @@ public AuthSubject subject() } @Override - public SecurityContext authorize( Token token ) + public SecurityContext authorize(Function tokenLookup ) { return new SecurityContext( subject, AccessMode.Static.WRITE ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/KernelTokenArgumentTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/KernelTokenArgumentTest.java index cebd486373e58..c6da80208cb8b 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/KernelTokenArgumentTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/KernelTokenArgumentTest.java @@ -31,7 +31,7 @@ public class KernelTokenArgumentTest { - private KernelToken token = new KernelToken( mock( StoreReadLayer.class ) ); + private KernelToken token = new KernelToken( mock( StoreReadLayer.class ), ktx ); @Test public void labelGetOrCreateForName() diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java index 9dfbbbb81e7d7..fad4b25328888 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java @@ -117,7 +117,7 @@ public void setUp() throws InvalidTransactionTypeKernelException allStoreHolder = new AllStoreHolder( engine, store, transaction, cursors, mock( ExplicitIndexStore.class ) ); operations = new Operations( allStoreHolder, mock( IndexTxStateUpdater.class ), - store, transaction, new KernelToken( storeReadLayer ), cursors, autoindexing ); + store, transaction, new KernelToken( storeReadLayer, ktx ), cursors, autoindexing ); operations.initialize(); this.order = inOrder( locks, txState, storeReadLayer );