From 37fcf20fa190b5ab3c19afaa0d53b47ed8541381 Mon Sep 17 00:00:00 2001 From: Jim Webber Date: Fri, 15 Jan 2016 11:32:00 +0000 Subject: [PATCH] Rationalised on-disk directory layout and file naming for raft logs and cluster state. --- .../raft/log/NaiveDurableRaftLog.java | 3 ++ .../OnDiskIdAllocationState.java | 7 +-- .../membership/OnDiskRaftMembershipState.java | 5 +- .../raft/state/term/OnDiskTermState.java | 7 +-- .../raft/state/vote/OnDiskVoteState.java | 7 +-- .../core/EnterpriseCoreEditionModule.java | 50 ++++++++++-------- .../coreedge/raft/roles/FollowerTest.java | 4 +- .../coreedge/raft/state/PersistedStateIT.java | 17 +++--- .../raft/state/StatePersisterTest.java | 4 +- .../raft/state/TermStateAdversarialTest.java | 2 +- .../raft/state/VoteStateAdversarialTest.java | 2 +- .../OnDiskIdAllocationStateTest.java | 6 +-- .../scenarios/CoreServerReplicationIT.java | 14 +++-- .../server/core/OnDiskFileLayoutTest.java | 52 +++++++++++++++++++ 14 files changed, 125 insertions(+), 55 deletions(-) create mode 100644 enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/OnDiskFileLayoutTest.java diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/log/NaiveDurableRaftLog.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/log/NaiveDurableRaftLog.java index f2811b488b7c..90ed53af7d67 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/log/NaiveDurableRaftLog.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/log/NaiveDurableRaftLog.java @@ -68,6 +68,7 @@ public class NaiveDurableRaftLog extends LifecycleAdapter implements RaftLog public static final int ENTRY_RECORD_LENGTH = 16; public static final int CONTENT_LENGTH_BYTES = 4; public static final int COMMIT_INDEX_BYTES = 8; + public static final String DIRECTORY_NAME = "raft-log"; private final Set listeners = new CopyOnWriteArraySet<>(); @@ -93,6 +94,8 @@ public NaiveDurableRaftLog( FileSystemAbstraction fileSystem, File directory, Se this.commitIndexMonitor = monitors.newMonitor( RaftLogCommitIndexMonitor.class, getClass(), RaftLog .COMMIT_INDEX_TAG ); + directory.mkdirs(); + try { entriesChannel = fileSystem.open( new File( directory, "entries.log" ), "rw" ); diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationState.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationState.java index 6f612f88dbac..215877e08aab 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationState.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationState.java @@ -43,6 +43,7 @@ */ public class OnDiskIdAllocationState extends LifecycleAdapter implements IdAllocationState { + public static final String DIRECTORY_NAME = "id-allocation-state"; public static final String FILENAME = "id.allocation."; private final InMemoryIdAllocationState inMemoryIdAllocationState; @@ -51,12 +52,12 @@ public class OnDiskIdAllocationState extends LifecycleAdapter implements IdAlloc private final ByteBuffer workingBuffer; private final InMemoryIdAllocationState.InMemoryIdAllocationStateMarshal marshal; - public OnDiskIdAllocationState( FileSystemAbstraction fileSystemAbstraction, File storeDir, + public OnDiskIdAllocationState( FileSystemAbstraction fileSystemAbstraction, File stateDir, int numberOfEntriesBeforeRotation, Supplier databaseHealthSupplier ) throws IOException { - File fileA = new File( storeDir, FILENAME + "A" ); - File fileB = new File( storeDir, FILENAME + "B" ); + File fileA = new File( stateDir, FILENAME + "a" ); + File fileB = new File( stateDir, FILENAME + "b" ); this.workingBuffer = ByteBuffer.allocate( NUMBER_OF_BYTES_PER_WRITE ); diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/membership/OnDiskRaftMembershipState.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/membership/OnDiskRaftMembershipState.java index 76a90b954db9..7125a7c16508 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/membership/OnDiskRaftMembershipState.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/membership/OnDiskRaftMembershipState.java @@ -35,6 +35,7 @@ public class OnDiskRaftMembershipState extends LifecycleAdapter implemen { public static final int MAX_SIZE_OF_ADDRESS_STATE_ON_DISK = 2_000_000; private static final String FILENAME = "membership.state."; + public static final String DIRECTORY_NAME = "membership-state"; private final StatePersister> statePersister; @@ -50,8 +51,8 @@ public OnDiskRaftMembershipState( FileSystemAbstraction fileSystemAbstraction, InMemoryRaftMembershipState.InMemoryRaftMembershipStateMarshal marshal = new InMemoryRaftMembershipState.InMemoryRaftMembershipStateMarshal<>( memberMarshal ); - File fileA = new File( storeDir, FILENAME + "A" ); - File fileB = new File( storeDir, FILENAME + "B" ); + File fileA = new File( storeDir, FILENAME + "a" ); + File fileB = new File( storeDir, FILENAME + "b" ); RaftMembershipStateRecoveryManager recoveryManager = new RaftMembershipStateRecoveryManager<>( fileSystemAbstraction, marshal ); diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/term/OnDiskTermState.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/term/OnDiskTermState.java index d583333a2f5e..a30f23cd17c8 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/term/OnDiskTermState.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/term/OnDiskTermState.java @@ -35,18 +35,19 @@ public class OnDiskTermState extends LifecycleAdapter implements TermState { public static final String FILENAME = "term."; + public static final String DIRECTORY_NAME = "term-state"; private final ByteBuffer workingBuffer; private InMemoryTermState inMemoryTermState; private final StatePersister statePersister; - public OnDiskTermState( FileSystemAbstraction fileSystemAbstraction, File storeDir, + public OnDiskTermState( FileSystemAbstraction fileSystemAbstraction, File stateDir, int numberOfEntriesBeforeRotation, Supplier databaseHealthSupplier ) throws IOException { - File fileA = new File( storeDir, FILENAME + "A" ); - File fileB = new File( storeDir, FILENAME + "B" ); + File fileA = new File( stateDir, FILENAME + "a" ); + File fileB = new File( stateDir, FILENAME + "b" ); workingBuffer = ByteBuffer.allocate( InMemoryVoteState.InMemoryVoteStateMarshal .NUMBER_OF_BYTES_PER_VOTE ); diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/vote/OnDiskVoteState.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/vote/OnDiskVoteState.java index 0894cba5657c..090631b90914 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/vote/OnDiskVoteState.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/raft/state/vote/OnDiskVoteState.java @@ -35,17 +35,18 @@ public class OnDiskVoteState extends LifecycleAdapter implements VoteState { public static final String FILENAME = "vote."; + public static final String DIRECTORY_NAME = "vote-state"; private final StatePersister> statePersister; private InMemoryVoteState inMemoryVoteState; - public OnDiskVoteState( FileSystemAbstraction fileSystemAbstraction, File storeDir, + public OnDiskVoteState( FileSystemAbstraction fileSystemAbstraction, File stateDir, int numberOfEntriesBeforeRotation, Supplier databaseHealthSupplier, Marshal memberMarshal ) throws IOException { - File fileA = new File( storeDir, FILENAME + "A" ); - File fileB = new File( storeDir, FILENAME + "B" ); + File fileA = new File( stateDir, FILENAME + "a" ); + File fileB = new File( stateDir, FILENAME + "b" ); ByteBuffer workingBuffer = ByteBuffer.allocate( InMemoryVoteState.InMemoryVoteStateMarshal .NUMBER_OF_BYTES_PER_VOTE ); diff --git a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java index 6d19c23d5a9e..baf1f8ecc8d7 100644 --- a/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java +++ b/enterprise/core-edge/src/main/java/org/neo4j/coreedge/server/core/EnterpriseCoreEditionModule.java @@ -62,9 +62,9 @@ import org.neo4j.coreedge.raft.replication.token.ReplicatedPropertyKeyTokenHolder; import org.neo4j.coreedge.raft.replication.token.ReplicatedRelationshipTypeTokenHolder; import org.neo4j.coreedge.raft.replication.tx.CommittingTransactions; +import org.neo4j.coreedge.raft.replication.tx.CommittingTransactionsRegistry; import org.neo4j.coreedge.raft.replication.tx.ReplicatedTransactionCommitProcess; import org.neo4j.coreedge.raft.replication.tx.ReplicatedTransactionStateMachine; -import org.neo4j.coreedge.raft.replication.tx.CommittingTransactionsRegistry; import org.neo4j.coreedge.raft.roles.Role; import org.neo4j.coreedge.raft.state.id_allocation.OnDiskIdAllocationState; import org.neo4j.coreedge.raft.state.membership.OnDiskRaftMembershipState; @@ -130,6 +130,7 @@ public class EnterpriseCoreEditionModule extends EditionModule { + public static final String CLUSTER_STATE_DIRECTORY_NAME = "cluster-state"; private final RaftInstance raft; public RaftInstance raft() @@ -140,13 +141,14 @@ public RaftInstance raft() public EnterpriseCoreEditionModule( final PlatformModule platformModule, DiscoveryServiceFactory discoveryServiceFactory ) { - org.neo4j.kernel.impl.util.Dependencies dependencies = platformModule.dependencies; - Config config = platformModule.config; - LogService logging = platformModule.logging; - FileSystemAbstraction fileSystem = platformModule.fileSystem; - File storeDir = platformModule.storeDir; - LifeSupport life = platformModule.life; - GraphDatabaseFacade graphDatabaseFacade = platformModule.graphDatabaseFacade; + final org.neo4j.kernel.impl.util.Dependencies dependencies = platformModule.dependencies; + final Config config = platformModule.config; + final LogService logging = platformModule.logging; + final FileSystemAbstraction fileSystem = platformModule.fileSystem; + final File storeDir = platformModule.storeDir; + final File clusterStateDirectory = createClusterStateDirectory( storeDir, fileSystem ); + final LifeSupport life = platformModule.life; + final GraphDatabaseFacade graphDatabaseFacade = platformModule.graphDatabaseFacade; LogProvider logProvider = logging.getInternalLogProvider(); @@ -178,14 +180,15 @@ public EnterpriseCoreEditionModule( final PlatformModule platformModule, final DelayedRenewableTimeoutService raftTimeoutService = new DelayedRenewableTimeoutService( Clock.SYSTEM_CLOCK, logProvider ); - File raftLogsDirectory = createRaftLogsDirectory( platformModule.storeDir, fileSystem ); - NaiveDurableRaftLog raftLog = life.add( new NaiveDurableRaftLog( fileSystem, raftLogsDirectory, + NaiveDurableRaftLog raftLog = life.add( new NaiveDurableRaftLog( fileSystem, + new File( clusterStateDirectory, NaiveDurableRaftLog.DIRECTORY_NAME ), new RaftContentSerializer(), platformModule.monitors ) ); TermState termState; try { - termState = life.add( new OnDiskTermState( fileSystem, raftLogsDirectory, + termState = life.add( new OnDiskTermState( fileSystem, + new File( clusterStateDirectory, OnDiskTermState.DIRECTORY_NAME ), config.get( CoreEdgeClusterSettings.term_state_size ), databaseHealthSupplier ) ); } catch ( IOException e ) @@ -196,7 +199,8 @@ public EnterpriseCoreEditionModule( final PlatformModule platformModule, VoteState voteState; try { - voteState = life.add( new OnDiskVoteState<>( fileSystem, raftLogsDirectory, + voteState = life.add( new OnDiskVoteState<>( fileSystem, + new File( clusterStateDirectory, OnDiskVoteState.DIRECTORY_NAME ), config.get( CoreEdgeClusterSettings.vote_state_size ), databaseHealthSupplier, new CoreMember.CoreMemberMarshal() ) ); } @@ -209,8 +213,9 @@ public EnterpriseCoreEditionModule( final PlatformModule platformModule, RaftMembershipState raftMembershipState; try { - raftMembershipState = life.add( new OnDiskRaftMembershipState<>( - fileSystem, storeDir, config.get( CoreEdgeClusterSettings.raft_membership_state_size ), + raftMembershipState = life.add( new OnDiskRaftMembershipState<>( fileSystem, + new File( clusterStateDirectory, OnDiskRaftMembershipState.DIRECTORY_NAME ), + config.get( CoreEdgeClusterSettings.raft_membership_state_size ), databaseHealthSupplier, new CoreMember.CoreMemberMarshal() ) ); } catch ( IOException e ) @@ -236,9 +241,9 @@ public EnterpriseCoreEditionModule( final PlatformModule platformModule, final IdAllocationState idAllocationState; try { - idAllocationState = life.add( new OnDiskIdAllocationState( fileSystem, new File( - storeDir, "id-alloc-store" ), config.get( - CoreEdgeClusterSettings.id_alloc_state_size ), databaseHealthSupplier ) ); + idAllocationState = life.add( new OnDiskIdAllocationState( fileSystem, + new File( clusterStateDirectory, OnDiskIdAllocationState.DIRECTORY_NAME ), + config.get( CoreEdgeClusterSettings.id_alloc_state_size ), databaseHealthSupplier ) ); } catch ( IOException e ) { @@ -330,9 +335,9 @@ public boolean isLeader() return raft.currentRole() == Role.LEADER; } - private File createRaftLogsDirectory( File dir, FileSystemAbstraction fileSystem ) + private File createClusterStateDirectory( File dir, FileSystemAbstraction fileSystem ) { - File raftLogDir = new File( dir, "raft-logs" ); + File raftLogDir = new File( dir, CLUSTER_STATE_DIRECTORY_NAME ); try { @@ -360,7 +365,8 @@ public static CommitProcessFactory createCommitProcessFactory( final Replicator CommittingTransactions committingTransactions = new CommittingTransactionsRegistry(); ReplicatedTransactionStateMachine replicatedTxStateMachine = new ReplicatedTransactionStateMachine( - localCommit, localSessionPool.getGlobalSession(), currentReplicatedLockState, committingTransactions ); + localCommit, localSessionPool.getGlobalSession(), currentReplicatedLockState, + committingTransactions ); dependencies.satisfyDependencies( replicatedTxStateMachine ); @@ -464,8 +470,8 @@ protected ReplicatedIdGeneratorFactory createIdGeneratorFactory( FileSystemAbstr } protected Locks createLockManager( final Config config, final LogService logging, final Replicator replicator, - CoreMember myself, ReplicatedLockStateMachine - replicatedLockStateMachine, LeaderLocator leaderLocator ) + CoreMember myself, ReplicatedLockStateMachine + replicatedLockStateMachine, LeaderLocator leaderLocator ) { Locks local = CommunityEditionModule.createLockManager( config, logging ); diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/roles/FollowerTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/roles/FollowerTest.java index 250e619d3b0d..3b90d57ef7a7 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/roles/FollowerTest.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/roles/FollowerTest.java @@ -599,7 +599,7 @@ public void shouldNotCommitAheadOfMatchingHistory() throws Exception public void shouldIncludeLatestAppendedInResponse() throws Exception { // given: just a single appended entry at follower - RaftLogEntry entryA = new RaftLogEntry( 1, ReplicatedString.valueOf( "A" ) ); + RaftLogEntry entryA = new RaftLogEntry( 1, ReplicatedString.valueOf( "b" ) ); InMemoryRaftLog raftLog = new InMemoryRaftLog(); raftLog.append( entryA ); @@ -612,7 +612,7 @@ public void shouldIncludeLatestAppendedInResponse() throws Exception Follower follower = new Follower(); - RaftLogEntry entryB = new RaftLogEntry( 1, ReplicatedString.valueOf( "B" ) ); + RaftLogEntry entryB = new RaftLogEntry( 1, ReplicatedString.valueOf( "b" ) ); // when: append request for item way forward (index=10, term=2) Outcome outcome = follower.handle( diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/PersistedStateIT.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/PersistedStateIT.java index 8c0f0a5735b1..03c7f351868d 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/PersistedStateIT.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/PersistedStateIT.java @@ -19,11 +19,6 @@ */ package org.neo4j.coreedge.raft.state; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - import java.io.File; import java.io.IOException; import java.nio.BufferUnderflowException; @@ -31,6 +26,7 @@ import org.junit.Rule; import org.junit.Test; + import org.neo4j.adversaries.CountingAdversary; import org.neo4j.adversaries.MethodGuardedAdversary; import org.neo4j.adversaries.fs.AdversarialFileSystemAbstraction; @@ -46,6 +42,11 @@ import org.neo4j.logging.NullLog; import org.neo4j.test.TargetDirectory; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; + public class PersistedStateIT { @Rule @@ -250,11 +251,11 @@ private static class LongState private final StatePersister statePersister; private long theState = -1; - public LongState( FileSystemAbstraction fileSystemAbstraction, File storeDir, + public LongState( FileSystemAbstraction fileSystemAbstraction, File stateDir, int numberOfEntriesBeforeRotation ) throws IOException { - File fileA = new File( storeDir, FILENAME + "A" ); - File fileB = new File( storeDir, FILENAME + "B" ); + File fileA = new File( stateDir, FILENAME + "a" ); + File fileB = new File( stateDir, FILENAME + "b" ); ByteBuffer workingBuffer = ByteBuffer.allocate( InMemoryVoteState.InMemoryVoteStateMarshal .NUMBER_OF_BYTES_PER_VOTE ); diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/StatePersisterTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/StatePersisterTest.java index 9d1fa5d8d9f5..bc446058ac80 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/StatePersisterTest.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/StatePersisterTest.java @@ -133,11 +133,11 @@ public AtomicInteger unmarshal( ByteBuffer source ) private File stateFileA() { - return new File( testDir.directory(), FILENAME + "A" ); + return new File( testDir.directory(), FILENAME + "a" ); } private File stateFileB() { - return new File( testDir.directory(), FILENAME + "B" ); + return new File( testDir.directory(), FILENAME + "b" ); } } \ No newline at end of file diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/TermStateAdversarialTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/TermStateAdversarialTest.java index 6151a9cf5467..078223d6d345 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/TermStateAdversarialTest.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/TermStateAdversarialTest.java @@ -65,7 +65,7 @@ public void shouldDiscardTermIfChannelFails() throws Exception EphemeralFileSystemAbstraction fs = new EphemeralFileSystemAbstraction(); FileSystemAbstraction fileSystem = new SelectiveFileSystemAbstraction( new File( testDir.directory(), - "term.A" ), new AdversarialFileSystemAbstraction( adversary, fs ), fs ); + "term.a" ), new AdversarialFileSystemAbstraction( adversary, fs ), fs ); TermState log = createTermStore( fileSystem ); log.update( 21 ); diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/VoteStateAdversarialTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/VoteStateAdversarialTest.java index 70352880ae67..bff730d9f59f 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/VoteStateAdversarialTest.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/VoteStateAdversarialTest.java @@ -59,7 +59,7 @@ public void shouldDiscardVoteIfChannelFails() throws Exception EphemeralFileSystemAbstraction fs = new EphemeralFileSystemAbstraction(); FileSystemAbstraction fileSystem = new SelectiveFileSystemAbstraction( - new File( testDir.directory(), "vote.A" ), new AdversarialFileSystemAbstraction( adversary, fs ), fs ); + new File( testDir.directory(), "vote.a" ), new AdversarialFileSystemAbstraction( adversary, fs ), fs ); VoteState store = createVoteStore( fileSystem ); final CoreMember member1 = new CoreMember( new AdvertisedSocketAddress( "host1:1001" ), diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationStateTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationStateTest.java index d78ffc3b5183..e65d64a4e168 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationStateTest.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/state/id_allocation/OnDiskIdAllocationStateTest.java @@ -144,11 +144,11 @@ public void shouldSwitchToWritingToPreviouslyInactiveFileOnRecovery() throws Exc // then assertEquals( 3 * NUMBER_OF_BYTES_PER_WRITE, - fsa.getFileSize( new File( testDir.directory(), "id.allocation.A" ) ) ); + fsa.getFileSize( new File( testDir.directory(), "id.allocation.a" ) ) ); assertEquals( NUMBER_OF_BYTES_PER_WRITE, - fsa.getFileSize( new File( testDir.directory(), "id.allocation.B" ) ) ); + fsa.getFileSize( new File( testDir.directory(), "id.allocation.b" ) ) ); } @Test @@ -191,6 +191,6 @@ public synchronized StoreChannel open( File fileName, String mode ) throws IOExc private File stateFileA() { - return new File( testDir.directory(), FILENAME + "A" ); + return new File( testDir.directory(), FILENAME + "a" ); } } diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/CoreServerReplicationIT.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/CoreServerReplicationIT.java index 0e54eca7345f..e0f43992eed1 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/CoreServerReplicationIT.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/scenarios/CoreServerReplicationIT.java @@ -19,17 +19,17 @@ */ package org.neo4j.coreedge.scenarios; -import org.junit.After; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; - import java.io.File; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import org.junit.After; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; + import org.neo4j.cluster.InstanceId; import org.neo4j.coreedge.discovery.Cluster; import org.neo4j.coreedge.server.CoreEdgeClusterSettings; @@ -50,11 +50,13 @@ import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; + import static junit.framework.TestCase.fail; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; + import static org.neo4j.cluster.ClusterSettings.server_id; import static org.neo4j.coreedge.server.CoreEdgeClusterSettings.raft_advertised_address; import static org.neo4j.graphdb.Label.label; @@ -116,6 +118,8 @@ public void shouldReplicateTransactionToCoreServers() throws Exception tx.success(); } } + + fail(); } @Test diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/OnDiskFileLayoutTest.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/OnDiskFileLayoutTest.java new file mode 100644 index 000000000000..0d2636fdcbb3 --- /dev/null +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/server/core/OnDiskFileLayoutTest.java @@ -0,0 +1,52 @@ +package org.neo4j.coreedge.server.core; + +import java.io.File; +import java.util.HashMap; + +import org.junit.Rule; +import org.junit.Test; + +import org.neo4j.coreedge.discovery.TestOnlyDiscoveryServiceFactory; +import org.neo4j.coreedge.raft.log.NaiveDurableRaftLog; +import org.neo4j.coreedge.raft.state.id_allocation.OnDiskIdAllocationState; +import org.neo4j.coreedge.raft.state.membership.OnDiskRaftMembershipState; +import org.neo4j.coreedge.raft.state.term.OnDiskTermState; +import org.neo4j.coreedge.raft.state.vote.OnDiskVoteState; +import org.neo4j.kernel.GraphDatabaseDependencies; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; +import org.neo4j.kernel.impl.factory.PlatformModule; +import org.neo4j.test.TargetDirectory; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +public class OnDiskFileLayoutTest +{ + @Rule + public final TargetDirectory.TestDirectory dir = TargetDirectory.testDirForTest( getClass() ); + + @Test + public void shouldHaveClusterStateDirectoryWithNoNakedFiles() throws Exception + { + // given + final PlatformModule platformModule = new PlatformModule( dir.graphDbDir(), new HashMap<>(), + GraphDatabaseDependencies.newDependencies(), mock( GraphDatabaseFacade.class ) ); + File baseClusterStateFile = new File( dir.graphDbDir(), + EnterpriseCoreEditionModule.CLUSTER_STATE_DIRECTORY_NAME ); + + + // when + new EnterpriseCoreEditionModule( platformModule, new TestOnlyDiscoveryServiceFactory() ); + + // then + platformModule.fileSystem.fileExists( new File( baseClusterStateFile, OnDiskVoteState.DIRECTORY_NAME ) ); + platformModule.fileSystem.fileExists( new File( baseClusterStateFile, + OnDiskIdAllocationState.DIRECTORY_NAME ) ); + platformModule.fileSystem.fileExists( new File( baseClusterStateFile, OnDiskTermState.DIRECTORY_NAME ) ); + platformModule.fileSystem.fileExists( new File( baseClusterStateFile, OnDiskRaftMembershipState + .DIRECTORY_NAME ) ); + platformModule.fileSystem.fileExists( new File( baseClusterStateFile, NaiveDurableRaftLog.DIRECTORY_NAME ) ); + + assertEquals(5, platformModule.fileSystem.listFiles( baseClusterStateFile ).length); + } +} \ No newline at end of file