diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java index c8ae27f0cac085a688756e9016fba837c51fc842..a7b65254b82c927058e8accaa60b6a9e3b6f52ce 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 89d6a6065fe23d64d9d2cd2a452074fd0fcc7d67..aa4f9136fc18fa53fecb20139989c8ac7ee98af1 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 94e0fdaa7d8a063ebae40fac81e812bf82e7ef63..ee5a27467453ab42b78269a420a5621304cf1f90 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; } + }