From 036519de7444e91580901e88e69e3ad1f6539f52 Mon Sep 17 00:00:00 2001 From: "isaacklugman@gmail.com" <ik1g19@soton.ac.uk> Date: Tue, 4 May 2021 23:23:00 +0100 Subject: [PATCH] fixed bug in remove operation - Error - "An established connection was aborted by the software in your host machine" - Cause - Controller was closing connection before DStore could respond --- src/ftp/Controller.java | 21 ++++++++++++++------- src/ftp/DStore.java | 23 +++++++++++++++-------- src/ftp/DStoreConnection.java | 4 ++++ src/ftp/Server.java | 8 ++++---- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java index 30c4ecf..aac7c3f 100644 --- a/src/ftp/Controller.java +++ b/src/ftp/Controller.java @@ -64,7 +64,7 @@ public class Controller extends Server { Integer port = Integer.parseInt(args[1]); - send("LIST", dStoreSock); + send("LIST", dStoreSock, "DataStore"); String files = readSocket(dStoreSock); @@ -91,7 +91,7 @@ public class Controller extends Server { nextID++; - send("JOINED", dStoreSock); + send("JOINED", dStoreSock, "DataStore"); } else if (command.equals("STORE")) { @@ -118,7 +118,7 @@ public class Controller extends Server { file.setAcksQuota(r); - send("STORE_TO " + ports, client); + send("STORE_TO " + ports, client, "Client"); Boolean fileStored = false; @@ -129,7 +129,7 @@ public class Controller extends Server { threadIDOutput("Store of file " + filename + " complete"); - send("STORE_COMPLETE", client); + send("STORE_COMPLETE", client, "Client"); } } } @@ -147,7 +147,7 @@ public class Controller extends Server { DStoreFile file = fileIndex.get(filename); int dStorePort = file.getDstore().getPort(); - send("LOAD_FROM " + dStorePort + " " + file.getFilesize(), client); + send("LOAD_FROM " + dStorePort + " " + file.getFilesize(), client, "Client"); } else if (command.equals("REMOVE")) { @@ -164,22 +164,29 @@ public class Controller extends Server { Socket dStore = connectToDStore(x.getValue()); if (dStore != null) { - send("REMOVE " + filename, dStore); + send("REMOVE " + filename, dStore, "DataStore"); } else threadIDErr("Unable to connect to DataStore"); closeConnection("DataStore", dStore); + + + x.getValue().removeFile(filename); }); Boolean fileRemoved = false; while (!fileRemoved) { if (file.removeAckCheck()) { + fileIndex.remove(filename); + + file.setRemoveInProgress(false); fileRemoved = true; + threadIDOutput("Remove of file " + filename + " complete"); - send("STORE_COMPLETE", client); + send("REMOVE_COMPLETE", client, "Client"); } } } diff --git a/src/ftp/DStore.java b/src/ftp/DStore.java index d252896..89d6a60 100644 --- a/src/ftp/DStore.java +++ b/src/ftp/DStore.java @@ -33,7 +33,7 @@ public class DStore extends Server { if (controller != null) { - send("JOIN " + port, controller); + send("JOIN " + port, controller, "Controller"); handleRequest(readSocket(controller), controller); start(); } @@ -101,21 +101,21 @@ public class DStore extends Server { } - send(fileMessage, controller); + send(fileMessage, controller, "Controller"); String response = readSocket(controller); if (response.equals("JOINED")) threadIDOutput("Successfully joined Controller"); - closeConnection("Client", controller); + closeConnection("Controller", controller); } else if (command.equals("STORE")) { String filename = args[1]; Long filesize = Long.parseLong(args[2]); - send("ACK", client); + send("ACK", client, "Client"); try { @@ -128,7 +128,7 @@ public class DStore extends Server { Socket controller = connectToController(); if (controller != null) { - send("STORE_ACK " + filename, controller); + send("STORE_ACK " + filename, controller, "Controller"); } else threadIDErr("Unable to connect to Controller"); closeConnection("Controller", controller); @@ -145,14 +145,21 @@ public class DStore extends Server { } else if (command.equals("REMOVE")) { - Socket controller = client; - String filename = args[1]; + if (deleteFile(file_folder + "\\" + filename)) threadIDOutput("Deleted file " + filename); else threadIDErr("Failed to delete file " + filename); - send("REMOVE_ACK", controller); + + Socket controller = connectToController(); + + if (controller != null) { + send("REMOVE_ACK " + filename, controller, "Controller"); + } + else threadIDErr("Unable to connect to Controller"); + + closeConnection("Controller", controller); } } diff --git a/src/ftp/DStoreConnection.java b/src/ftp/DStoreConnection.java index 7c0aa08..94e0fda 100644 --- a/src/ftp/DStoreConnection.java +++ b/src/ftp/DStoreConnection.java @@ -44,6 +44,10 @@ public class DStoreConnection { + public void removeFile(String filename) { file_index.remove(filename); } + + + public int getPort() { return port; } diff --git a/src/ftp/Server.java b/src/ftp/Server.java index c5e1469..f3e35b8 100644 --- a/src/ftp/Server.java +++ b/src/ftp/Server.java @@ -50,25 +50,25 @@ public abstract class Server { - protected void send(String msg, Socket socket) { + protected void send(String msg, Socket socket, String destinationName) { try { PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println(msg); out.flush(); - threadIDOutput("Sent: " + msg); + threadIDOutput("Sent: \"" + msg + "\" to " + destinationName + " on port: " + socket.getPort()); } catch (IOException e) { threadIDErr("Error: " + e); } } - protected void send(String msg, String hostname, int port) { + protected void send(String msg, String hostname, int port, String destinationName) { try { Socket socket = new Socket(hostname, port); PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println(msg); out.flush(); - threadIDOutput("Sent: " + msg); + threadIDOutput("Sent: \"" + msg + "\" to " + destinationName); } catch (IOException e) { threadIDErr("Error: " + e); -- GitLab