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