diff --git a/Controller.java b/Controller.java index 1866ab294e69098f9a8cc738461e85305cca98c8..07d5edc07365edc40ecff6b45de2d0cf9cce9331 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 3ecc064be2243e61d26cad76531f6f03ca1299b0..c8550c114eae775b156ede2f6e1311f568108254 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 0000000000000000000000000000000000000000..8c2cb7d80df914f0060e9feea655ab50075fea36 --- /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)