Skip to content

Commit

Permalink
Merge pull request #9968 from tinwelint/3.3-counts-tracker-test-timeout
Browse files Browse the repository at this point in the history
Fixes issues in CountsTrackerTest
  • Loading branch information
tinwelint committed Sep 5, 2017
2 parents c97568b + f7342bc commit 8156799
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 2 deletions.
@@ -0,0 +1,79 @@
/*
* 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.impl.store.counts;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;

import org.neo4j.time.SystemNanoClock;

public class CallTrackingClock extends SystemNanoClock
{
private final SystemNanoClock actual;
private volatile int nanosCalls;

public CallTrackingClock( SystemNanoClock actual )
{
this.actual = actual;
}

@Override
public ZoneId getZone()
{
return actual.getZone();
}

@Override
public Clock withZone( ZoneId zone )
{
return actual.withZone( zone );
}

@Override
public Instant instant()
{
return actual.instant();
}

@Override
public long millis()
{
return actual.millis();
}

@Override
public long nanos()
{
try
{
return actual.nanos();
}
finally
{
nanosCalls++;
}
}

public int callsToNanos()
{
return nanosCalls;
}
}
Expand Up @@ -359,7 +359,8 @@ public void shouldNotEndUpInBrokenStateAfterRotationFailure() throws Exception
{
// GIVEN
FakeClock clock = Clocks.fakeClock();
CountsTracker tracker = resourceManager.managed( newTracker( clock ) );
CallTrackingClock callTrackingClock = new CallTrackingClock( clock );
CountsTracker tracker = resourceManager.managed( newTracker( callTrackingClock ) );
int labelId = 1;
try ( CountsAccessor.Updater tx = tracker.apply( 2 ).get() )
{
Expand All @@ -369,11 +370,15 @@ public void shouldNotEndUpInBrokenStateAfterRotationFailure() throws Exception
// WHEN
Predicate<Thread> arrived = thread ->
stackTraceContains( thread, all( classNameContains( "Rotation" ), methodIs( "rotate" ) ) );
Future<Object> rotation = threading.executeAndAwait( t -> t.rotate( 4 ), tracker, arrived, 100, MILLISECONDS );
Future<Object> rotation = threading.executeAndAwait( t -> t.rotate( 4 ), tracker, arrived, 1, SECONDS );
try ( CountsAccessor.Updater tx = tracker.apply( 3 ).get() )
{
tx.incrementNodeCount( labelId, 1 ); // now at 2
}
while ( callTrackingClock.callsToNanos() == 0 )
{
Thread.sleep( 10 );
}
clock.forward( Config.defaults().get( GraphDatabaseSettings.counts_store_rotation_timeout ).toMillis() * 2, MILLISECONDS );
try
{
Expand Down

0 comments on commit 8156799

Please sign in to comment.