From 489cd721117cdc5b66bbe3bc180bdfab7aaae301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Mon, 16 Jan 2012 21:16:34 +0100 Subject: Fix network joining. Prevent infinite loop in master thread. --- same/src/main/java/com/orbekk/same/ClientApp.java | 2 ++ .../java/com/orbekk/same/ClientServiceImpl.java | 10 +++++++++ same/src/main/java/com/orbekk/same/MasterApp.java | 4 ++++ .../java/com/orbekk/same/MasterServiceImpl.java | 24 +++++++++++++--------- .../main/java/com/orbekk/same/TestBroadcaster.java | 24 ++++++++++++++++++++++ .../com/orbekk/same/TestConnectionManager.java | 24 ++++++++++++++++++++++ .../com/orbekk/same/MasterServiceImplTest.java | 8 ++++---- .../test/java/com/orbekk/same/TestBroadcaster.java | 24 ---------------------- .../com/orbekk/same/TestConnectionManager.java | 24 ---------------------- 9 files changed, 82 insertions(+), 62 deletions(-) create mode 100644 same/src/main/java/com/orbekk/same/TestBroadcaster.java create mode 100644 same/src/main/java/com/orbekk/same/TestConnectionManager.java delete mode 100644 same/src/test/java/com/orbekk/same/TestBroadcaster.java delete mode 100644 same/src/test/java/com/orbekk/same/TestConnectionManager.java (limited to 'same/src') diff --git a/same/src/main/java/com/orbekk/same/ClientApp.java b/same/src/main/java/com/orbekk/same/ClientApp.java index 69997ca..bf391dc 100644 --- a/same/src/main/java/com/orbekk/same/ClientApp.java +++ b/same/src/main/java/com/orbekk/same/ClientApp.java @@ -42,6 +42,8 @@ public class ClientApp { } } + client.joinNetwork(masterUrl + "MasterService.json"); + try { server.join(); } catch (InterruptedException e) { diff --git a/same/src/main/java/com/orbekk/same/ClientServiceImpl.java b/same/src/main/java/com/orbekk/same/ClientServiceImpl.java index c648abd..6675c15 100644 --- a/same/src/main/java/com/orbekk/same/ClientServiceImpl.java +++ b/same/src/main/java/com/orbekk/same/ClientServiceImpl.java @@ -34,6 +34,16 @@ public class ClientServiceImpl implements ClientService, UrlReceiver { return myUrl; } + public void joinNetwork(String masterUrl) { + if (myUrl != null) { + MasterService master = connections.getMaster(masterUrl); + master.joinNetworkRequest(myUrl); + } else { + logger.error("Tried to join network at {}, but my url is unknown. " + + "Run discovery service.", masterUrl); + } + } + State testGetState() { return state; } diff --git a/same/src/main/java/com/orbekk/same/MasterApp.java b/same/src/main/java/com/orbekk/same/MasterApp.java index c4154da..3e22563 100644 --- a/same/src/main/java/com/orbekk/same/MasterApp.java +++ b/same/src/main/java/com/orbekk/same/MasterApp.java @@ -22,6 +22,9 @@ public class MasterApp { RpcHandler rpcHandler = new RpcHandler(jsonServer, master); server.setHandler(rpcHandler); + Thread masterThread = new Thread(master); + masterThread.start(); + try { server.start(); } catch (Exception e) { @@ -30,6 +33,7 @@ public class MasterApp { try { server.join(); + masterThread.join(); } catch (InterruptedException e) { logger.info("Received exception. Exiting. {}", e); } diff --git a/same/src/main/java/com/orbekk/same/MasterServiceImpl.java b/same/src/main/java/com/orbekk/same/MasterServiceImpl.java index 410def8..729c0ba 100644 --- a/same/src/main/java/com/orbekk/same/MasterServiceImpl.java +++ b/same/src/main/java/com/orbekk/same/MasterServiceImpl.java @@ -24,6 +24,7 @@ public class MasterServiceImpl implements MasterService, UrlReceiver, Runnable { @Override public void joinNetworkRequest(String clientUrl) { + logger.info("JoinNetworkRequest({})", clientUrl); List participants = participants(); if (!participants.contains(clientUrl)) { participants.add(clientUrl); @@ -53,17 +54,20 @@ public class MasterServiceImpl implements MasterService, UrlReceiver, Runnable { return worked; } - public boolean _sendFullState() { - boolean worked = _fullStateReceivers.size() != 0; - final List components = state.getComponents(); - broadcaster.broadcast(participants(), new ServiceOperation() { - @Override public void run(ClientService client) { - for (Component c : components) { - client.setState(c.getName(), c.getData(), c.getRevision()); + public synchronized boolean _sendFullState() { + boolean hasWork = _fullStateReceivers.size() != 0; + if (hasWork) { + final List components = state.getComponents(); + broadcaster.broadcast(participants(), new ServiceOperation() { + @Override public void run(ClientService client) { + for (Component c : components) { + client.setState(c.getName(), c.getData(), c.getRevision()); + } } - } - }); - return worked; + }); + _fullStateReceivers.clear(); + } + return hasWork; } private List participants() { diff --git a/same/src/main/java/com/orbekk/same/TestBroadcaster.java b/same/src/main/java/com/orbekk/same/TestBroadcaster.java new file mode 100644 index 0000000..434b107 --- /dev/null +++ b/same/src/main/java/com/orbekk/same/TestBroadcaster.java @@ -0,0 +1,24 @@ +package com.orbekk.same; + +import java.util.List; +import org.junit.Ignore; + +@Ignore +public class TestBroadcaster implements Broadcaster { + public ConnectionManager connections; + + public TestBroadcaster() { + } + + public TestBroadcaster(ConnectionManager connections) { + this.connections = connections; + } + + public void broadcast(final List targets, + final ServiceOperation operation) { + for (String t : targets) { + ClientService client = connections.getClient(t); + operation.run(client); + } + } +} diff --git a/same/src/main/java/com/orbekk/same/TestConnectionManager.java b/same/src/main/java/com/orbekk/same/TestConnectionManager.java new file mode 100644 index 0000000..a41ec48 --- /dev/null +++ b/same/src/main/java/com/orbekk/same/TestConnectionManager.java @@ -0,0 +1,24 @@ +package com.orbekk.same; + +import java.util.Map; +import java.util.HashMap; +import org.junit.Ignore; + +@Ignore +public class TestConnectionManager implements ConnectionManager { + public Map clientMap = + new HashMap(); + public Map masterMap = + new HashMap(); + + public TestConnectionManager() { + } + + public ClientService getClient(String url) { + return clientMap.get(url); + } + + public MasterService getMaster(String url) { + return masterMap.get(url); + } +} diff --git a/same/src/test/java/com/orbekk/same/MasterServiceImplTest.java b/same/src/test/java/com/orbekk/same/MasterServiceImplTest.java index da45e38..583e464 100644 --- a/same/src/test/java/com/orbekk/same/MasterServiceImplTest.java +++ b/same/src/test/java/com/orbekk/same/MasterServiceImplTest.java @@ -34,7 +34,7 @@ public class MasterServiceImplTest { @Test public void joinNetworkAddsClient() { - master.joinNetworkRequest("TestNetwork", "http://clientUrl"); + master.joinNetworkRequest("http://clientUrl"); List participants = state.getList(".participants"); assertTrue(participants.contains("http://clientUrl")); } @@ -53,7 +53,7 @@ public class MasterServiceImplTest { new State("ClientNetwork"), connections); client.setUrl("http://client/"); connections.clientMap.put("http://client/ClientService.json", client); - master.joinNetworkRequest("TestNetwork", "http://client/ClientService.json"); + master.joinNetworkRequest("http://client/ClientService.json"); assertTrue(master._performWork()); assertTrue(state.getList(".participants").contains("http://client/ClientService.json")); assertEquals(state, client.testGetState()); @@ -71,8 +71,8 @@ public class MasterServiceImplTest { client1.setUrl("http://client2/"); connections.clientMap.put("http://client2/ClientService.json", client2); - master.joinNetworkRequest("TestNetwork", "http://client/ClientService.json"); - master.joinNetworkRequest("TestNetwork", "http://client2/ClientService.json"); + master.joinNetworkRequest("http://client/ClientService.json"); + master.joinNetworkRequest("http://client2/ClientService.json"); assertTrue(master._performWork()); assertTrue(state.getList(".participants").contains("http://client/ClientService.json")); diff --git a/same/src/test/java/com/orbekk/same/TestBroadcaster.java b/same/src/test/java/com/orbekk/same/TestBroadcaster.java deleted file mode 100644 index 434b107..0000000 --- a/same/src/test/java/com/orbekk/same/TestBroadcaster.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.orbekk.same; - -import java.util.List; -import org.junit.Ignore; - -@Ignore -public class TestBroadcaster implements Broadcaster { - public ConnectionManager connections; - - public TestBroadcaster() { - } - - public TestBroadcaster(ConnectionManager connections) { - this.connections = connections; - } - - public void broadcast(final List targets, - final ServiceOperation operation) { - for (String t : targets) { - ClientService client = connections.getClient(t); - operation.run(client); - } - } -} diff --git a/same/src/test/java/com/orbekk/same/TestConnectionManager.java b/same/src/test/java/com/orbekk/same/TestConnectionManager.java deleted file mode 100644 index a41ec48..0000000 --- a/same/src/test/java/com/orbekk/same/TestConnectionManager.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.orbekk.same; - -import java.util.Map; -import java.util.HashMap; -import org.junit.Ignore; - -@Ignore -public class TestConnectionManager implements ConnectionManager { - public Map clientMap = - new HashMap(); - public Map masterMap = - new HashMap(); - - public TestConnectionManager() { - } - - public ClientService getClient(String url) { - return clientMap.get(url); - } - - public MasterService getMaster(String url) { - return masterMap.get(url); - } -} -- cgit v1.2.3