From bb7f22e4b392b897ab8cebbbd9903fa0a21ad0fe Mon Sep 17 00:00:00 2001 From: Ivan Olexyn Date: Mon, 20 Apr 2020 18:43:58 +0200 Subject: [PATCH] ~ sync on rideMap --- TODO.md | 1 + mispbridge/src/core/BridgeServlet.java | 2 +- mispclient/src/core/ClientServlet.java | 2 +- mispmock/src/actor/AppMock.java | 2 +- mispmock/src/actor/UserMock.java | 5 +-- mispmock/src/core/BridgeMock.java | 49 +++++++++++++++----------- mispmock/src/core/Main.java | 3 +- 7 files changed, 35 insertions(+), 29 deletions(-) diff --git a/TODO.md b/TODO.md index a99a0f9..dc3a5f6 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,6 @@ #### TODO +* FIX errors when setting WAIT to low. * In `ClientMock` put `GET (Ride)(Request)(Data)` on it's own thread. * Currently it is on the `POST (Ride)` thread. * It would be better to "decouple" it. diff --git a/mispbridge/src/core/BridgeServlet.java b/mispbridge/src/core/BridgeServlet.java index 2a33e8e..dc86f99 100644 --- a/mispbridge/src/core/BridgeServlet.java +++ b/mispbridge/src/core/BridgeServlet.java @@ -14,7 +14,7 @@ public class BridgeServlet extends HttpServlet { protected static final String MISP_CLIENT_URL = "http://localhost:9090/mispclient/core"; - public Map rideMap = new HashMap<>(); + public final Map rideMap = new HashMap<>(); protected RideMapHelper mapHelper = new RideMapHelper(rideMap); // ####### diff --git a/mispclient/src/core/ClientServlet.java b/mispclient/src/core/ClientServlet.java index 9c8e012..f4175ac 100644 --- a/mispclient/src/core/ClientServlet.java +++ b/mispclient/src/core/ClientServlet.java @@ -20,7 +20,7 @@ public class ClientServlet extends HttpServlet { public static final int AVAILABLE_RIDES_OVERHEAD = 32; - public Map rideMap = new HashMap<>(); + public final Map rideMap = new HashMap<>(); protected RideMapHelper mapHelper = new RideMapHelper(rideMap); public ClientServlet() { diff --git a/mispmock/src/actor/AppMock.java b/mispmock/src/actor/AppMock.java index 243b6c8..da71e0d 100644 --- a/mispmock/src/actor/AppMock.java +++ b/mispmock/src/actor/AppMock.java @@ -24,7 +24,7 @@ public class AppMock extends ActorRunnable { public void run() { while (true) { try { - Thread.sleep(Main.MOCK_SPEED); + Thread.sleep(Main.REQUEST_SPEED); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/mispmock/src/actor/UserMock.java b/mispmock/src/actor/UserMock.java index 41677cf..4289af4 100644 --- a/mispmock/src/actor/UserMock.java +++ b/mispmock/src/actor/UserMock.java @@ -1,11 +1,8 @@ package actor; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.DataOutputStream; import java.io.IOException; -import java.net.HttpURLConnection; import core.*; import exchange.ExchangeMock; @@ -23,7 +20,7 @@ public class UserMock extends ActorRunnable { public void run() { while (true){ try { - Thread.sleep(Main.MOCK_SPEED); + Thread.sleep(Main.REQUEST_SPEED); sendGetRequest(); } catch (IOException | InterruptedException e) { e.printStackTrace(); diff --git a/mispmock/src/core/BridgeMock.java b/mispmock/src/core/BridgeMock.java index a9cf1af..bfb0f45 100644 --- a/mispmock/src/core/BridgeMock.java +++ b/mispmock/src/core/BridgeMock.java @@ -36,25 +36,24 @@ public class BridgeMock extends BridgeServlet { JSONObject obj = new JSONObject(parsedRequest); parsedRequest = obj.getString("request"); - while (mapHelper.containsLess(1, State.AVAILABLE)) { Thread.sleep(Main.MOCK_SPEED); } + synchronized (rideMap) { - Ride ride = null; - for (int i = 0; ride ==null; i++){ - ride = mapHelper.pickAvailable(); - if (i!=0){ - Thread.sleep(Main.MOCK_SPEED);} - } + while (mapHelper.containsLess(1, State.AVAILABLE)) { Thread.sleep(Main.WAIT_SPEED); } + Ride ride = null; + while (ride == null) { + ride = mapHelper.pickAvailable(); + Thread.sleep(Main.WAIT_SPEED); + } - synchronized (ride) { ride.setRequest(parsedRequest); ride.setState(State.BOOKED); while (ride.getState() != State.LOADED) { - ride.notify(); - Thread.sleep(Main.MOCK_SPEED); - ride.wait(); + rideMap.notify(); + Thread.sleep(Main.WAIT_SPEED); + rideMap.wait(); } rideMap.remove(ride.getID()); @@ -65,9 +64,10 @@ public class BridgeMock extends BridgeServlet { writer.flush(); writer.close(); - ride.notify(); + rideMap.notify(); } exchange.notify(); + } } @@ -92,9 +92,10 @@ public class BridgeMock extends BridgeServlet { synchronized (exchange) { String jsonPayload = IOUtils.toString(request.getReader()); Ride parsedRide = new Ride(jsonPayload); - Ride thisRide = rideMap.get(parsedRide.getID()); - synchronized (thisRide) { + + synchronized (rideMap) { + Ride thisRide = rideMap.get(parsedRide.getID()); thisRide.setData(parsedRide.getData()); thisRide.setState(State.LOADED); @@ -104,9 +105,14 @@ public class BridgeMock extends BridgeServlet { writer.flush(); writer.close(); - thisRide.notify(); + + if (thisRide.getID() == 100000L) { + int br = 0; + } + rideMap.notify(); } exchange.notify(); + //rideMap.remove(thisRide.getID()); } } @@ -124,22 +130,23 @@ public class BridgeMock extends BridgeServlet { synchronized (exchange) { String jsonPayload = IOUtils.toString(request.getReader()); - Ride ride = new Ride(jsonPayload); - synchronized (ride) { + + synchronized (rideMap) { + Ride ride = new Ride(jsonPayload); rideMap.put(ride.getID(), ride.setState(State.AVAILABLE)); while (ride.getState() == State.AVAILABLE) { - ride.notify(); - Thread.sleep(Main.MOCK_SPEED); - ride.wait(); + rideMap.notify(); + Thread.sleep(Main.WAIT_SPEED); + rideMap.wait(); } exchange.response.setStatus(200); PrintWriter writer = response.getWriter(); writer.write(ride.json()); writer.flush(); writer.close(); - ride.notify(); + rideMap.notify(); } exchange.notify(); } diff --git a/mispmock/src/core/Main.java b/mispmock/src/core/Main.java index 592baa4..830de27 100644 --- a/mispmock/src/core/Main.java +++ b/mispmock/src/core/Main.java @@ -5,7 +5,8 @@ import actor.UserMock; public class Main { - final public static int MOCK_SPEED = 0; + final public static int WAIT_SPEED = 10; + final public static int REQUEST_SPEED = 1;