From e048c5caf68df2b162c8f8f3d186f79fc5f59b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Wed, 18 Jan 2012 12:43:18 +0100 Subject: Fix race condition. When new client joins: Add new participant to participants list before broadcasting new state. --- .../main/java/com/orbekk/same/MasterServiceImpl.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'same/src/main') diff --git a/same/src/main/java/com/orbekk/same/MasterServiceImpl.java b/same/src/main/java/com/orbekk/same/MasterServiceImpl.java index ced0dba..dc5eed3 100644 --- a/same/src/main/java/com/orbekk/same/MasterServiceImpl.java +++ b/same/src/main/java/com/orbekk/same/MasterServiceImpl.java @@ -24,24 +24,22 @@ public class MasterServiceImpl implements MasterService, UrlReceiver, Runnable { } @Override - public void joinNetworkRequest(String clientUrl) { + public synchronized void joinNetworkRequest(String clientUrl) { logger.info("JoinNetworkRequest({})", clientUrl); List participants = participants(); if (!participants.contains(clientUrl)) { participants.add(clientUrl); _fullStateReceivers.add(clientUrl); - synchronized(this) { - state.updateFromObject(".participants", participants, - state.getRevision(".participants") + 1); - notifyAll(); - } + state.updateFromObject(".participants", participants, + state.getRevision(".participants") + 1); + notifyAll(); } else { logger.warn("Client {} already part of network. " + "Ignoring participation request", clientUrl); } } - public boolean _sendUpdatedComponents() { + boolean _sendUpdatedComponents() { boolean worked = false; for (final Component component : state.getAndClearUpdatedComponents()) { logger.info("Broadcasting new component {}", component); @@ -57,11 +55,12 @@ public class MasterServiceImpl implements MasterService, UrlReceiver, Runnable { return list; } - public synchronized boolean _sendFullState() { + synchronized boolean _sendFullState() { boolean hasWork = _fullStateReceivers.size() != 0; if (hasWork) { + logger.info("Sending full state to new participants."); final List components = state.getComponents(); - broadcastNewComponents(participants(), components); + broadcastNewComponents(_fullStateReceivers, components); _fullStateReceivers.clear(); } return hasWork; -- cgit v1.2.3