From 4245908b38faa3fbaa89ceafaf495be5a42e86ac Mon Sep 17 00:00:00 2001 From: Edward Capriolo Date: Mon, 12 Jan 2015 09:35:22 -0500 Subject: [PATCH] Add id field --- .../com/google/code/gossip/GossipMember.java | 24 ++++++++++++++----- .../com/google/code/gossip/GossipService.java | 6 ++--- .../google/code/gossip/LocalGossipMember.java | 4 ++-- .../code/gossip/RemoteGossipMember.java | 8 +++---- .../google/code/gossip/StartupSettings.java | 2 +- .../code/gossip/examples/GossipExample.java | 4 ++-- .../code/gossip/manager/GossipManager.java | 14 +++++------ .../gossip/manager/PassiveGossipThread.java | 5 ++-- ...nlyProcessReceivedPassiveGossipThread.java | 4 ++-- .../manager/random/RandomGossipManager.java | 4 ++-- .../teknek/gossip/TenNodeThreeSeedTest.java | 4 ++-- 11 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/google/code/gossip/GossipMember.java b/src/main/java/com/google/code/gossip/GossipMember.java index 90f4fd2..f34aead 100644 --- a/src/main/java/com/google/code/gossip/GossipMember.java +++ b/src/main/java/com/google/code/gossip/GossipMember.java @@ -17,6 +17,8 @@ public abstract class GossipMember { public static final String JSON_PORT = "port"; /** The JSON key for the heartbeat property. */ public static final String JSON_HEARTBEAT = "heartbeat"; + + public static final String JSON_ID = "id"; /** The hostname or IP address of this gossip member. */ protected String _host; @@ -27,16 +29,19 @@ public abstract class GossipMember { /** The current heartbeat of this gossip member. */ protected int _heartbeat; + protected String _id; + /** * Constructor. * @param host The hostname or IP address. * @param port The port number. * @param heartbeat The current heartbeat. */ - public GossipMember(String host, int port, int heartbeat) { + public GossipMember(String host, int port, String id, int heartbeat) { _host = host; _port = port; _heartbeat = heartbeat; + _id = id; } /** @@ -78,14 +83,20 @@ public abstract class GossipMember { public void setHeartbeat(int heartbeat) { this._heartbeat = heartbeat; } + + + public String getId() { + return _id; + } + + public void setId(String _id) { + this._id = _id; + } - /** - * @see java.lang.Object#toString() - */ public String toString() { - return "Member [address=" + getAddress() + ", heartbeat=" + _heartbeat + "]"; + return "Member [address=" + getAddress() + ", id=" + _id + ", heartbeat=" + _heartbeat + "]"; } - + /** * @see java.lang.Object#hashCode() */ @@ -128,6 +139,7 @@ public abstract class GossipMember { JSONObject jsonObject = new JSONObject(); jsonObject.put(JSON_HOST, _host); jsonObject.put(JSON_PORT, _port); + jsonObject.put(JSON_ID, _id); jsonObject.put(JSON_HEARTBEAT, _heartbeat); return jsonObject; } catch (JSONException e) { diff --git a/src/main/java/com/google/code/gossip/GossipService.java b/src/main/java/com/google/code/gossip/GossipService.java index 2604b8e..cd71731 100644 --- a/src/main/java/com/google/code/gossip/GossipService.java +++ b/src/main/java/com/google/code/gossip/GossipService.java @@ -25,7 +25,7 @@ public class GossipService { * @throws UnknownHostException */ public GossipService(StartupSettings startupSettings) throws InterruptedException, UnknownHostException { - this(InetAddress.getLocalHost().getHostAddress(), startupSettings.getPort(), startupSettings.getLogLevel(), startupSettings.getGossipMembers(), startupSettings.getGossipSettings()); + this(InetAddress.getLocalHost().getHostAddress(), startupSettings.getPort(), "", startupSettings.getLogLevel(), startupSettings.getGossipMembers(), startupSettings.getGossipSettings()); } /** @@ -34,8 +34,8 @@ public class GossipService { * @throws InterruptedException * @throws UnknownHostException */ - public GossipService(String ipAddress, int port, int logLevel, ArrayList gossipMembers, GossipSettings settings) throws InterruptedException, UnknownHostException { - _gossipManager = new RandomGossipManager(ipAddress, port, settings, gossipMembers); + public GossipService(String ipAddress, int port, String id, int logLevel, ArrayList gossipMembers, GossipSettings settings) throws InterruptedException, UnknownHostException { + _gossipManager = new RandomGossipManager(ipAddress, port, id, settings, gossipMembers); } public void start() { diff --git a/src/main/java/com/google/code/gossip/LocalGossipMember.java b/src/main/java/com/google/code/gossip/LocalGossipMember.java index 429f39e..6920d23 100644 --- a/src/main/java/com/google/code/gossip/LocalGossipMember.java +++ b/src/main/java/com/google/code/gossip/LocalGossipMember.java @@ -20,8 +20,8 @@ public class LocalGossipMember extends GossipMember { * @param gossipService The GossipService object. * @param cleanupTimeout The cleanup timeout for this gossip member. */ - public LocalGossipMember(String hostname, int port, int heartbeat, NotificationListener notificationListener, int cleanupTimeout) { - super(hostname, port, heartbeat); + public LocalGossipMember(String hostname, int port, String id, int heartbeat, NotificationListener notificationListener, int cleanupTimeout) { + super(hostname, port, id, heartbeat); this.timeoutTimer = new GossipTimeoutTimer(cleanupTimeout, notificationListener, this); } diff --git a/src/main/java/com/google/code/gossip/RemoteGossipMember.java b/src/main/java/com/google/code/gossip/RemoteGossipMember.java index a133adc..d6403e0 100644 --- a/src/main/java/com/google/code/gossip/RemoteGossipMember.java +++ b/src/main/java/com/google/code/gossip/RemoteGossipMember.java @@ -13,8 +13,8 @@ public class RemoteGossipMember extends GossipMember { * @param port The port number. * @param heartbeat The current heartbeat. */ - public RemoteGossipMember(String hostname, int port, int heartbeat) { - super(hostname, port, heartbeat); + public RemoteGossipMember(String hostname, int port, String id, int heartbeat) { + super(hostname, port, id, heartbeat); } /** @@ -22,7 +22,7 @@ public class RemoteGossipMember extends GossipMember { * @param host The hostname or IP address. * @param port The port number. */ - public RemoteGossipMember(String hostname, int port) { - super(hostname, port, 0); + public RemoteGossipMember(String hostname, int port, String id) { + super(hostname, port, id, 0); } } diff --git a/src/main/java/com/google/code/gossip/StartupSettings.java b/src/main/java/com/google/code/gossip/StartupSettings.java index 442034c..8cc1275 100644 --- a/src/main/java/com/google/code/gossip/StartupSettings.java +++ b/src/main/java/com/google/code/gossip/StartupSettings.java @@ -147,7 +147,7 @@ public class StartupSettings { JSONArray membersJSON = jsonObject.getJSONArray("members"); for (int i=0; i startupMembers = new ArrayList(); for (int i=0; i _activeGossipThreadClass; - public GossipManager(Class passiveGossipThreadClass, Class activeGossipThreadClass, String address, int port, GossipSettings settings, ArrayList gossipMembers) { + public GossipManager(Class passiveGossipThreadClass, + Class activeGossipThreadClass, String address, int port, + String id, GossipSettings settings, ArrayList gossipMembers) { _passiveGossipThreadClass = passiveGossipThreadClass; _activeGossipThreadClass = activeGossipThreadClass; _settings = settings; - _me = new LocalGossipMember(address, port, 0, this, settings.getCleanupInterval()); + _me = new LocalGossipMember(address, port, id, 0, this, settings.getCleanupInterval()); _memberList = new ArrayList(); _deadList = new ArrayList(); - GossipService.LOGGER.debug("Startup member list:"); - GossipService.LOGGER.debug("---------------------"); - GossipService.LOGGER.debug(_me); - for (GossipMember startupMember : gossipMembers) { if (!startupMember.equals(_me)) { - LocalGossipMember member = new LocalGossipMember(startupMember.getHost(), startupMember.getPort(), 0, this, settings.getCleanupInterval()); + LocalGossipMember member = new LocalGossipMember(startupMember.getHost(), + startupMember.getPort(), startupMember.getId(), 0, this, + settings.getCleanupInterval()); _memberList.add(member); GossipService.LOGGER.debug(member); } diff --git a/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java b/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java index 3f51008..61c87bb 100644 --- a/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java +++ b/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java @@ -86,10 +86,11 @@ abstract public class PassiveGossipThread implements Runnable { JSONArray jsonArray = new JSONArray(receivedMessage); for (int i = 0; i < jsonArray.length(); i++) { JSONObject memberJSONObject = jsonArray.getJSONObject(i); - if (memberJSONObject.length() == 3) { + if (memberJSONObject.length() == 4) { RemoteGossipMember member = new RemoteGossipMember( memberJSONObject.getString(GossipMember.JSON_HOST), memberJSONObject.getInt(GossipMember.JSON_PORT), + memberJSONObject.getString(GossipMember.JSON_PORT), memberJSONObject.getInt(GossipMember.JSON_HEARTBEAT)); GossipService.LOGGER.debug(member.toString()); // This is the first member found, so this should be the member who is communicating @@ -100,7 +101,7 @@ abstract public class PassiveGossipThread implements Runnable { remoteGossipMembers.add(member); } else { GossipService.LOGGER - .error("The received member object does not contain 3 objects:\n" + .error("The received member object does not contain 4 objects:\n" + memberJSONObject.toString()); } diff --git a/src/main/java/com/google/code/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java b/src/main/java/com/google/code/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java index dffe9f8..743f555 100644 --- a/src/main/java/com/google/code/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java +++ b/src/main/java/com/google/code/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java @@ -71,14 +71,14 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread // Remove it from the dead list. gossipManager.getDeadList().remove(localDeadMember); // Add it as a new member and add it to the member list. - LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getHost(), remoteMember.getPort(), remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings().getCleanupInterval()); + LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getHost(), remoteMember.getPort(), remoteMember.getId(), remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings().getCleanupInterval()); gossipManager.getMemberList().add(newLocalMember); newLocalMember.startTimeoutTimer(); GossipService.LOGGER.info("Removed remote member " + remoteMember.getAddress() + " from dead list and added to local member list."); } } else { // Brand spanking new member - welcome. - LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getHost(), remoteMember.getPort(), remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings().getCleanupInterval()); + LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getHost(), remoteMember.getPort(), remoteMember.getId(), remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings().getCleanupInterval()); gossipManager.getMemberList().add(newLocalMember); newLocalMember.startTimeoutTimer(); GossipService.LOGGER.info("Added new remote member " + remoteMember.getAddress() + " to local member list."); diff --git a/src/main/java/com/google/code/gossip/manager/random/RandomGossipManager.java b/src/main/java/com/google/code/gossip/manager/random/RandomGossipManager.java index 70e18a0..9e2c60f 100644 --- a/src/main/java/com/google/code/gossip/manager/random/RandomGossipManager.java +++ b/src/main/java/com/google/code/gossip/manager/random/RandomGossipManager.java @@ -8,7 +8,7 @@ import com.google.code.gossip.manager.GossipManager; import com.google.code.gossip.manager.impl.OnlyProcessReceivedPassiveGossipThread; public class RandomGossipManager extends GossipManager { - public RandomGossipManager(String address, int port, GossipSettings settings, ArrayList gossipMembers) { - super(OnlyProcessReceivedPassiveGossipThread.class, RandomActiveGossipThread.class, address, port, settings, gossipMembers); + public RandomGossipManager(String address, int port, String id, GossipSettings settings, ArrayList gossipMembers) { + super(OnlyProcessReceivedPassiveGossipThread.class, RandomActiveGossipThread.class, address, port, id, settings, gossipMembers); } } diff --git a/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java b/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java index 19519bd..eaf77ef 100644 --- a/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java +++ b/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java @@ -22,12 +22,12 @@ public class TenNodeThreeSeedTest { int seedNodes = 3; ArrayList startupMembers = new ArrayList(); for (int i = 1; i < seedNodes+1; ++i) { - startupMembers.add(new RemoteGossipMember("127.0.0." + i, 2000)); + startupMembers.add(new RemoteGossipMember("127.0.0." + i, 2000, i+"")); } ArrayList clients = new ArrayList(); int clusterMembers = 5; for (int i = 1; i < clusterMembers+1; ++i) { - GossipService gossipService = new GossipService("127.0.0."+i, 2000, LogLevel.DEBUG, startupMembers, settings); + GossipService gossipService = new GossipService("127.0.0."+i, 2000, i+"", LogLevel.DEBUG, startupMembers, settings); clients.add(gossipService); gossipService.start(); Thread.sleep(1000);