-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
Fixture.java
115 lines (100 loc) · 3.99 KB
/
Fixture.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* Copyright (c) 2002-2016 "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 Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.coreedge.raft.elections;
import java.time.Clock;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.neo4j.coreedge.raft.DelayedRenewableTimeoutService;
import org.neo4j.coreedge.raft.RaftInstance;
import org.neo4j.coreedge.raft.RaftInstance.BootstrapException;
import org.neo4j.coreedge.raft.RaftInstanceBuilder;
import org.neo4j.coreedge.raft.RaftStateMachine;
import org.neo4j.coreedge.raft.RaftTestNetwork;
import org.neo4j.coreedge.raft.log.InMemoryRaftLog;
import org.neo4j.coreedge.raft.membership.RaftTestGroup;
import org.neo4j.coreedge.server.CoreMember;
import org.neo4j.coreedge.server.RaftTestMemberSetBuilder;
import org.neo4j.helpers.collection.Iterables;
import org.neo4j.logging.NullLogProvider;
public class Fixture
{
private final Set members = new HashSet<>();
final Set<RaftInstance> rafts = new HashSet<>();
final RaftTestNetwork net;
private final List<DelayedRenewableTimeoutService> timeoutServices = new ArrayList<>();
Fixture( Set<CoreMember> memberIds, RaftTestNetwork net, long electionTimeout, long heartbeatInterval,
RaftStateMachine stateMachine ) throws Throwable
{
this.net = net;
for ( CoreMember member : memberIds )
{
RaftTestNetwork.Inbound inbound = net.new Inbound( member );
RaftTestNetwork.Outbound outbound = net.new Outbound( member );
members.add( member );
DelayedRenewableTimeoutService timeoutService = createTimeoutService();
RaftInstance raftInstance =
new RaftInstanceBuilder( member, memberIds.size(), RaftTestMemberSetBuilder.INSTANCE )
.electionTimeout( electionTimeout )
.heartbeatInterval( heartbeatInterval )
.inbound( inbound )
.outbound( outbound )
.timeoutService( timeoutService )
.raftLog( new InMemoryRaftLog() )
.stateMachine( stateMachine )
.build();
rafts.add( raftInstance );
}
}
private DelayedRenewableTimeoutService createTimeoutService() throws Throwable
{
DelayedRenewableTimeoutService timeoutService = new DelayedRenewableTimeoutService(
Clock.systemUTC(), NullLogProvider.getInstance() );
timeoutServices.add( timeoutService );
timeoutService.init();
timeoutService.start();
return timeoutService;
}
void boot() throws BootstrapException
{
net.start();
Iterables.first( rafts ).bootstrapWithInitialMembers( new RaftTestGroup( members ) );
}
public void teardown() throws InterruptedException
{
net.stop();
for ( DelayedRenewableTimeoutService timeoutService : timeoutServices )
{
try
{
timeoutService.stop();
}
catch ( Throwable e )
{
e.printStackTrace();
}
}
for ( RaftInstance raft : rafts )
{
raft.logShippingManager().stop();
}
}
}