Skip to content

Commit

Permalink
extracting WaitingOnLockEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
praveenag committed Feb 15, 2017
1 parent 4dca183 commit 115a961
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 26 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
}
}
@@ -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 <http://www.gnu.org/licenses/>.
*/
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();
}
}

0 comments on commit 115a961

Please sign in to comment.