Skip to content

Commit

Permalink
SharedDiscoveryService works with refuseToBeLeader
Browse files Browse the repository at this point in the history
Topologies are bootstrapped by the first server that does not refuse to be leader. The bootstrapping member must become leader to upload the snapshot to the other members.

This logic also exists in HazelcastClusterTopology, but is coupled with the underlying data structures in a way that is hard to extract.
  • Loading branch information
andrewkerr9000 committed Feb 6, 2018
1 parent dd114f8 commit 3997e28
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -188,14 +188,7 @@ private static boolean canBeBootstrapped( HazelcastInstance hazelcastInstance, C
{
if ( !member.getBooleanAttribute( REFUSE_TO_BE_LEADER_KEY ) )
{
if ( member.localMember() )
{
return true;
}
else
{
return false;
}
return member.localMember();
}
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.Set;

import org.neo4j.causalclustering.core.CausalClusteringSettings;
import org.neo4j.causalclustering.core.state.RefuseToBeLeaderStrategy;
import org.neo4j.causalclustering.identity.ClusterId;
import org.neo4j.causalclustering.identity.MemberId;
import org.neo4j.helpers.AdvertisedSocketAddress;
Expand All @@ -39,6 +40,7 @@ class SharedDiscoveryCoreClient extends LifecycleAdapter implements CoreTopology
private final CoreServerInfo coreServerInfo;
private final Set<Listener> listeners = new LinkedHashSet<>();
private final Log log;
private final boolean refusesToBeLeader;

private CoreTopology coreTopology;
private ReadReplicaTopology readReplicaTopology;
Expand All @@ -49,6 +51,7 @@ class SharedDiscoveryCoreClient extends LifecycleAdapter implements CoreTopology
this.member = member;
this.coreServerInfo = extractCoreServerInfo( config );
this.log = logProvider.getLog( getClass() );
this.refusesToBeLeader = RefuseToBeLeaderStrategy.shouldRefuseToBeLeader( config );
}

@Override
Expand Down Expand Up @@ -125,4 +128,9 @@ private static CoreServerInfo extractCoreServerInfo( Config config )

return new CoreServerInfo( raftAddress, transactionSource, clientConnectorAddresses );
}

public boolean refusesToBeLeader()
{
return refusesToBeLeader;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,24 @@ CoreTopology coreTopology( SharedDiscoveryCoreClient client )
lock.lock();
try
{
return new CoreTopology( clusterId, coreClients.size() > 0 && coreClients.get( 0 ) == client,
unmodifiableMap( coreMembers ) );
return new CoreTopology( clusterId, canBeBootstrapped( client ), unmodifiableMap( coreMembers ) );
}
finally
{
lock.unlock();
}
}

private boolean canBeBootstrapped( SharedDiscoveryCoreClient client )
{
return client != null && coreClients.size() > 0 &&
coreClients.stream()
.filter( core -> !core.refusesToBeLeader() )
.findFirst()
.map( client::equals )
.orElse( false );
}

ReadReplicaTopology readReplicaTopology()
{
lock.lock();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import org.neo4j.causalclustering.core.consensus.roles.Role;
import org.neo4j.causalclustering.discovery.Cluster;
import org.neo4j.causalclustering.discovery.CoreClusterMember;
import org.neo4j.causalclustering.discovery.HazelcastDiscoveryServiceFactory;
import org.neo4j.test.Race;
import org.neo4j.test.assertion.Assert;
import org.neo4j.test.causalclustering.ClusterRule;
Expand Down Expand Up @@ -142,7 +141,6 @@ public void shouldElectANewLeaderIfAServerRefusesToBeLeader() throws Exception
{
// given
clusterRule
.withDiscoveryServiceFactory( new HazelcastDiscoveryServiceFactory() )
.withInstanceCoreParam( CausalClusteringSettings.refuse_to_be_leader, this::firstServerRefusesToBeLeader )
.withSharedCoreParam( CausalClusteringSettings.multi_dc_license, "true" );
Cluster cluster = clusterRule.startCluster();
Expand Down

0 comments on commit 3997e28

Please sign in to comment.