From bec8770396d9606a715db6f9c93d021853ce8163 Mon Sep 17 00:00:00 2001 From: Mark Needham Date: Tue, 14 Mar 2017 10:55:24 +0000 Subject: [PATCH] Consolidating the Core and Replica topology differences into one happy shared difference --- .../discovery/CoreTopology.java | 63 ++---------------- .../discovery/Difference.java | 50 ++++++++++++++ .../HazelcastCoreTopologyService.java | 4 +- .../discovery/ReadReplicaTopology.java | 66 ++----------------- .../discovery/TopologyDifference.java | 55 ++++++++++++++++ .../discovery/CoreTopologyTest.java | 8 +-- .../discovery/ReadReplicaTopologyTest.java | 9 ++- 7 files changed, 125 insertions(+), 130 deletions(-) create mode 100644 enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/Difference.java create mode 100644 enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/TopologyDifference.java diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/CoreTopology.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/CoreTopology.java index 9e3f810db8783..fe84b1c834f4a 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/CoreTopology.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/CoreTopology.java @@ -72,23 +72,18 @@ public String toString() return format( "{clusterId=%s, bootstrappable=%s, coreMembers=%s}", clusterId, canBeBootstrapped(), coreMembers ); } - CoreTopologyDifference difference( CoreTopology other ) + TopologyDifference difference( CoreTopology other ) { Set members = coreMembers.keySet(); Set otherMembers = other.coreMembers.keySet(); Set added = otherMembers.stream().filter( m -> !members.contains( m ) ) - .map( memberId -> asDifference( other, memberId ) ).collect( toSet() ); + .map( memberId -> Difference.asDifference( other, memberId ) ).collect( toSet() ); Set removed = members.stream().filter( m -> !otherMembers.contains( m ) ) - .map( memberId -> asDifference( CoreTopology.this, memberId ) ).collect( toSet() ); + .map( memberId -> Difference.asDifference( CoreTopology.this, memberId ) ).collect( toSet() ); - return new CoreTopologyDifference( added, removed ); - } - - private Difference asDifference( CoreTopology topology, MemberId memberId ) - { - return new Difference( memberId, topology.find( memberId ).orElse( null ) ); + return new TopologyDifference( added, removed ); } public Optional anyCoreMemberId() @@ -96,54 +91,4 @@ public Optional anyCoreMemberId() return coreMembers.keySet().stream().findAny(); } - class CoreTopologyDifference - { - private Set added; - private Set removed; - - CoreTopologyDifference( Set added, Set removed ) - { - this.added = added; - this.removed = removed; - } - - Set added() - { - return added; - } - - Set removed() - { - return removed; - } - - boolean hasChanges() - { - return added.size() > 0 || removed.size() > 0; - } - - @Override - public String toString() - { - return String.format( "{added=%s, removed=%s}", added, removed ); - } - } - - private class Difference - { - private MemberId memberId; - private CoreServerInfo coreServerInfo; - - Difference( MemberId memberId, CoreServerInfo coreServerInfo ) - { - this.memberId = memberId; - this.coreServerInfo = coreServerInfo; - } - - @Override - public String toString() - { - return String.format( "{memberId=%s, coreServerInfo=%s}", memberId, coreServerInfo ); - } - } } diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/Difference.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/Difference.java new file mode 100644 index 0000000000000..4bfd1ccf8fa5f --- /dev/null +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/Difference.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2017 "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 . + */ +package org.neo4j.causalclustering.discovery; + +import org.neo4j.causalclustering.identity.MemberId; + +class Difference +{ + private MemberId memberId; + private CatchupServerAddress server; + + private Difference( MemberId memberId, CatchupServerAddress server ) + { + this.memberId = memberId; + this.server = server; + } + + static Difference asDifference( CoreTopology topology, MemberId memberId ) + { + return new Difference( memberId, topology.find( memberId ).orElse( null ) ); + } + + static Difference asDifference( ReadReplicaTopology topology, MemberId memberId ) + { + return new Difference( memberId, topology.find( memberId ).orElse( null ) ); + } + + @Override + public String toString() + { + return String.format( "{memberId=%s, info=%s}", memberId, server ); + } +} diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/HazelcastCoreTopologyService.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/HazelcastCoreTopologyService.java index 4c27f292ffdb1..0a28b1144af5b 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/HazelcastCoreTopologyService.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/HazelcastCoreTopologyService.java @@ -253,7 +253,7 @@ private void refreshCoreTopology() { CoreTopology newCoreTopology = getCoreTopology( hazelcastInstance, config, log ); - CoreTopology.CoreTopologyDifference difference = coreTopology.difference( newCoreTopology ); + TopologyDifference difference = coreTopology.difference( newCoreTopology ); if ( difference.hasChanges() ) { log.info( "Core topology changed %s", difference ); @@ -267,7 +267,7 @@ private void refreshReadReplicaTopology() { ReadReplicaTopology newReadReplicaTopology = getReadReplicaTopology( hazelcastInstance, log ); - ReadReplicaTopology.ReadReplicaTopologyDifference difference = readReplicaTopology.difference( newReadReplicaTopology ); + TopologyDifference difference = readReplicaTopology.difference( newReadReplicaTopology ); if ( difference.hasChanges() ) { log.info( "Read replica topology changed %s", difference ); diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/ReadReplicaTopology.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/ReadReplicaTopology.java index 17dc8fe117980..1b4536b43fd5e 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/ReadReplicaTopology.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/ReadReplicaTopology.java @@ -29,6 +29,8 @@ import static java.util.Collections.emptyMap; import static java.util.stream.Collectors.toSet; +import static org.neo4j.causalclustering.discovery.Difference.asDifference; + public class ReadReplicaTopology { @@ -74,73 +76,17 @@ public Optional anyReadReplicaMemberId() } } - ReadReplicaTopologyDifference difference( ReadReplicaTopology other ) + TopologyDifference difference( ReadReplicaTopology other ) { Set members = readReplicaMembers.keySet(); Set otherMembers = other.readReplicaMembers.keySet(); - Set added = otherMembers.stream().filter( m -> !members.contains( m ) ) + Set added = otherMembers.stream().filter( m -> !members.contains( m ) ) .map( memberId -> asDifference( other, memberId ) ).collect( toSet() ); - Set removed = members.stream().filter( m -> !otherMembers.contains( m ) ) + Set removed = members.stream().filter( m -> !otherMembers.contains( m ) ) .map( memberId -> asDifference( ReadReplicaTopology.this, memberId ) ).collect( toSet() ); - return new ReadReplicaTopologyDifference( added, removed ); - } - - private ReadReplicaTopology.Difference asDifference( ReadReplicaTopology topology, MemberId memberId ) - { - return new ReadReplicaTopology.Difference( memberId, topology.find( memberId ).orElse( null ) ); - } - - class ReadReplicaTopologyDifference - { - private Set added; - private Set removed; - - ReadReplicaTopologyDifference( Set added, Set removed ) - { - this.added = added; - this.removed = removed; - } - - Set added() - { - return added; - } - - Set removed() - { - return removed; - } - - boolean hasChanges() - { - return added.size() > 0 || removed.size() > 0; - } - - @Override - public String toString() - { - return String.format( "{added=%s, removed=%s}", added, removed ); - } - } - - private class Difference - { - private MemberId memberId; - private ReadReplicaInfo readReplicaInfo; - - Difference( MemberId memberId, ReadReplicaInfo readReplicaInfo ) - { - this.memberId = memberId; - this.readReplicaInfo = readReplicaInfo; - } - - @Override - public String toString() - { - return String.format( "{memberId=%s, readReplicaInfo=%s}", memberId, readReplicaInfo ); - } + return new TopologyDifference( added, removed ); } } diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/TopologyDifference.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/TopologyDifference.java new file mode 100644 index 0000000000000..0a90ccb55042e --- /dev/null +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/discovery/TopologyDifference.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2017 "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 . + */ +package org.neo4j.causalclustering.discovery; + +import java.util.Set; + +class TopologyDifference +{ + private Set added; + private Set removed; + + TopologyDifference( Set added, Set removed ) + { + this.added = added; + this.removed = removed; + } + + Set added() + { + return added; + } + + Set removed() + { + return removed; + } + + boolean hasChanges() + { + return added.size() > 0 || removed.size() > 0; + } + + @Override + public String toString() + { + return String.format( "{added=%s, removed=%s}", added, removed ); + } +} diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreTopologyTest.java b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreTopologyTest.java index bb7eb918f6e87..6d4b8a9176cba 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreTopologyTest.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreTopologyTest.java @@ -48,7 +48,7 @@ public void identicalTopologiesShouldHaveNoDifference() throws Exception CoreTopology topology = new CoreTopology( new ClusterId( UUID.randomUUID() ), true, coreMembers ); // when - CoreTopology.CoreTopologyDifference diff = topology.difference(topology); + TopologyDifference diff = topology.difference(topology); // then assertThat( diff.added().size(), Matchers.equalTo( 0 ) ); @@ -74,7 +74,7 @@ public void shouldDetectAddedMembers() throws Exception CoreTopology topology = new CoreTopology( new ClusterId( UUID.randomUUID() ), true, initialMembers ); // when - CoreTopology.CoreTopologyDifference diff = topology.difference(new CoreTopology( new ClusterId( UUID.randomUUID() ), true, newMembers )); + TopologyDifference diff = topology.difference(new CoreTopology( new ClusterId( UUID.randomUUID() ), true, newMembers )); // then assertThat( diff.added().size(), Matchers.equalTo( 1 ) ); @@ -98,7 +98,7 @@ public void shouldDetectRemovedMembers() throws Exception CoreTopology topology = new CoreTopology( new ClusterId( UUID.randomUUID() ), true, initialMembers ); // when - CoreTopology.CoreTopologyDifference diff = topology.difference(new CoreTopology( new ClusterId( UUID.randomUUID() ), true, newMembers )); + TopologyDifference diff = topology.difference(new CoreTopology( new ClusterId( UUID.randomUUID() ), true, newMembers )); // then assertThat( diff.added().size(), Matchers.equalTo( 0 ) ); @@ -121,7 +121,7 @@ public void shouldDetectAddedAndRemovedMembers() throws Exception CoreTopology topology = new CoreTopology( new ClusterId( UUID.randomUUID() ), true, initialMembers ); // when - CoreTopology.CoreTopologyDifference diff = topology.difference(new CoreTopology( new ClusterId( UUID.randomUUID() ), true, newMembers )); + TopologyDifference diff = topology.difference(new CoreTopology( new ClusterId( UUID.randomUUID() ), true, newMembers )); // then assertThat( diff.added().size(), Matchers.equalTo( 2 ) ); diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/ReadReplicaTopologyTest.java b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/ReadReplicaTopologyTest.java index 6b7fcd96dd6c6..0f6501c5a8cba 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/ReadReplicaTopologyTest.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/ReadReplicaTopologyTest.java @@ -26,7 +26,6 @@ import org.hamcrest.Matchers; import org.junit.Test; -import org.neo4j.causalclustering.identity.ClusterId; import org.neo4j.causalclustering.identity.MemberId; import static org.hamcrest.MatcherAssert.assertThat; @@ -48,7 +47,7 @@ public void identicalTopologiesShouldHaveNoDifference() throws Exception ReadReplicaTopology topology = new ReadReplicaTopology( readReplicaMembers ); // when - ReadReplicaTopology.ReadReplicaTopologyDifference diff = topology.difference(topology); + TopologyDifference diff = topology.difference(topology); // then assertThat( diff.added().size(), Matchers.equalTo( 0 ) ); @@ -74,7 +73,7 @@ public void shouldDetectAddedMembers() throws Exception ReadReplicaTopology topology = new ReadReplicaTopology( initialMembers ); // when - ReadReplicaTopology.ReadReplicaTopologyDifference diff = topology.difference(new ReadReplicaTopology( newMembers )); + TopologyDifference diff = topology.difference(new ReadReplicaTopology( newMembers )); // then assertThat( diff.added().size(), Matchers.equalTo( 1 ) ); @@ -98,7 +97,7 @@ public void shouldDetectRemovedMembers() throws Exception ReadReplicaTopology topology = new ReadReplicaTopology( initialMembers ); // when - ReadReplicaTopology.ReadReplicaTopologyDifference diff = topology.difference(new ReadReplicaTopology( newMembers )); + TopologyDifference diff = topology.difference(new ReadReplicaTopology( newMembers )); // then assertThat( diff.added().size(), Matchers.equalTo( 0 ) ); @@ -121,7 +120,7 @@ public void shouldDetectAddedAndRemovedMembers() throws Exception ReadReplicaTopology topology = new ReadReplicaTopology( initialMembers ); // when - ReadReplicaTopology.ReadReplicaTopologyDifference diff = topology.difference(new ReadReplicaTopology( newMembers )); + TopologyDifference diff = topology.difference(new ReadReplicaTopology( newMembers )); // then assertThat( diff.added().size(), Matchers.equalTo( 2 ) );