Skip to content

Commit

Permalink
Improve SegmentedRaftLogRotationTest and reenable a test
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed Jun 20, 2016
1 parent a2a18a4 commit b04896d
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 59 deletions.
7 changes: 7 additions & 0 deletions enterprise/core-edge/pom.xml
Expand Up @@ -96,6 +96,13 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-common</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.neo4j</groupId>
Expand Down
Expand Up @@ -91,7 +91,6 @@ public synchronized void start() throws IOException, DamagedLogStorageException

RecoveryProtocol recoveryProtocol = new RecoveryProtocol( fileSystem, fileNames, contentMarshal, logProvider );
state = recoveryProtocol.run();

}

@Override
Expand Down
Expand Up @@ -19,101 +19,82 @@
*/
package org.neo4j.coreedge.raft.log.segmented;

import org.junit.After;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;

import java.io.File;
import java.util.concurrent.atomic.AtomicLong;
import java.io.IOException;
import java.util.stream.Stream;

import org.neo4j.coreedge.raft.ReplicatedInteger;
import org.neo4j.coreedge.raft.ReplicatedString;
import org.neo4j.coreedge.raft.log.DummyRaftableContentSerializer;
import org.neo4j.coreedge.raft.log.RaftLogEntry;
import org.neo4j.graphdb.mockfs.EphemeralFileSystemAbstraction;
import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.kernel.lifecycle.Lifespan;
import org.neo4j.logging.NullLogProvider;
import org.neo4j.test.rule.Resources;

import static org.junit.Assert.assertEquals;
import static org.neo4j.coreedge.raft.log.segmented.SegmentedRaftLog.SEGMENTED_LOG_DIRECTORY_NAME;
import static org.neo4j.coreedge.server.CoreEdgeClusterSettings.raft_log_pruning_strategy;
import static org.neo4j.test.rule.Resources.InitialLifecycle.STARTED;
import static org.neo4j.test.rule.Resources.TestPath.EXISTING_DIRECTORY;

public class SegmentedRaftLogRotationTest
{
private LifeSupport life = new LifeSupport();
private FileSystemAbstraction fileSystem;
private final static int ROTATE_AT_SIZE_IN_BYTES = 100;

@After
public void tearDown() throws Throwable
{
life.stop();
life.shutdown();
}
@Rule
public final Resources resourceManager = new Resources( EXISTING_DIRECTORY );

private SegmentedRaftLog createRaftLog( long rotateAtSize )
private SegmentedRaftLog createRaftLog( long rotateAtSize ) throws IOException
{
if ( fileSystem == null )
{
fileSystem = new EphemeralFileSystemAbstraction();
}
File directory = new File( SEGMENTED_LOG_DIRECTORY_NAME );
fileSystem.mkdir( directory );

SegmentedRaftLog newRaftLog = new SegmentedRaftLog( fileSystem, directory, rotateAtSize,
new DummyRaftableContentSerializer(),
NullLogProvider.getInstance(), raft_log_pruning_strategy.getDefaultValue() );
life.add( newRaftLog );
life.init();
life.start();
return newRaftLog;
return new SegmentedRaftLog( resourceManager.fileSystem(), resourceManager.testPath(), rotateAtSize,
new DummyRaftableContentSerializer(), NullLogProvider.getInstance(),
raft_log_pruning_strategy.getDefaultValue() );
}

@Ignore( "This test is stupid - rewrite" )
@Test
@Resources.Life( STARTED )
public void shouldRotateOnAppendWhenRotateSizeIsReached() throws Exception
{
// Given
AtomicLong currentVersion = new AtomicLong();
int rotateAtSize = 100;
SegmentedRaftLog log = createRaftLog( rotateAtSize );

StringBuilder builder = new StringBuilder();
for ( int i = 0; i < rotateAtSize; i++ )
{
builder.append( "i" );
}

// When
ReplicatedString stringThatIsMoreThan100Bytes = new ReplicatedString( builder.toString() );
log.append( new RaftLogEntry( 0, stringThatIsMoreThan100Bytes ) );
SegmentedRaftLog log = resourceManager.managed( createRaftLog( ROTATE_AT_SIZE_IN_BYTES ) );
log.append( new RaftLogEntry( 0, replicatedStringOfBytes( ROTATE_AT_SIZE_IN_BYTES ) ) );

// Then
assertEquals( 1, currentVersion.get() );
File[] files = resourceManager.fileSystem().listFiles( resourceManager.testPath() );
assertEquals( 2, files.length );
}

@Test
@Resources.Life( STARTED )
public void shouldBeAbleToRecoverToLatestStateAfterRotation() throws Throwable
{
int rotateAtSize = 100;
SegmentedRaftLog log = createRaftLog( rotateAtSize );

StringBuilder builder = new StringBuilder();
for ( int i = 0; i < rotateAtSize - 40; i++ )
// Given
int term = 0;
long indexToRestoreTo;
try ( Lifespan lifespan = new Lifespan() )
{
builder.append( "i" );
SegmentedRaftLog log = lifespan.add( createRaftLog( ROTATE_AT_SIZE_IN_BYTES ) );
log.append( new RaftLogEntry( term, replicatedStringOfBytes( ROTATE_AT_SIZE_IN_BYTES - 40 ) ) );
indexToRestoreTo = log.append( new RaftLogEntry( term, ReplicatedInteger.valueOf( 1 ) ) );
}

ReplicatedString stringThatGetsTheSizeToAlmost100Bytes = new ReplicatedString( builder.toString() );
int term = 0;
log.append( new RaftLogEntry( term, stringThatGetsTheSizeToAlmost100Bytes ) );
long indexToRestoreTo = log.append( new RaftLogEntry( term, ReplicatedInteger.valueOf( 1 ) ) );

// When
life.remove( log );
log = createRaftLog( rotateAtSize );
SegmentedRaftLog log = resourceManager.managed( createRaftLog( ROTATE_AT_SIZE_IN_BYTES ) );

// Then
assertEquals( indexToRestoreTo, log.appendIndex() );
assertEquals( term, log.readEntryTerm( indexToRestoreTo ) );
}

private ReplicatedString replicatedStringOfBytes( int size )
{
StringBuilder builder = new StringBuilder();
for ( int i = 0; i < size; i++ )
{
builder.append( "i" );
}
return new ReplicatedString( builder.toString() );
}
}

0 comments on commit b04896d

Please sign in to comment.