diff --git a/src/Controller.java b/src/Controller.java index 129de965e6a359a816176ade5533ede48af1d6da..46c08b82b92a295f874a7e4616ae54d013ccade0 100644 --- a/src/Controller.java +++ b/src/Controller.java @@ -76,7 +76,18 @@ public class Controller { /** * TODO Send store commands to client */ - private static void storeCommand(Socket client) { + private static synchronized void storeCommand(Socket client) { + //If file already exists, send error + + //If file does not exist, add as empty entry, select r DStores + + //Send list of store ports to client + + //Wait for store ack from each client + + //If any not received, remove from index and decrease DStore numbers + + //If all received, send ack to client, store list to index & increment DStore numbers } @@ -147,49 +158,49 @@ public class Controller { } /** - * TODO Remove given file from all DStores + * Remove given file from all DStores */ private static void removeCommand(String fileName, Socket client) { try { //Create output stream to client PrintWriter clientOut = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); + int[] stores; - //If file does not exist - if (!index.containsKey(fileName)) { - clientOut.println("ERROR_FILE_DOES_NOT_EXIST"); - clientOut.flush(); - } else { - //Get list of DStores associated with given filename - int[] stores = index.get(fileName); + synchronized (index) { + if (!index.containsKey(fileName)) { + //If file does not exist, send error message + clientOut.println("ERROR_FILE_DOES_NOT_EXIST"); + clientOut.flush(); + return; + } else { + //If file does exist, get dStores & remove from index + stores = index.get(fileName); + index.remove(fileName); + } + } - //For each DStore, send "delete filename" command in new thread - for (int store : stores) { - decreaseDStore(store); - - new Thread(() -> { - try { - //Send "REMOVE filename" - PrintWriter out = new PrintWriter(dStores.get(store).getOutputStream()); - out.println("REMOVE " + fileName); - out.flush(); - - //Wait for acknowledgement - BufferedReader in = new BufferedReader(new InputStreamReader(dStores.get(store).getInputStream())); - while (true) { - String response = in.readLine(); - if(!(response == null) && response.equals("REMOVE_ACK " + fileName)){ - break; - } - } - } catch (Exception e) { - System.out.println("error "+e); - } - }).start(); + synchronized (dStores) { + //Reduce file count for each DStore + synchronized (storeNumbers) { + for (int store : stores) { + decreaseDStore(store); + } } - //Remove file from index - synchronized (index) { - index.remove(fileName); + //Send remove command for each DStore + for (int store : stores) { + PrintWriter out = new PrintWriter(dStores.get(store).getOutputStream()); + out.println("REMOVE " + fileName); + out.flush(); + + //Wait for acknowledgement + BufferedReader in = new BufferedReader(new InputStreamReader(dStores.get(store).getInputStream())); + while (true) { + String response = in.readLine(); + if(!(response == null) && response.equals("REMOVE_ACK " + fileName)){ + break; + } + } } //Send acknowledgement to client @@ -197,7 +208,7 @@ public class Controller { clientOut.flush(); clientOut.close(); } - }catch (Exception e) { + } catch (Exception e) { System.out.println("error "+e); } } @@ -285,10 +296,12 @@ public class Controller { */ private static void addDStore(int portNo, int depth){ synchronized (dStores) { - if (!storeNumbers.containsKey(depth)) { - storeNumbers.put(depth, (new ArrayList<>())); + synchronized (storeNumbers) { + if (!storeNumbers.containsKey(depth)) { + storeNumbers.put(depth, (new ArrayList<>())); + } + storeNumbers.get(depth).add(portNo); } - storeNumbers.get(depth).add(portNo); } } @@ -296,14 +309,12 @@ public class Controller { * Increase number of files given DStore has by 1 */ private static void increaseDStore(int portNo) { - synchronized (storeNumbers) { - for (int i = 0; ; i++) { - if (storeNumbers.get(i).contains(portNo)) { - storeNumbers.get(i).remove(portNo); + for (int i = 0; ; i++) { + if (storeNumbers.get(i).contains(portNo)) { + storeNumbers.get(i).remove(portNo); - addDStore(portNo, i + 1); - break; - } + addDStore(portNo, i + 1); + break; } } } @@ -312,14 +323,12 @@ public class Controller { * Decrease number of files given DStore has by 1 */ private static void decreaseDStore(int portNo) { - synchronized (storeNumbers) { - for (int i = 0; ; i++) { - if (storeNumbers.get(i).contains(portNo)) { - storeNumbers.get(i).remove(portNo); + for (int i = 0; ; i++) { + if (storeNumbers.get(i).contains(portNo)) { + storeNumbers.get(i).remove(portNo); - addDStore(portNo, i - 1); - break; - } + addDStore(portNo, i - 1); + break; } } }