Skip to content

Commit

Permalink
Remove custom ticking clock.
Browse files Browse the repository at this point in the history
  • Loading branch information
MishaDemianenko committed Aug 25, 2016
1 parent afc00b3 commit 673dd15
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 168 deletions.
Expand Up @@ -19,13 +19,13 @@
*/
package org.neo4j.kernel;

import java.time.Clock;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;

import org.neo4j.helpers.Clock;
import org.neo4j.helpers.Format;
import org.neo4j.helpers.Listeners;
import org.neo4j.helpers.collection.Iterables;
Expand Down Expand Up @@ -275,7 +275,7 @@ private Availability availability( long millis )
return availability;
}

long timeout = clock.currentTimeMillis() + millis;
long timeout = clock.millis() + millis;
do
{
try
Expand All @@ -288,7 +288,7 @@ private Availability availability( long millis )
break;
}
availability = availability();
} while ( availability == Availability.UNAVAILABLE && clock.currentTimeMillis() < timeout );
} while ( availability == Availability.UNAVAILABLE && clock.millis() < timeout );

return availability;
}
Expand Down
Expand Up @@ -29,7 +29,6 @@
import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.graphdb.security.URLAccessRule;
import org.neo4j.helpers.Clock;
import org.neo4j.helpers.collection.Iterables;
import org.neo4j.io.fs.DefaultFileSystemAbstraction;
import org.neo4j.io.fs.FileSystemAbstraction;
Expand Down Expand Up @@ -174,7 +173,7 @@ public DependencyResolver get()
// Anyways please fix this.
dataSourceManager = dependencies.satisfyDependency( new DataSourceManager() );

availabilityGuard = new AvailabilityGuard( Clock.SYSTEM_CLOCK, logging.getInternalLog(
availabilityGuard = new AvailabilityGuard( java.time.Clock.systemUTC(), logging.getInternalLog(
AvailabilityGuard.class ) );

transactionMonitor = dependencies.satisfyDependency( createTransactionStats() );
Expand Down
89 changes: 0 additions & 89 deletions community/kernel/src/test/java/org/neo4j/helpers/TickingClock.java

This file was deleted.

Expand Up @@ -20,19 +20,21 @@
package org.neo4j.kernel;

import org.junit.Test;
import org.mockito.Mockito;

import java.util.concurrent.TimeUnit;
import java.time.Clock;
import java.util.concurrent.atomic.AtomicBoolean;

import org.neo4j.helpers.Clock;
import org.neo4j.helpers.TickingClock;
import org.neo4j.kernel.AvailabilityGuard.UnavailableException;
import org.neo4j.logging.Log;
import org.neo4j.logging.NullLog;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.atLeast;
Expand All @@ -48,11 +50,12 @@ public class AvailabilityGuardTest
private static final AvailabilityGuard.AvailabilityRequirement REQUIREMENT_1 = availabilityRequirement( "Requirement 1" );
private static final AvailabilityGuard.AvailabilityRequirement REQUIREMENT_2 = availabilityRequirement( "Requirement 2" );

private Clock clock = Clock.systemUTC();

@Test
public void logOnAvailabilityChange() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );

Expand Down Expand Up @@ -96,7 +99,6 @@ public void logOnAvailabilityChange() throws Exception
public void givenAccessGuardWith2ConditionsWhenAwaitThenTimeoutAndReturnFalse() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
Expand All @@ -113,51 +115,50 @@ public void givenAccessGuardWith2ConditionsWhenAwaitThenTimeoutAndReturnFalse()
public void givenAccessGuardWith2ConditionsWhenAwaitThenActuallyWaitGivenTimeout() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
availabilityGuard.require( REQUIREMENT_2 );

// When
long start = clock.currentTimeMillis();
boolean result = availabilityGuard.isAvailable( 1000 );
long end = clock.currentTimeMillis();
long timeout = 1000;
long start = clock.millis();
boolean result = availabilityGuard.isAvailable( timeout );
long end = clock.millis();

// Then
long waitTime = end - start;
assertThat( result, equalTo( false ) );
assertThat( waitTime, equalTo( 1200L ) );
assertThat( waitTime, greaterThanOrEqualTo( timeout ) );
}

@Test
public void givenAccessGuardWith2ConditionsWhenGrantOnceAndAwaitThenTimeoutAndReturnFalse() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
availabilityGuard.require( REQUIREMENT_2 );

// When
long start = clock.currentTimeMillis();
long start = clock.millis();
long timeout = 1000;
availabilityGuard.fulfill( REQUIREMENT_1 );
boolean result = availabilityGuard.isAvailable( 1000 );
long end = clock.currentTimeMillis();
boolean result = availabilityGuard.isAvailable( timeout );
long end = clock.millis();

// Then
long waitTime = end - start;
assertThat( result, equalTo( false ) );
assertThat( waitTime, equalTo( 1200L ) );
assertFalse( result );
assertThat( waitTime, greaterThanOrEqualTo( timeout ) );

}

@Test
public void givenAccessGuardWith2ConditionsWhenGrantEachAndAwaitThenTrue() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
Expand All @@ -167,23 +168,14 @@ public void givenAccessGuardWith2ConditionsWhenGrantEachAndAwaitThenTrue() throw
availabilityGuard.fulfill( REQUIREMENT_1 );
availabilityGuard.fulfill( REQUIREMENT_2 );

long start = clock.currentTimeMillis();
boolean result = availabilityGuard.isAvailable( 1000 );
long end = clock.currentTimeMillis();

// Then
long waitTime = end - start;
assertThat( result, equalTo( true ) );
assertThat( waitTime, equalTo( 100L ) );

assertTrue( availabilityGuard.isAvailable( 1000 ) );
}

@Test
public void givenAccessGuardWith2ConditionsWhenGrantTwiceAndDenyOnceAndAwaitThenTimeoutAndReturnFalse() throws
Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
Expand All @@ -194,53 +186,38 @@ public void givenAccessGuardWith2ConditionsWhenGrantTwiceAndDenyOnceAndAwaitThen
availabilityGuard.fulfill( REQUIREMENT_1 );
availabilityGuard.require( REQUIREMENT_2 );

long start = clock.currentTimeMillis();
boolean result = availabilityGuard.isAvailable( 1000 );
long end = clock.currentTimeMillis();
long start = clock.millis();
long timeout = 1000;
boolean result = availabilityGuard.isAvailable( timeout );
long end = clock.millis();

// Then
long waitTime = end - start;
assertThat( result, equalTo( false ) );
assertThat( waitTime, equalTo( 1200L ) );
assertFalse( result );
assertThat( waitTime, greaterThanOrEqualTo( timeout ) );
}

@Test
public void givenAccessGuardWith2ConditionsWhenGrantOnceAndAwaitAndGrantAgainDuringAwaitThenReturnTrue() throws
public void givenAccessGuardWith2ConditionsWhenGrantOnceAndAwaitAndGrantAgainThenReturnTrue() throws
Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
final AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
availabilityGuard.require( REQUIREMENT_2 );

// When
clock.at( 500, TimeUnit.MILLISECONDS, new Runnable()
{
@Override
public void run()
{
availabilityGuard.fulfill( REQUIREMENT_1 );
}
} );
availabilityGuard.fulfill( REQUIREMENT_2 );
assertFalse( availabilityGuard.isAvailable( 100 ) );

long start = clock.currentTimeMillis();
boolean result = availabilityGuard.isAvailable( 1000 );
long end = clock.currentTimeMillis();

// Then
long waitTime = end - start;
assertThat( result, equalTo( true ) );
assertThat( waitTime, equalTo( 600L ) );
availabilityGuard.fulfill( REQUIREMENT_1 );
assertTrue( availabilityGuard.isAvailable( 100 ) );
}

@Test
public void givenAccessGuardWithConditionWhenGrantThenNotifyListeners() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
final AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
Expand Down Expand Up @@ -273,7 +250,6 @@ public void unavailable()
public void givenAccessGuardWithConditionWhenGrantAndDenyThenNotifyListeners() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
final AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
availabilityGuard.require( REQUIREMENT_1 );
Expand Down Expand Up @@ -307,27 +283,23 @@ public void unavailable()
public void givenAccessGuardWithConditionWhenShutdownThenInstantlyDenyAccess() throws Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
final AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );
Clock clock = Mockito.mock( Clock.class );
final AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, NullLog.getInstance() );
availabilityGuard.require( REQUIREMENT_1 );

// When
availabilityGuard.shutdown();

// Then
boolean result = availabilityGuard.isAvailable( 1000 );

assertThat( result, equalTo( false ) );
assertThat( clock.currentTimeMillis(), equalTo( 0L ) );
assertFalse( availabilityGuard.isAvailable( 1000 ) );
verifyZeroInteractions( clock );
}

@Test
public void shouldExplainWhoIsBlockingAccess() throws
Exception
{
// Given
TickingClock clock = new TickingClock( 0, 100, TimeUnit.MILLISECONDS );
Log log = mock( Log.class );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( clock, log );

Expand All @@ -343,7 +315,7 @@ public void shouldExplainWhoIsBlockingAccess() throws
public void shouldExplainBlockersOnCheckAvailable() throws Exception
{
// GIVEN
AvailabilityGuard availabilityGuard = new AvailabilityGuard( Clock.SYSTEM_CLOCK, NullLog.getInstance() );
AvailabilityGuard availabilityGuard = new AvailabilityGuard( Clock.systemUTC(), NullLog.getInstance() );
// At this point it should be available
availabilityGuard.checkAvailable();

Expand Down

0 comments on commit 673dd15

Please sign in to comment.