diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/ExecutingQuery.java b/community/kernel/src/main/java/org/neo4j/kernel/api/ExecutingQuery.java index 2b3eea4a121bc..16f233519b597 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/ExecutingQuery.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/ExecutingQuery.java @@ -19,13 +19,17 @@ */ package org.neo4j.kernel.api; +import org.apache.commons.lang3.builder.ToStringBuilder; + import java.util.Map; import java.util.concurrent.atomic.AtomicLongFieldUpdater; import java.util.function.LongSupplier; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import org.neo4j.kernel.api.query.*; +import org.neo4j.kernel.api.query.ExecutingQueryStatus; +import org.neo4j.kernel.api.query.PlannerInfo; +import org.neo4j.kernel.api.query.QueryInfo; +import org.neo4j.kernel.api.query.SimpleState; +import org.neo4j.kernel.api.query.WaitingOnLockEvent; import org.neo4j.kernel.impl.locking.ActiveLock; import org.neo4j.kernel.impl.locking.LockTracer; import org.neo4j.kernel.impl.locking.LockWaitEvent; @@ -138,6 +142,16 @@ public ClientConnectionInfo clientConnection() return clientConnection; } + public SystemNanoClock clock() + { + return clock; + } + + public ExecutingQueryStatus executingQueryStatus() + { + return status; + } + public QueryInfo query() { return status.isPlanning() // read barrier - must be first @@ -226,35 +240,19 @@ private LockWaitEvent waitForLock( boolean exclusive, ResourceType resourceType, WaitingOnLockEvent event = new WaitingOnLockEvent( exclusive ? ActiveLock.EXCLUSIVE_MODE : ActiveLock.SHARED_MODE, resourceType, - resourceIds ); + resourceIds, + this); status = event; return event; } - private class WaitingOnLockEvent extends WaitingOnLock implements LockWaitEvent + public void closeWaitingOnLockEvent( WaitingOnLockEvent waitingOnLockEvent ) { - private final ExecutingQueryStatus previous = status; - - WaitingOnLockEvent( String mode, ResourceType resourceType, long[] resourceIds ) - { - super( mode, resourceType, resourceIds, clock.nanos() ); - } - - @Override - public void close() - { - if ( status != this ) - { - return; // already closed - } - WAIT_TIME.addAndGet( ExecutingQuery.this, waitTimeNanos( clock ) ); - status = previous; - } - - @Override - public boolean isPlanning() + if ( status != waitingOnLockEvent ) { - return previous.isPlanning(); + return; // already closed } + WAIT_TIME.addAndGet( this, waitingOnLockEvent.waitTimeNanos( clock ) ); + status = waitingOnLockEvent.previousStatus(); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/query/WaitingOnLockEvent.java b/community/kernel/src/main/java/org/neo4j/kernel/api/query/WaitingOnLockEvent.java new file mode 100644 index 0000000000000..2a529d9e000a1 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/query/WaitingOnLockEvent.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2017 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.api.query; + +import org.neo4j.kernel.api.ExecutingQuery; +import org.neo4j.kernel.impl.locking.LockWaitEvent; +import org.neo4j.storageengine.api.lock.ResourceType; + +public class WaitingOnLockEvent extends WaitingOnLock implements LockWaitEvent +{ + private final ExecutingQueryStatus previous; + private final ExecutingQuery executingQuery; + + public WaitingOnLockEvent( + String mode, + ResourceType resourceType, + long[] resourceIds, + ExecutingQuery executingQuery ) + { + super( mode, resourceType, resourceIds, executingQuery.clock().nanos() ); + this.executingQuery = executingQuery; + this.previous = executingQuery.executingQueryStatus(); + } + + public ExecutingQueryStatus previousStatus() + { + return previous; + } + + @Override + public void close() + { + executingQuery.closeWaitingOnLockEvent(this); + } + + @Override + public boolean isPlanning() + { + return previous.isPlanning(); + } +}