From bd3a70f08bc8bf9b8e1bd14655ef62748f085260 Mon Sep 17 00:00:00 2001 From: Anton Persson Date: Wed, 6 Jul 2016 10:11:05 +0200 Subject: [PATCH] Tests investigating deferring locks together with schema changes --- .../kernel/impl/locking/DeferringLocksIT.java | 131 +++++++++++++++--- 1 file changed, 108 insertions(+), 23 deletions(-) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/locking/DeferringLocksIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/locking/DeferringLocksIT.java index 7c1b902a18ed1..4350716329d19 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/locking/DeferringLocksIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/locking/DeferringLocksIT.java @@ -198,46 +198,131 @@ public Void doWork( Void state ) throws Exception } @Test - public void createIndexCreateNode() throws Exception + public void nodeAddedToIndexOnCommit() throws Exception { // GIVEN final Label label = DynamicLabel.label( "label" ); + final String key = "key"; // WHEN try ( Transaction tx = db.beginTx() ) { Node node = db.createNode( label ); - node.setProperty( "key", true ); + node.setProperty( key, true ); - t2.execute( new WorkerCommand() - { - @Override - public Void doWork( Void state ) throws Exception - { - try ( Transaction tx = db.beginTx() ) - { - db.schema().indexFor( label ).on( "key" ).create(); - tx.success(); - } - try ( Transaction tx = db.beginTx() ) { - db.schema().awaitIndexesOnline( 1, TimeUnit.MINUTES ); - } - return null; - } - } ).get(); + t2.execute( createAndAwaitIndex( label, key ) ).get(); tx.success(); } // THEN + assertInTxNodeWith( label, key, true ); + } + + @Test + public void ownChangesAddedToOwnIndex() throws Exception + { + // GIVEN + final Label label = DynamicLabel.label( "label" ); + final String key = "key"; + + // WHEN + try ( Transaction tx = db.beginTx() ) + { + Node node = db.createNode( label ); + node.setProperty( key, true ); + + db.schema().indexFor( label ).on( key ).create(); + + assertNodeWith( label, key, true ); + + tx.success(); + } + + assertInTxNodeWith( label, key, true ); + } + + @Test + public void readOwnChangesFromRacingIndex() throws Exception + { + // GIVEN + final Label label = DynamicLabel.label( "label" ); + final String key = "key"; + final boolean value = true; + + // WHEN + try ( Transaction tx = db.beginTx() ) + { + Node node = db.createNode( label ); + node.setProperty( key, value ); + + t2.execute( createAndAwaitIndex( label, key ) ).get(); + + assertNodeWith( label, key, value ); + + tx.success(); + } + + assertInTxNodeWith( label, key, value ); + } + + @Test + public void readOwnChangesWithoutIndex() throws Exception + { + // GIVEN + final Label label = DynamicLabel.label( "label" ); + final String key = "key"; + final boolean value = true; + + // WHEN try ( Transaction tx = db.beginTx() ) { - ResourceIterator nodes = db.findNodes( label, "key", true ); - assertTrue( nodes.hasNext() ); - Node node = nodes.next(); - assertTrue( node.hasLabel( label ) ); - assertTrue( (Boolean) node.getProperty( "key" ) ); + Node node = db.createNode( label ); + node.setProperty( key, value ); + + assertNodeWith( label, key, value ); + tx.success(); } + + assertInTxNodeWith( label, key, value ); + } + + void assertInTxNodeWith( Label label, String key, boolean value ) + { + try ( Transaction tx = db.beginTx() ) + { + assertNodeWith( label, key, value ); + tx.success(); + } + } + + void assertNodeWith( Label label, String key, boolean value ) + { + ResourceIterator nodes = db.findNodes( label, key, value ); + assertTrue( nodes.hasNext() ); + Node foundNode = nodes.next(); + assertTrue( foundNode.hasLabel( label ) ); + assertTrue( (Boolean) foundNode.getProperty( key ) ); + } + + WorkerCommand createAndAwaitIndex( final Label label, final String key ) + { + return new WorkerCommand() + { + @Override + public Void doWork( Void state ) throws Exception + { + try ( Transaction tx = db.beginTx() ) + { + db.schema().indexFor( label ).on( key ).create(); + tx.success(); + } + try ( Transaction tx = db.beginTx() ) { + db.schema().awaitIndexesOnline( 1, TimeUnit.MINUTES ); + } + return null; + } + }; } }