From 1c558588dbc7834bcae1d54dc9b9084d48d0ebe3 Mon Sep 17 00:00:00 2001
From: "isaacklugman@gmail.com" <ik1g19@soton.ac.uk>
Date: Thu, 6 May 2021 18:59:15 +0100
Subject: [PATCH] start work on rebalance

---
 src/ftp/Controller.java       | 45 +++++++++++++++++++++++++++++++++--
 src/ftp/DStore.java           | 10 ++++----
 src/ftp/DStoreConnection.java |  4 ++++
 3 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java
index c8ae27f..a7b6525 100644
--- a/src/ftp/Controller.java
+++ b/src/ftp/Controller.java
@@ -64,9 +64,9 @@ public class Controller extends Server {
 
             Integer port = Integer.parseInt(args[1]);
 
-            send("LIST", dStoreSock, "DataStore");
 
-            String files = readSocket(dStoreSock);
+            rebalance();
+
 
             DStoreConnection dStore;
 
@@ -227,4 +227,45 @@ public class Controller extends Server {
         return dStore;
     }
 
+
+
+    public void rebalance() {
+        Integer nODS = dStoreIndex.entrySet().size();
+
+        Boolean rCopies = fileIndex.entrySet().stream().
+                map(x -> x.getValue().getDStores().size() == r).
+                reduce(true, (a,b) -> a && b);
+
+
+        List<DStoreConnection> lightDStores = dStoreIndex.entrySet().stream().
+                map(x -> x.getValue()).
+                filter(x -> {
+                    Integer nOF = x.getFileIndex().size();
+                    return nOF < Math.floor(r * nOF / nODS);
+                }).
+                collect(Collectors.toList());
+
+
+        List<DStoreConnection> bloatedDStores = dStoreIndex.entrySet().stream().
+                map(x -> x.getValue()).
+                filter(x -> {
+                    Integer nOF = x.getFileIndex().size();
+                    return nOF < Math.ceil(r * nOF / nODS);
+                }).
+                collect(Collectors.toList());
+
+
+        if (rCopies && lightDStores.isEmpty() && bloatedDStores.isEmpty()) {
+
+        }
+        else {
+            DStoreConnection dStore = bloatedDStores.get(0);
+            String firstFilename = (String) dStore.getFileIndex().values().toArray()[0];
+            dStore.removeFile(firstFilename);
+
+            DStoreConnection dStore2 = lightDStores.get(0);
+            dStore2.addFile();
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/src/ftp/DStore.java b/src/ftp/DStore.java
index 89d6a60..aa4f913 100644
--- a/src/ftp/DStore.java
+++ b/src/ftp/DStore.java
@@ -33,6 +33,7 @@ public class DStore extends Server {
 
 
         if (controller != null) {
+            for(File file: new File(file_folder).listFiles()) file.delete();
             send("JOIN " + port, controller, "Controller");
             handleRequest(readSocket(controller), controller);
             start();
@@ -92,16 +93,13 @@ public class DStore extends Server {
 
 
             if (folder.listFiles().length > 0) {
-                List<String> files = Arrays.stream(folder.listFiles()).
+                fileMessage = Arrays.stream(folder.listFiles()).
                         map(x -> x.getName() + " " + x.length()).
-                        collect(Collectors.toList());
-
-
-                fileMessage = files.stream().collect(Collectors.joining("|"));
+                        collect(Collectors.joining("|"));
             }
 
 
-            send(fileMessage, controller, "Controller");
+            send("LIST " + fileMessage, controller, "Controller");
 
 
             String response = readSocket(controller);
diff --git a/src/ftp/DStoreConnection.java b/src/ftp/DStoreConnection.java
index 94e0fda..ee5a274 100644
--- a/src/ftp/DStoreConnection.java
+++ b/src/ftp/DStoreConnection.java
@@ -54,4 +54,8 @@ public class DStoreConnection {
 
     public int getID() { return id; }
 
+
+
+    public FileIndex getFileIndex() { return file_index; }
+
 }
-- 
GitLab