From 38bcccfe0faf70bc80ad56b71fc74f0f09997902 Mon Sep 17 00:00:00 2001 From: Daniel Lucas <dl3g19@soton.ac.uk> Date: Fri, 7 May 2021 22:10:54 +0100 Subject: [PATCH] FINALLY I can run this on all the stores without unexpected errors. Concurrency fixes were necessary. --- Controller.java | 33 +++++++-- DstoreConnection.java | 17 +++-- error.txt | 168 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+), 14 deletions(-) create mode 100644 error.txt diff --git a/Controller.java b/Controller.java index 1866ab2..07d5edc 100644 --- a/Controller.java +++ b/Controller.java @@ -327,12 +327,13 @@ public class Controller { } catch(Exception e) { //Log error - System.out.println("Error processing store ack from dstore " + thisStore); + System.err.println("Error processing store ack from dstore " + thisStore); + e.printStackTrace(); } } else { //Log error - System.out.println("Dstore " + thisStore + " should have sent STORE_ACK but Controller received " + receivedMessage[0]); + System.err.println("Dstore " + thisStore + " should have sent STORE_ACK but Controller received " + receivedMessage[0]); } } catch(DstoreDisconnectException e) { @@ -437,15 +438,18 @@ public class Controller { void remove(Socket client, String filename) throws Exception { try { IndexEntry entry; + System.out.println("About to remove " + filename); try { synchronized(index) { entry = index.get(filename); if(entry == null || entry.getStatus() != IndexEntry.Status.STORE_COMPLETE) { + System.out.println("Oops, " + filename + " does not exist!"); throw new InvalidStatusException(); } //Update index to "remove in progress" entry.setStatus(IndexEntry.Status.REMOVE_IN_PROGRESS); + System.out.println("Remove status for " + filename + " set!"); } } catch(InvalidStatusException e) { @@ -453,12 +457,19 @@ public class Controller { clientOut.println(Protocol.ERROR_FILE_DOES_NOT_EXIST_TOKEN); clientOut.flush(); messageSent(client, Protocol.ERROR_FILE_DOES_NOT_EXIST_TOKEN); + System.out.println("Informed client that " + filename + " does not exist"); return; } //Send REMOVE message to all Dstores storing the file - CountDownLatch latch = new CountDownLatch(entry.getStoredBy().size()); - Iterator<Integer> it = entry.getStoredBy().iterator(); + List<Integer> storedBy; + CountDownLatch latch; + Iterator<Integer> it; + synchronized(entry.getStoredBy()) { + storedBy = new ArrayList<Integer>(entry.getStoredBy()); + } + latch = new CountDownLatch(storedBy.size()); + it = storedBy.iterator(); while(it.hasNext()) { Integer dstore = it.next(); new Thread(() -> { @@ -508,8 +519,17 @@ public class Controller { System.out.println("Fetching list..."); //Send file list to client String message = Protocol.LIST_TOKEN + " "; - for(String name : index.keySet()) { - if(index.get(name).getStatus() == IndexEntry.Status.STORE_COMPLETE) message = message + name + " "; + Iterator<String> it; + synchronized(index) { + it = index.keySet().iterator(); + while(it.hasNext()) { + String name = it.next(); + IndexEntry entry = index.get(name); + synchronized(entry) { + if(entry != null && entry.getStatus() == IndexEntry.Status.STORE_COMPLETE) + message = message + name + " "; + } + } } PrintWriter out = new PrintWriter(client.getOutputStream()); System.out.println("Sending..."); @@ -537,6 +557,7 @@ public class Controller { catch(DstoreDisconnectException e) { e.printStackTrace(); removeDstore(e); + listLatch.countDown(); } }); thisThread.start(); diff --git a/DstoreConnection.java b/DstoreConnection.java index 3ecc064..c8550c1 100644 --- a/DstoreConnection.java +++ b/DstoreConnection.java @@ -19,7 +19,6 @@ public class DstoreConnection { protected boolean available; protected List<String> queue; protected int timeout; - protected DstoreDisconnectException disconnectException; public DstoreConnection(Socket socket, int port, int timeout) { this.socket = socket; @@ -30,7 +29,6 @@ public class DstoreConnection { writer = new PrintWriter(socket.getOutputStream()); available = true; queue = new ArrayList<String>(); - disconnectException = new DstoreDisconnectException(this); } catch(IOException e) { e.printStackTrace(); @@ -51,7 +49,7 @@ public class DstoreConnection { } public DstoreDisconnectException getDisconnectData() { - return disconnectException; + return new DstoreDisconnectException(this); } public String sendAndReceive(String message, String... expectedMessages) throws DstoreDisconnectException { @@ -59,7 +57,7 @@ public class DstoreConnection { synchronized(this) { try { System.out.println("Lock acquired"); - if(!available) throw disconnectException; + if(!available) throw getDisconnectData(); writer.println(message); writer.flush(); //System.out.println("Controller sent " + message + " to port " + port); @@ -69,7 +67,7 @@ public class DstoreConnection { catch(NullPointerException e) { System.out.println("Dstore at port " + port + " disconnected"); available = false; - throw disconnectException; + throw getDisconnectData(); } } } @@ -83,7 +81,7 @@ public class DstoreConnection { System.out.println("Getting lock..."); synchronized(this) { System.out.println("Lock acquired"); - if(!available) throw disconnectException; + if(!available) throw getDisconnectData(); //Check the queue twice: once incase the receiver is busy, twice incase the message was added by the last thread findMessage = checkQueue(expectedMessages); @@ -120,7 +118,7 @@ public class DstoreConnection { ReceiveContext rc = new ReceiveContext(expectedMessages); rc.start(); if(rc.latch.await(timeout, TimeUnit.MILLISECONDS)) { - if(rc.disconnected()) throw disconnectException; + if(rc.disconnected()) throw getDisconnectData(); else return rc.getReturnMessage(); } else { @@ -219,7 +217,10 @@ public class DstoreConnection { } public void end() { - if(thread.isAlive()) thread.interrupt(); + if(thread.isAlive()) { + thread.interrupt(); + System.err.println("Controller read timed out"); + } } public boolean disconnected() { diff --git a/error.txt b/error.txt new file mode 100644 index 0000000..8c2cb7d --- /dev/null +++ b/error.txt @@ -0,0 +1,168 @@ +FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file SnowHalation.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file SnowHalation.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file GameDotCom.jpg - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file rap.mp3 - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file spurk.jpg - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file spurk.jpg - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Grandad.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file AllStar.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file PumpkinHill.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) +FileAlreadyExistsException: Error trying to store file Unknown.txt - file already exists + at Client.a(SourceFile:277) + at Client.store(SourceFile:183) + at Client.store(SourceFile:156) + at ClientMain.test2Client(ClientMain.java:44) + at ClientMain$1.run(ClientMain.java:26) -- GitLab