From bc82a4411a27f77351f6133b4e41d39bb4e44b47 Mon Sep 17 00:00:00 2001
From: Daniel <dl3g19@soton.ac.uk>
Date: Mon, 19 Apr 2021 21:57:32 +0100
Subject: [PATCH] Compiled and ran the classes, system doesn't seem to like
 threading

---
 Controller$IndexEntry.class | Bin 1828 -> 2393 bytes
 Controller$Reloader.class   | Bin 0 -> 389 bytes
 Controller.class            | Bin 7106 -> 10895 bytes
 Controller.java             | 253 ++++++++++++++++++++++++------------
 Dstore.class                | Bin 7816 -> 8724 bytes
 Dstore.java                 | 171 ++++++++++++------------
 DstoreConnection.class      | Bin 0 -> 1529 bytes
 DstoreConnection.java       |  24 ++--
 javac.20210419_161632.args  |   1 +
 9 files changed, 274 insertions(+), 175 deletions(-)
 create mode 100644 Controller$Reloader.class
 create mode 100644 DstoreConnection.class
 create mode 100644 javac.20210419_161632.args

diff --git a/Controller$IndexEntry.class b/Controller$IndexEntry.class
index d745c8e2de25162b50503edcae6b679006643ab7..adc524c042879907e90d45d3d52b889b6660c7ad 100644
GIT binary patch
literal 2393
zcmX^0Z`VEs1_mpJd`<=?24;2!79Ivx1~x_pQRn=;lA`>aoYW!}&%Bh>3fH`nqDn>v
zwvvp@Vif~M1|A=T3TrL~4hBwk1}+{3ZU!Dk27#=^vPAuy#JqHU|D>$c<Pt^(Hk-`6
z%o00B24)S-Fpyn*JPiB{0*nkCX_+~x#hF#9j0}vP><mJT48maDr6rj;`i@0KiIqN?
z#U)$}f()Eo45AET><r>O3=#~Ij0~a(b<QA%CYNO9=M^(D2ozW5C1(`n=Vex<rhqgv
zGAL>IAQXdytToXEKyH%eVUS^vWn|zeF3B%SO>wGZWDvlnPM(KB0pxbxywcpH)S{65
zV32wa1|>!YL9kYZ%shpHqWtut)Z${0!74lqstjt33~a?Ei6y1Qj0{2$W5GcbTvC*o
zmu?MGr@_OZ$)Lr^zymhLF*(~OKRFv!H6%d6s&#l6bV1JLOU}tm%`5TAPXv3Hi$R~k
zfStjRhrx)!n2|vc>~pY9o_Qsy>8VAG4D4lzIi;!oX^aeF8lKRgKvrSR&0xx4#?D~Q
z!(hQ+$;iM5HUk_bpwMGvU`|X)VPp`61}j)A)M1)YAidT+3^ok5j0`N0m}S<`^aQ05
zdmaV{Py%7g%P+}Hs|2ZZ;$d)RaA9O%OH4^|%*kP7kc1ivwha-n))0f;co^J4E@CT6
z&CM@M1)1Q<!{7xnffFJGHiR=cGd(Y{q_ilNkwFy_)?o8MuD5~k!H$N8h_#(HBZE3b
z97!D_g{uUm=Hw@)q!xiy@@pU`e$6mO1{UZ1lvG9rexJ;|R6j_fNKDE}Wn|zkPAzeR
zr*IYxPmpTvbYwy9#FP|p0s<#E-r$nN<ZR!>f)I!S!pOk^a=tal1Pydi?4ANC<%0wZ
z!UmA-2%eAzH2&fK1_cF%Aa?UXnJu*h>S0JOU}WGdPAv(BrgM}O0!`>3M{%Yj)QG?=
z1IGwd5hDY8dTI$I`J*a;rZYwckUwB)o{>QlW(wRNHb{|#8h>2D`K3k4si1gaWZ*}{
zvK}azGcs`ar52ZX<QJE)Gh{L{a3SOw8F)PN@=}YOa}tY-Q;QiHxDZ7nJ3}rbgD^rZ
z+(t$Q4p`!0P-I|Y;9y{2U}s<fm3|Bi3@o4$hk=p7n}LCWiNS|~1yr(t#Z?*9z_ccV
z7MRv$kcF%B6%YUw(+ms@ybO#C+zfsUj12w^3=BmK%nVEn3=DQ!+FKbIwYD>`YcXwQ
z;MLmAAQ-uwL3js)$W{g^E#|EZa#}))TN#wKb~A89Zf9WM%AgKYvz0-6BLf2iBSQcK
z1A`LSwbBfn3^ELS46+O|3~~&L4Dt->3<?ZJ42lf43`z`&41o+mQ2Uh_n85b4X-RKo
z;6<3j1r}9hU}aEaP-F;Zu!X7z`G}E$fq_+P3j^;OxV3ByAVEzAMurf$(f&}Q)wH%S
zNJ;Nt(A&vi!o&~`;_YOxVr0<T!XUSRflF%(gZefGJCM~(U@!17Ff%YP=rZsz=rO1=
z=re>eFfcGPFsgzL4`W~ghno-7aAlBj+B+E>i8tAZft$gYL5aZxX0j4AF2flZ86x1$
z_lDY_1hN6*d{<;kX5n<YIRhVq1%o1kCCmavu)#2=dq54A2N|rrlfi>HQ*9Wy8EhHk
z80=uC${{&Bk|7EjFvt-kwE-=H9HCmG859{};66o319G5<fTSfz8gOM`WpHCqWQb*m
zgQfw5dhM+Y%INAn8CV&-7!(=e84{rCk)5QB?j&CZMutR&BrHnR(Uk@=Fft@#^{6(w
r(om>JQy7>TQo$KDjUgROXE0<jFfa&#;~;|}n}LNPharO@kAVdMsP^wA

delta 979
zcmca9w1kiA)W2Q(7#J9=7@{X~bz3^;=am%Y=j5aosRUQ%CHrI+mvAu%GKlana5IQ9
zGVp8oAXHduhH)}5F^KapNH9oF7GYG9l;&ZOVGv+s;LR(|O-d~a$qz2cFG}TLkelq!
zD8Z({!=T8ZG&z@1iA{xvL6t#m@>E6@UM>a=22FMbEglAK2A#<d87;Z>81&g040sp}
z8H^^YG8r1_F_`c$m@=3#GO!e9R;4mBFl%Ufaxri)Snx1dGVm}mu;t~KWTsVeGw3l`
z^Dx*j*iP<XQk{H_$!xL*^X$oAm`_ap#-ha-K3S1fv!0QG1LiRXMFu7Y4h9AWHU<_3
zeg**s1_l<8R~Q%>>=+mrm>BFCSU~;(iz_lHfoW9+H3kL&0R~nEHU<U;E(S(Wz%Vc}
zI503UBr>otFflMN7;0&6Wnk3W&cLq4w3UHZYd3>nr1o|O;jIi}^;*nZ8Kks?WVbTN
zYwc#>h}_P=zLi0FBLf2iBZDIY1A`m`I|BoQI0Gkx1Op#~B!d)#6oWj2G=nOG41)oK
zEQ2D06N59<J|zYwuzhS=(pwpL5oU0KMHLuW859{58C)35pz38A80#4r85kH?wYD(u
zu7TUh1{PFdU}SKGo9z!ZTTN>VgP8OV2KAi`x=ak=Al^;}V@3w8Eeui%7`U{yFeq<h
zFbCPq1a?0k12Y2yg9Za1gC>J2gBF7u0|Nsy1EVU~aCe4!CU8jkKuuQ$nWw#z!HRgJ
zbs0eMti+%XGg=86TOJII44w>L3=kV+85qI70(n(z1Kg|i5WgBh^>{NVGWfv#j1rzw
zAU{Fk1QMQR46F?142lfC41Un?M5x!^${>%f-im>h!J0vl!Ji=js$Lcn4v_GdM>q=N
zCOZa3hCqfOklM)`IK)grsR1J6#K6oD3{H_D4545;j3I)7fk6lyieU_q3@i+S3}FmW
G3@iX+O@5{T

diff --git a/Controller$Reloader.class b/Controller$Reloader.class
new file mode 100644
index 0000000000000000000000000000000000000000..1778f421b3e1ecd1109fa137402893ab772a7d5e
GIT binary patch
literal 389
zcmX^0Z`VEs1_mnzX-)<v24;2!79Ivx1~x_pVdwn3lA`>aoYW$fpwyiF#FW$`Mh3Q$
zjLc#c14afOAB4O$7Xt?aCp!Zd4+A#?4<my>R$^JAeokUuy1su>R%&tyBLkaFW?p8A
z9U}v?hGrPZCO#epeg*+X2DT!w*^CT~QH%`y8px(<hA}d*IOnINGBWV{Wag#%mF6a;
z7KJ1x<)kt)a0Ta=7A2>;Wr8^T2)F2g>}F)(@JlT&@yIVOVP}wFWZ*)`Gcxda=H;ap
zIp-u67pE38GH}2=$Dqi-#K6J8z`(@72yz<(gMa`iC>R(R7#SEDxETZ)7#V~Z7#Q>!
zm>8HC7#R4qw6`)aYHep=*J9qvz`GHwP?&*%fscWifq@~Kfs-MIfsY}Uftf)BY^*4Q
Y7?>7kkYr$B;9_88U}6wwkYZo~0N%|@U;qFB

literal 0
HcmV?d00001

diff --git a/Controller.class b/Controller.class
index ef4ebb6110d7d4a7fe514ac5b4b7d62058a0eb68..86c939b219a47dffd1fcd6905d10b5000029bee8 100644
GIT binary patch
literal 10895
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
b0|(=E1{TI(1`fs>3@nT{8E-S*Wsn2_vH;Ud

delta 4250
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

diff --git a/Controller.java b/Controller.java
index 481360c..12eb9b8 100644
--- a/Controller.java
+++ b/Controller.java
@@ -1,6 +1,8 @@
 import java.io.*;
 import java.net.*;
 import java.lang.Runnable;
+import java.lang.Math;
+import java.util.Iterator;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Map;
@@ -111,15 +113,23 @@ public class Controller {
 			int timeout = Integer.parseInt(args[2]);
 			int rebalancePeriod = Integer.parseInt(args[3]);
 			
+			if(cport < 0 || rFactor < 1 || timeout < 0 || rebalancePeriod < 0) {
+				throw new Exception("Infeasible values provided as arguments");
+			}
+			
 			Controller controller = new Controller(cport, rFactor, timeout, rebalancePeriod);
 			controller.start();
 		}
 		catch(IndexOutOfBoundsException e) {
-			System.out.println("Command line arguments have not been provided");
+			System.err.println("Command line arguments have not been provided");
 			return;
 		}
 		catch(NumberFormatException e) {
-			System.out.println("Command line arguments must be integers");
+			System.err.println("Command line arguments must be integers");
+			return;
+		}
+		catch(Exception e) {
+			e.printStackTrace();
 			return;
 		}
 	}
@@ -198,9 +208,12 @@ public class Controller {
 				
 				//Select Dstores
 				int[] storesToStore = new int[rFactor];
-				for(int i=0; i<rFactor; i++) {
-					Integer thisStore = dstores.get(i);
-					storesToStore[i] = thisStore.intValue();
+				synchronized(dstores) {
+					Iterator<Integer> it = dstores.keySet().iterator();
+					for(int i=0; i<rFactor; i++) {
+						Integer thisStore = it.next();
+						storesToStore[i] = thisStore.intValue();
+					}
 				}
 				entry.setNumberToStore(rFactor);
 				
@@ -213,7 +226,12 @@ public class Controller {
 					new Thread(() -> {
 						String[] message = dstores.get(Integer.valueOf(port)).receive().split(" ");
 						if(message[0].equals("STORE_ACK")) {
-							storeAck(Integer.valueOf(port), message[1]);
+							try {
+								storeAck(Integer.valueOf(port), message[1]);
+							}
+							catch(Exception e) {
+								//Log error
+							}
 						}
 						else {
 							//Log error
@@ -282,7 +300,12 @@ public class Controller {
 				thisEntry.getLoadList().add(reloadLock);
 				int trials = 0;
 				while(true) {
-					reloadLock.wait(10 * timeout);
+					try {
+						reloadLock.wait(10 * timeout);
+					}
+					catch(InterruptedException e) {
+						e.printStackTrace();
+					}
 					trials ++;
 					if(trials >= rFactor || !reloadLock.reload) break;
 					out.println("LOAD_FROM " + thisEntry.storedBy.get(trials).intValue() + " " + thisSize);
@@ -306,14 +329,9 @@ public class Controller {
 	
 	void reload(String filename) {
 		new Thread(() -> {
-			try {
-				for(Reloader r : index.get(filename).getLoadList()) {
-					r.reload = true;
-					r.notify();
-				}
-			}
-			catch(IOException e) {
-				e.printStackTrace();
+			for(Reloader r : index.get(filename).getLoadList()) {
+				r.reload = true;
+				r.notify();
 			}
 		}).start();
 	}
@@ -393,74 +411,136 @@ public class Controller {
 	void rebalance() throws Exception {
 		new Thread(() -> {
 			if(rebalanceMessages != null) return;
-			Map<Integer,String[]> dstoreFiles = new HashMap<Integer,String[]>();
-			rebalanceMessages = dstoreFiles;
-			try {
-				//Send LIST message to each Dstore and receive their file list
-				for(Integer dstore : dstores.keySet()) {
-					new Thread(() -> {
-						String[] message = dstores.get(dstore).sendAndReceive("LIST").split(" ");
-						receiveDstoreList(dstore.intValue(), message);
-					}).start();
-				}
-				
-				dstoreFiles.wait(timeout);
-				if(dstoreFiles.size() < dstores.size()) {
-					//Log error
-				}
-				
-				//Create a new file allocation so that:
-				  //Each file appears rFactor times
-				  //Each file appears at most once on each datastore
-				  //Files are evenly distributed (Dstores differ in capacity by at most 1, no 2 datastores have identical file lists)
-				List<Integer> storeOrder = reshuffle(dstoreFiles.keySet());
-				List<String> fileList = new ArrayList<String>();
-				for(Integer i : reshuffle(dstoreFiles.keySet())) {
-					for(String s : dstoreFiles.get(i)) {
-						if(!fileList.contains(s)) {
-							fileList.add(s);
+			Map<Integer,List<String>> dstoreFiles = new HashMap<Integer,List<String>>();
+			synchronized(dstoreFiles) {
+				rebalanceMessages = dstoreFiles;
+				try {
+					//Send LIST message to each Dstore and receive their file list
+					for(Integer dstore : dstores.keySet()) {
+						dstoreFiles.put(dstore, new ArrayList<String>());
+						
+						new Thread(() -> {
+							String[] message = dstores.get(dstore).sendAndReceive("LIST").split(" ");
+							receiveDstoreList(dstore.intValue(), message);
+						}).start();
+					}
+					
+					dstoreFiles.wait(timeout);
+					if(dstoreFiles.size() < dstores.size()) {
+						//Log error
+					}
+					
+					//Create a new file allocation so that:
+					  //Each file appears rFactor times
+					  //Each file appears at most once on each datastore
+					  //Files are evenly distributed (Dstores differ in capacity by at most 1, no 2 datastores have identical file lists)
+					List<Integer> storeOrder = reshuffle(dstoreFiles.keySet());
+					List<String> fileList = new ArrayList<String>();
+					for(Integer i : reshuffle(dstoreFiles.keySet())) {
+						for(String s : dstoreFiles.get(i)) {
+							if(!fileList.contains(s)) {
+								fileList.add(s);
+							}
 						}
 					}
-				}
-				
-				Map<Integer,List<String>> newAlloc = new HashMap<Integer,List<String>>();
-				int pos = 0;
-				int storeSize = Math.ceiling((fileList.size() * rFactor) / dstores.size());
-				for(Integer i : dstoreFiles.keySet()) {
-					newAlloc.put(i, new ArrayList<String>(storeSize));
-				}
-				for(String file : fileList) {
-					for(int j=0; j<rFactor; j++) {
-						newAlloc.get(pos).add(file);
-						pos ++;
-						if(pos >= newAlloc.size()) pos = 0;
+					
+					Map<Integer,List<String>> requireIndex = new HashMap<Integer,List<String>>();
+					Map<Integer,List<String>> removeIndex = new HashMap<Integer,List<String>>();
+					int pos = 0;
+					int storeSize = (int) Math.ceil((fileList.size() * rFactor) / dstores.size());
+					for(Integer i : dstoreFiles.keySet()) {
+						requireIndex.put(i, new ArrayList<String>());
+						removeIndex.put(i, new ArrayList<String>());
 					}
-				}
-				
-				//Make a (files to send, files to remove) pair for each Dstore
-				/*
-				Map<Integer,String> outMessages = new HashMap<Integer,String>();
-				for(Integer dstore : storeOrder) {
-					String[] oldFiles = dstoreFiles.get(dstore);
-					List<String> newFiles = newAlloc.get(dstore);
-					for(String file : oldFiles) {
-						if(!newFiles.)
+					Iterator<Integer> it;
+					for(String file : fileList) {
+						for(int j=0; j<rFactor; j++) {
+							if(it == null || !it.hasNext()) {
+								it = dstoreFiles.keySet().iterator();
+							}
+							//If indexed dstore does not have the file, add it to its requireIndex entry
+							Integer thisStore = it.next();
+							if(!dstoreFiles.get(thisStore).contains(file)) {
+								requireIndex.get(thisStore).add(file);
+							}
+						}
+						//Dstores not chosen in the above loop must have an entry added to removeIndex, if they have the file
+						for(int j=0; j<(requireIndex.size() - rFactor); j++) {
+							if(it == null || !it.hasNext()) {
+								it = dstoreFiles.keySet().iterator();
+							}
+							
+							Integer thisStore = it.next();
+							if(dstoreFiles.get(thisStore).contains(file)) {
+								removeIndex.get(thisStore).add(file);
+							}
+						}
+					}
+					
+					Integer acksReceived = new Integer(0);
+					for(Integer thisStore : storeOrder) {
+						List<String> sendMessages = new ArrayList<String>();
+						for(String file : dstoreFiles.get(thisStore)) {
+							if(isEmptyListMap(requiredFiles)) break;
+							
+							String fileMessage = "";
+							for(Integer otherStore : requiredFiles.keySet()) {
+								if(thisStore.equals(otherStore)) continue;
+								for(String otherFile : requiredFiles.get(otherStore)) {
+									if(file.equals(otherFile)) {
+										requiredFiles.get(otherStore).remove(otherFile);
+										fileMessage = fileMessage + " " + otherStore.toString();
+										break;
+									}
+								}
+							}
+							fileMessage = file + " " + (fileMessage.trim().split(" ").length) + fileMessage;
+							sendMessages.add(fileMessage);
+						}
+						
+						String message = "REBALANCE " + sendMessages.size();
+						for(String s : sendMessages) {
+							message = message + " " + s;
+						}
+						message = message + " " + removeIndex.get(thisStore).size();
+						for(String f : removeIndex.get(thisStore)) {
+							message = message + " " + f;
+						}
+						
+						//Send message to the Dstore
+						new Thread(() -> {
+							String returnMessage = dstores.get(thisStore).sendAndReceive(message);
+							if(!returnMessage.equals("REBALANCE_COMPLETE")) {
+								//Log error
+							}
+							synchronized(acksReceived) {
+								acksReceived += 1;
+								if(acksReceived.intValue() == storeOrder.size()) {
+									acksReceived.notifyAll();
+								}
+							}
+						}).start();
+					}
+					
+					//Wait for REBALANCE_COMPLETE from all Dstores
+					synchronized(acksReceived) {
+						try {
+							acksReceived.wait(timeout);
+							if(acksReceived.intValue < storeOrder.size()) {
+								//Restart rebalance operation
+							}
+						}
+						catch(InterruptedException e) {
+							e.printStackTrace();
+						}
 					}
 				}
-				*/
-				
-				//Send the respective REBALANCE message to each Dstore
-				
-				//Wait for REBALANCE_COMPLETE from all Dstores
-			}
-			catch(IOException e) {
-				e.printStackTrace();
-			}
-			catch(Exception e) {
-				e.printStackTrace();
-			}
-			finally {
-				rebalanceMessages = null;
+				catch(Exception e) {
+					e.printStackTrace();
+				}
+				finally {
+					rebalanceMessages = null;
+				}
 			}
 		}).start();
 	}
@@ -475,9 +555,11 @@ public class Controller {
 			}
 		}
 		
-		rebalanceMessages.put(port, list);
-		if(rebalanceMessages.size() == dstores.size()) {
-			rebalanceMessages.notify();
+		synchronized(rebalanceMessages) {
+			rebalanceMessages.put(port, list);
+			if(rebalanceMessages.size() == dstores.size()) {
+				rebalanceMessages.notify();
+			}
 		}
 	}
 	
@@ -488,4 +570,13 @@ public class Controller {
 		}
 		return list;
 	}
+	
+	boolean isEmptyListMap(Map<T,List<U>> map) {
+		for(List<U> list : map.entrySet()) {
+			if(!list.isEmpty()) {
+				return false;
+			}
+		}
+		return true;
+	}
 }
diff --git a/Dstore.class b/Dstore.class
index 4e4fda3f3e0789c67909d128772fc154545a4cf4..f175e51d292f7e107fa06774569a117094b0ff31 100644
GIT binary patch
literal 8724
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

literal 7816
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

diff --git a/Dstore.java b/Dstore.java
index 6989e27..018a925 100644
--- a/Dstore.java
+++ b/Dstore.java
@@ -3,6 +3,8 @@ import java.lang.Runnable;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.net.*;
+import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
 
@@ -31,6 +33,10 @@ public class Dstore {
 			int timeout = Integer.parseInt(args[2]);
 			String fileFolder = args[3];
 			
+			if(port < 0 || cport < 0 || timeout < 0) {
+				throw new Exception("Infeasible values provided as arguments");
+			}
+			
 			Dstore dstore = new Dstore(port, cport, timeout, fileFolder);
 			dstore.start();
 		}
@@ -42,6 +48,10 @@ public class Dstore {
 			System.out.println("Command line arguments must be integers");
 			return;
 		}
+		catch(Exception e) {
+			e.printStackTrace();
+			return;
+		}
 	}
 	
 	public void start() {
@@ -55,8 +65,10 @@ public class Dstore {
 			new Thread(() -> {
 				while(true) {
 					try {
-						String[] message = controllerIn.readLine().split(" ");
-						handleMessage(message, socket, controllerIn);
+						String message = controllerIn.readLine();
+						if(message != null) {
+							handleMessage(message.split(" "), socket, controllerIn);
+						}
 					}
 					catch(Exception e) {
 						e.printStackTrace();
@@ -133,7 +145,7 @@ public class Dstore {
 				controllerOut.close();
 				
 				if(fileSizes.containsKey(filename)) fileSizes.remove(filename);
-				fileSizes.add(filename, filesize);
+				fileSizes.put(filename, filesize);
 			}
 			catch(IOException e) {
 				e.printStackTrace();
@@ -160,7 +172,7 @@ public class Dstore {
 				OutputStream contentOut = client.getOutputStream();
 				byte[] buf = new byte[8];
 				while(reader.read(buf) != -1) {
-					contentOut.write(new String(buf));
+					contentOut.write(buf);
 					contentOut.flush();
 				}
 				
@@ -199,101 +211,92 @@ public class Dstore {
 	
 	void list() throws Exception {
 		new Thread(() -> {
-			try {
-				//Send a list of all files in fileFolder to client (the controller)
-				for(File file : new File(fileFolder).listFiles()) {
-					controllerOut.println(file.getName());
-					controllerOut.flush();
-				}
-			}
-			catch(IOException e) {
-				e.printStackTrace();
+			//Send a list of all files in fileFolder to client (the controller)
+			for(File file : new File(fileFolder).listFiles()) {
+				controllerOut.println(file.getName());
+				controllerOut.flush();
 			}
 		}).start();
 	}
 	
 	void rebalance(String[] message) throws Exception {
 		new Thread(() -> {
-			try {
-				//Interpret files to send and files to remove from the message
-				Map<Integer,List<String>> filesToSend;
-				String[] filesToRemove;
-				int index;
-				
-				int numberToSend = Integer.parseInt(message[1]);
-				index = 2;
-				filesToSend = new HashMap<Integer,List<String>>();
-				for(int i=0; i<numberToSend; i++) {
-					String name = message[index];
-					index++;
-					
-					int numberOfReceivers = Integer.parseInt(message[index]);
-					index++;
-					for(int j=0; j<numberOfReceivers; j++) {
-						Integer receiver = Integer.parseInt(message[index]);
-						if(!filesToSend.containsKey(receiver)) {
-							filesToSend.put(receiver,new ArrayList<String>());
-						}
-						filesToSend.get(receiver).add(name);
-						index++;
-					}
-				}
+			//Interpret files to send and files to remove from the message
+			Map<Integer,List<String>> filesToSend;
+			String[] filesToRemove;
+			int index;
+			
+			int numberToSend = Integer.parseInt(message[1]);
+			index = 2;
+			filesToSend = new HashMap<Integer,List<String>>();
+			for(int i=0; i<numberToSend; i++) {
+				String name = message[index];
+				index++;
 				
-				int numberToRemove = Integer.parseInt(message[index]);
+				int numberOfReceivers = Integer.parseInt(message[index]);
 				index++;
-				filesToRemove = new String[numberToRemove];
-				for(int k=0; k<numberToRemove; k++) {
-					filesToRemove[k] = message[index];
+				for(int j=0; j<numberOfReceivers; j++) {
+					Integer receiver = Integer.parseInt(message[index]);
+					if(!filesToSend.containsKey(receiver)) {
+						filesToSend.put(receiver,new ArrayList<String>());
+					}
+					filesToSend.get(receiver).add(name);
 					index++;
 				}
-				
-				//Send each file to send to the Dstore at the specified port number
-				for(Integer dstore : filesToSend.keySet()) {
-					for(String filename : filesToSend.get(dstore)) {
-						new Thread(() -> {
-							try {
-								Socket socket = new Socket(InetAddress.getLocalHost(), dstore.intValue());
-								PrintWriter out = new PrintWriter(socket.getOutputStream());
-								out.println("STORE " + filename + " " + fileSizes.get(filename));
-								out.flush();
-								out.close();
-								
-								BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-								if(!in.readLine().equals("ACK")) {
-									//Log error
-								}
-								in.close();
-								
-								byte[] content = new byte[8];
-								FileInputStream fileIn = new FileInputStream(fileFolder + "/" + filename);
-								OutputStream fileOut = client.getOutputStream();
-								while(fileIn.read(content) > 0) {
-									fileOut.write(content);
-									fileOut.flush();
-								}
-								fileIn.close();
-								fileOut.close();
-								socket.close();
+			}
+			
+			int numberToRemove = Integer.parseInt(message[index]);
+			index++;
+			filesToRemove = new String[numberToRemove];
+			for(int k=0; k<numberToRemove; k++) {
+				filesToRemove[k] = message[index];
+				index++;
+			}
+			
+			//Send each file to send to the Dstore at the specified port number
+			for(Integer dstore : filesToSend.keySet()) {
+				for(String filename : filesToSend.get(dstore)) {
+					new Thread(() -> {
+						try {
+							Socket socket = new Socket(InetAddress.getLocalHost(), dstore.intValue());
+							PrintWriter out = new PrintWriter(socket.getOutputStream());
+							out.println("STORE " + filename + " " + fileSizes.get(filename));
+							out.flush();
+							out.close();
+							
+							BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+							if(!in.readLine().equals("ACK")) {
+								//Log error
 							}
-							catch(IOException e) {
-								e.printStackTrace();
+							in.close();
+							
+							byte[] content = new byte[8];
+							FileInputStream fileIn = new FileInputStream(fileFolder + "/" + filename);
+							OutputStream fileOut = socket.getOutputStream();
+							while(fileIn.read(content) > 0) {
+								fileOut.write(content);
+								fileOut.flush();
 							}
-						}).start();
-					}
-				}
-				
-				//Remove each file to remove from fileFolder
-				for(String filename : filesToRemove) {
-					new File(fileFolder + "/" + filename).delete();
+							fileIn.close();
+							fileOut.close();
+							socket.close();
+						}
+						catch(IOException e) {
+							e.printStackTrace();
+						}
+					}).start();
 				}
-				
-				//Send REBALANCE_COMPLETE message to client (the controller)
-				controllerOut.print("REBALANCE COMPLETE");
-				controllerOut.flush();
 			}
-			catch(IOException e) {
-				e.printStackTrace();
+			
+			//Remove each file to remove from fileFolder
+			for(String filename : filesToRemove) {
+				new File(fileFolder + "/" + filename).delete();
 			}
+			
+			//Send REBALANCE_COMPLETE message to client (the controller)
+			controllerOut.print("REBALANCE COMPLETE");
+			controllerOut.flush();
+			//TO DO: WAIT FOR RESPONSES BEFORE SENDING REBALANCE_COMPLETE
 		}).start();
 	}
 }
diff --git a/DstoreConnection.class b/DstoreConnection.class
new file mode 100644
index 0000000000000000000000000000000000000000..46f9894507e1969d0e9e198cd8bf1d8fda9c031a
GIT binary patch
literal 1529
zcmX^0Z`VEs1_mpJ5H1EL24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk-
z5<5l)W)00SP6iGJPId+^9tLg(9!3TMm*SHAqEzSnyu8%plFa-(Mh3Rx{N(J^5=I6=
zAFx?@sU`ZsU?FRE20lgxF|cT6zP?jwT3TvRYD!RQVoGWeJA(itgCtDOGq0euB)Fs~
zH8B?=&BY+ZAk5An!owiSAjZhR4_1gUnvsDoJ+%Z$7bAnXh9<-Tnfdxi64qP{{0tHx
z-%2tvNN8YHq8Y};z{?;FQY6F3AdFB1af>x1802^u<QWtg8Q6-z9$;jUfE$MDHEVVT
zB}N8eu#+?M^#h7B^Gd>tGD}j6K)zDpVNhjIV`Sh@Pc88;ErI(R<T`{8kY%j77!(;a
zK(5ndWROI-4n+;bjoLg6It;pu3~c3K`xqHS;ci57hBYWw^?4W!7z`O1I1|efGjkG?
za#9%?7^B!3jFFt~>F-*RoLT^iXf6gL22&meGf<-8F93NdxFj(-JESNvIhBLKf{}sM
zH7LkG2;@{N9tLX$8%73pu(F&yMg~!+qrvGcxTGjEFWnjx=!y(>JPh_ABU#gON{chN
z7&sUlc^I4+oEaH-a`KZCbAnQnQ!~p_85u-i(Ti*bDB4_k7~DYWIY80klbM&w!QjEj
zzyQ(#@jD{bSZjtcGO#%3r=&76@Pm~4mF6a;7KK1O&kOdDZ(;$I&sUt9m*SY00(XKM
zHeW#OKz0;6LjWuY!NMUKMfv3rE7*%*-r)+)FD*(=b;|?=yC{0D(gUR(21N!A1||ju
z1{MYuQ0@b><QWvev<`zVm^NTA1k;QRtPGwEj0|233=H!a*cg}@7#JM2wlgqlX>Vm<
z*V@g%8@Zc-KT>-egWz@s@$C#!TNz}vb~7k~M3lEPsBdM^(qh@lptqcX*H>p7gNYXN
zRtCL|42%q%48{y*3`Pu04BiY33|b6a3=9kc3@i+S44e$Y4Dt*j40;Tr48{yn3}y`C
z4CV|H4Au;i3=Ry^3_c7D48jad{~62}nAjOO*cpTv7}*(&I2jljd>Q<pZf#^>Vqjrl
zV9?fz^gX1tg+Xr?1BZ~g&fyJOTNt#ow=r0P=xq$PTH6>LbPjLu(>biWpMjZyg@K<z
z4eSzCFs;U*38o>glwx3GU|^7AU}2DF5MWSXkYG?`kY`Y0P-9RAyNZW_=?{YdI|EZF
zJA*$1BSRpAGt@a*pwf|nfk8$q(g)!j?ZX>D_G=&B;H!OD2WG!G*nTkv5G~Fi1*ReP
z3xU0)&cMQ;!63k($so?4g=()G$X*suI)~Z|3Jy?I3u$d(kln`M;-kI6M|&HCiIDpS
z21W)322KW0{)3n<#=y$Jz@X2-!C(Lu<z_Hu;Ab!a+rY-a=*7-p#K6c9#K6G7#1ISs
Dhe|{%

literal 0
HcmV?d00001

diff --git a/DstoreConnection.java b/DstoreConnection.java
index 39751a3..2d426a5 100644
--- a/DstoreConnection.java
+++ b/DstoreConnection.java
@@ -11,29 +11,33 @@ public class DstoreConnection {
 	protected Socket socket;
 	protected BufferedReader reader;
 	protected PrintWriter writer;
+	protected boolean available;
 	
 	public DstoreConnection(Socket socket) {
 		this.socket = socket;
-		reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-		writer = new PrintWriter(socket.getOutputStream());
+		try {
+			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+			writer = new PrintWriter(socket.getOutputStream());
+			available = true;
+		}
+		catch(IOException e) {
+			e.printStackTrace();
+			available = false;
+		}
 	}
 	
 	public String sendAndReceive(String message) {
 		synchronized(this) {
-			try {
-				writer.println(message);
-				writer.flush();
-			}
-			catch(IOException e) {
-				e.printStackTrace();
-				return "";
-			}
+			if(!available) return "ERROR";
+			writer.println(message);
+			writer.flush();
 			return localReceive();
 		}
 	}
 	
 	public String receive() {
 		synchronized(this) {
+			if(!available) return "ERROR";
 			return localReceive();
 		}
 	}
diff --git a/javac.20210419_161632.args b/javac.20210419_161632.args
new file mode 100644
index 0000000..159b393
--- /dev/null
+++ b/javac.20210419_161632.args
@@ -0,0 +1 @@
+Controller.java
-- 
GitLab