Skip to content

Commit a771882

Browse files
committed
set up recovery, now begin recovery itself
1 parent 53530c6 commit a771882

11 files changed

Lines changed: 253 additions & 42 deletions

run.sh

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,65 @@ function run_rmi_middleware() {
209209
# run code in tmux splits over ssh
210210
#-----------------------------------
211211

212+
if [ "${2}" == "--rm" ]; then
213+
if [ -z "${3}" ]; then
214+
echo "if --rm, then \$3 cannt but empty and must be one of [Customer, Flight, Car, Room, Mid]"
215+
exit 1
216+
fi
217+
if [[ ! ( "${3}" =~ ^[Cc]ustomer|[Cc]ar|[Rr]oom|[Ff]light|[Mm]id$ ) ]]; then
218+
echo "if --rm, then \$3 must be one of [Customer, Flight, Car, Room, Mid]"
219+
exit 1
220+
fi
221+
if [ -n "${TMUX}" ]; then
222+
case "${3}" in
223+
[Cc]ustomer)
224+
tmux select-pane -t 5\; \
225+
send-keys "ssh -t ${CUST_RM_HOST} \"$(run_rmi_server Customer ${CUST_RM_PORT} --recover "\
226+
"-cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} -mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \;
227+
;;
228+
[Cc]ar)
229+
tmux select-pane -t 3 \; \
230+
send-keys "ssh -t ${CAR_RM_HOST} \"$(run_rmi_server Car ${CAR_RM_PORT} --recover "\
231+
"-ch ${CAR_RM_HOST} -cp ${CAR_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
232+
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \;
233+
;;
234+
[Rr]oom)
235+
tmux select-pane -t 2 \; \
236+
send-keys "ssh -t ${ROOM_RM_HOST} \"$(run_rmi_server Room ${ROOM_RM_PORT} --recover "\
237+
"-rh ${ROOM_RM_HOST} -rp ${ROOM_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
238+
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \;
239+
;;
240+
[Ff]light)
241+
tmux select-pane -t 4 \; \
242+
send-keys "ssh -t ${FLIGHT_RM_HOST} \"$(run_rmi_server Flight ${FLIGHT_RM_PORT} --recover "\
243+
"-fh ${FLIGHT_RM_HOST} -fp ${FLIGHT_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
244+
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \;
245+
;;
246+
[Mm]id)
247+
tmux select-pane -t 1 \; \
248+
send-keys "ssh -t ${MID_RM_HOST} \"$(run_rmi_middleware ${MID_RM_PORT} --recover "\
249+
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT} "\
250+
"-cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} -fh ${FLIGHT_RM_HOST} -fp ${FLIGHT_RM_PORT} "\
251+
"-rh ${ROOM_RM_HOST} -rp ${ROOM_RM_PORT} -ch ${CAR_RM_HOST}) -cp ${CAR_RM_PORT}\"" C-m \;
252+
;;
253+
esac
254+
else
255+
case "${3}" in
256+
[Cc]ustomer)
257+
;;
258+
[Cc]ar)
259+
;;
260+
[Rr]oom)
261+
;;
262+
[Ff]light)
263+
;;
264+
[Mm]id)
265+
;;
266+
esac
267+
fi
268+
exit 0
269+
fi
270+
212271
tmux new-session \; \
213272
split-window -v \; \
214273
split-window -h \; \
@@ -219,20 +278,20 @@ tmux new-session \; \
219278
split-window -h \; \
220279
select-pane -t 5 \; \
221280
send-keys "ssh -t ${CUST_RM_HOST} \"$(run_rmi_server Customer ${CUST_RM_PORT} "\
222-
"-cup ${CUST_RM_PORT} -mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \; \
281+
"-cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} -mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \; \
223282
select-pane -t 4 \; \
224283
send-keys "ssh -t ${FLIGHT_RM_HOST} \"$(run_rmi_server Flight ${FLIGHT_RM_PORT} "\
225-
"-fp ${FLIGHT_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
284+
"-fh ${FLIGHT_RM_HOST} -fp ${FLIGHT_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
226285
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \; \
227286
select-pane -t 3 \; \
228287
send-keys "ssh -t ${CAR_RM_HOST} \"$(run_rmi_server Car ${CAR_RM_PORT} "\
229-
"-cp ${CAR_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
288+
"-ch ${CAR_RM_HOST} -cp ${CAR_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
230289
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \; \
231290
select-pane -t 2 \; \
232291
send-keys "ssh -t ${ROOM_RM_HOST} \"$(run_rmi_server Room ${ROOM_RM_PORT} "\
233-
"-rp ${ROOM_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
292+
"-rh ${ROOM_RM_HOST} -rp ${ROOM_RM_PORT} -cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} "\
234293
"-mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT})\"" C-m \; \
235294
select-pane -t 1 \; \
236-
send-keys "ssh -t ${MID_RM_HOST} \"$(run_rmi_middleware ${MID_RM_PORT} -mwp ${MID_RM_PORT} "\
295+
send-keys "ssh -t ${MID_RM_HOST} \"$(run_rmi_middleware ${MID_RM_PORT} -mwh ${MID_RM_HOST} -mwp ${MID_RM_PORT} "\
237296
"-cuh ${CUST_RM_HOST} -cup ${CUST_RM_PORT} -fh ${FLIGHT_RM_HOST} -fp ${FLIGHT_RM_PORT} "\
238297
"-rh ${ROOM_RM_HOST} -rp ${ROOM_RM_PORT} -ch ${CAR_RM_HOST}) -cp ${CAR_RM_PORT}\"" C-m \;

src/main/java/group25/Server/Common/AbstractRMHashMapManager.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import javax.transaction.InvalidTransactionException;
1313

1414
import java.rmi.RemoteException;
15-
import java.io.*;
1615

1716
public abstract class AbstractRMHashMapManager {
1817
private String m_name = "";

src/main/java/group25/Server/Common/MiddlewareResourceManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ public void crashResourceManager(String rmName, int mode) throws RemoteException
204204
transactionManager.crashResourceManager(rmName, mode);
205205
}
206206

207+
public void reconnect(String rmName, String hostname, int port, String objName) throws RemoteException {
208+
transactionManager.reconnect(rmName, hostname, port, objName);
209+
}
210+
207211
@Override
208212
public void shutdown() {
209213
transactionManager.shutdownAllResourceManagers();

src/main/java/group25/Server/Common/TransactionManager.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import group25.Server.LockManager.DeadlockException;
55
import group25.Server.LockManager.LockManager;
66
import group25.Server.LockManager.TransactionLockObject.LockType;
7+
import group25.Server.RMI.RMIUtils;
78
import group25.Utils.CrashMode;
89
import static group25.Utils.AnsiColors.RED;
910
import static group25.Utils.AnsiColors.BLUE;
@@ -13,7 +14,6 @@
1314
import java.rmi.Remote;
1415
import java.rmi.RemoteException;
1516
import java.util.ArrayList;
16-
import java.util.Comparator;
1717
import java.util.HashMap;
1818
import java.util.concurrent.Semaphore;
1919
import java.util.concurrent.TimeUnit;
@@ -54,6 +54,27 @@ public TransactionManager(
5454
setUpTimeToLiveThread();
5555
}
5656

57+
public void reconnect(String rmName, String hostname, int port, String objName) throws RemoteException {
58+
switch (rmName) {
59+
case "car": {
60+
carRM = RMIUtils.getRMIobject(hostname, port, objName);
61+
break;
62+
}
63+
case "customer": {
64+
customerRM = RMIUtils.getRMIobject(hostname, port, objName);
65+
break;
66+
}
67+
case "flight": {
68+
flightRM = RMIUtils.getRMIobject(hostname, port, objName);
69+
break;
70+
}
71+
case "room": {
72+
roomRM = RMIUtils.getRMIobject(hostname, port, objName);
73+
break;
74+
}
75+
}
76+
}
77+
5778
private void crashIf(CrashMode cm) {
5879
if (crashMode == cm) {
5980
System.out.println(BLUE.colorString("CRASH: ")+cm.toString());

src/main/java/group25/Server/Interface/IMiddlewareResourceManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,7 @@ public void crashMiddleware(int mode)
232232

233233
public void crashResourceManager(String rmName, int mode)
234234
throws RemoteException;
235+
236+
public void reconnect(String rmName, String hostname, int port, String objName)
237+
throws RemoteException;
235238
}

src/main/java/group25/Server/RMI/RMICarResourceManager.java

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,45 +19,58 @@
1919
import java.rmi.RemoteException;
2020
import java.rmi.server.UnicastRemoteObject;
2121

22+
import static group25.Utils.AnsiColors.BLACK;
23+
import static group25.Utils.AnsiColors.BLUE;
24+
import static group25.Utils.AnsiColors.RED;
25+
2226
public class RMICarResourceManager extends CarResourceManager {
2327

2428
private static final String s_serverName = "CarServer";
2529

30+
private static String s_serverHostname = "localhost";
2631
private static int s_serverPort = 2001;
2732
private static String s_customerServerHostname = "localhost";
2833
private static int s_customerServerPort = 2003;
34+
private static String s_middlewareHostname = "localhost";
35+
private static int s_middlewarePort = 2005;
36+
37+
private static boolean should_recover = false;
2938

3039
public RMICarResourceManager(String name, IMiddlewareResourceManager midRM) {
3140
super(name, "carData1.xml", "carData2.xml", "carMasterRecord.xml", "carLogFile.txt", midRM);
3241
}
3342

3443
public static void main(String args[]) {
3544
CliParser cliParser = new CliParser("RMICarResourceManager", args, new String[]{
45+
CliParser.SHOULD_RECOVER,
46+
CliParser.CAR_HOSTNAME,
3647
CliParser.CAR_PORT,
3748
CliParser.CUSTOMER_HOSTNAME,
3849
CliParser.CUSTOMER_PORT,
3950
CliParser.MIDDLEWARE_HOSTNAME,
4051
CliParser.MIDDLEWARE_PORT
4152
});
53+
if (cliParser.parsedArg(CliParser.CAR_HOSTNAME))
54+
s_serverHostname = cliParser.getParsedHostname(CliParser.CAR_HOSTNAME);
4255
if (cliParser.parsedArg(CliParser.CAR_PORT))
4356
s_serverPort = cliParser.getParsedPort(CliParser.CAR_PORT);
4457
if (cliParser.parsedArg(CliParser.CUSTOMER_HOSTNAME))
4558
s_customerServerHostname = cliParser.getParsedHostname(CliParser.CUSTOMER_HOSTNAME);
4659
if (cliParser.parsedArg(CliParser.CUSTOMER_PORT))
4760
s_customerServerPort = cliParser.getParsedPort(CliParser.CUSTOMER_PORT);
48-
49-
// get middleware for voting
50-
String middlewareHostname = null;
51-
int middlewarePort = -1;
52-
IMiddlewareResourceManager midRM = null;
5361
if (cliParser.parsedArg(CliParser.MIDDLEWARE_HOSTNAME))
54-
middlewareHostname = cliParser.getParsedHostname(CliParser.MIDDLEWARE_HOSTNAME);
62+
s_middlewareHostname = cliParser.getParsedHostname(CliParser.MIDDLEWARE_HOSTNAME);
5563
if (cliParser.parsedArg(CliParser.MIDDLEWARE_PORT))
56-
middlewarePort = cliParser.getParsedPort(CliParser.MIDDLEWARE_PORT);
57-
if (middlewareHostname == null || middlewarePort == -1) {
58-
// bad bad not good
64+
s_middlewarePort = cliParser.getParsedPort(CliParser.MIDDLEWARE_PORT);
65+
if (cliParser.parsedArg(CliParser.SHOULD_RECOVER))
66+
should_recover = true;
67+
68+
// get middleware for voting
69+
IMiddlewareResourceManager midRM = null;
70+
if (s_middlewareHostname == null || s_middlewarePort == -1) {
71+
System.out.println(RED.colorString("Error: ")+"CarRM failed to parse middleware args");
5972
} else {
60-
midRM = RMIUtils.getRMIobject(middlewareHostname, middlewarePort, "MiddlewareServer");
73+
midRM = RMIUtils.getRMIobject(s_middlewareHostname, s_middlewarePort, "MiddlewareServer");
6174
}
6275

6376
// Create a new Server object
@@ -79,5 +92,21 @@ public static void main(String args[]) {
7992
}));
8093

8194
System.out.println("'" + s_serverName + "' resource manager server ready and bound to '" + s_serverName + "'");
95+
96+
// TODO: recover state
97+
if (should_recover) {
98+
System.out.println(BLUE.colorString("recovering state from files"));
99+
}
100+
101+
// for recovery, force middleware to reconnect to carRM
102+
try {
103+
Thread.sleep(1000);
104+
midRM.reconnect("car", s_serverHostname, s_serverPort, "CarServer");
105+
} catch (RemoteException e) {
106+
System.out.println(RED.colorString("Error: ")+"could not reconnect middleware to car RM");
107+
} catch (Exception e) {
108+
System.out.println(RED.colorString("RMICarRM: ")+e.toString());
109+
e.printStackTrace();
110+
}
82111
}
83112
}

src/main/java/group25/Server/RMI/RMICustomerResourceManager.java

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
import group25.Utils.CliParser;
1111

1212
import java.rmi.registry.Registry;
13-
import java.rmi.registry.LocateRegistry;
1413
import java.rmi.RemoteException;
15-
import java.rmi.server.UnicastRemoteObject;
14+
15+
import static group25.Utils.AnsiColors.BLUE;
16+
import static group25.Utils.AnsiColors.RED;
1617

1718
// RMIResourceManager is a whole class containing a registry and references to objects
1819
// These objects can be created through "creators", i.e. addFlight, addCars, addRooms
@@ -24,31 +25,40 @@ public class RMICustomerResourceManager extends CustomerResourceManager {
2425

2526
private static final String s_serverName = "CustomerServer";
2627

28+
private static String s_serverHostname = "localhost";
2729
private static int s_serverPort = 2003;
30+
private static String s_middlewareHostname = "localhost";
31+
private static int s_middlewarePort = 2005;
32+
private static boolean should_recover = false;
2833

2934
public RMICustomerResourceManager(String name, IMiddlewareResourceManager midRM) {
3035
super(name, "customerData1.xml", "customerData2.xml", "customerMasterRecord.xml", "customerLogFile.txt", midRM);
3136
}
3237

3338
public static void main(String args[]) {
3439
CliParser cliParser = new CliParser("RMICustomerResourceManager",args, new String[] {
40+
CliParser.SHOULD_RECOVER,
41+
CliParser.CUSTOMER_HOSTNAME,
3542
CliParser.CUSTOMER_PORT,
3643
CliParser.MIDDLEWARE_HOSTNAME,
3744
CliParser.MIDDLEWARE_PORT
3845
});
46+
if (cliParser.parsedArg(CliParser.CUSTOMER_HOSTNAME))
47+
s_serverHostname = cliParser.getParsedHostname(CliParser.CUSTOMER_HOSTNAME);
3948
if (cliParser.parsedArg(CliParser.CUSTOMER_PORT))
4049
s_serverPort = cliParser.getParsedPort(CliParser.CUSTOMER_PORT);
41-
String middlewareHostname = null;
42-
int middlewarePort = -1;
43-
IMiddlewareResourceManager midRM = null;
4450
if (cliParser.parsedArg(CliParser.MIDDLEWARE_HOSTNAME))
45-
middlewareHostname = cliParser.getParsedHostname(CliParser.MIDDLEWARE_HOSTNAME);
51+
s_middlewareHostname = cliParser.getParsedHostname(CliParser.MIDDLEWARE_HOSTNAME);
4652
if (cliParser.parsedArg(CliParser.MIDDLEWARE_PORT))
47-
middlewarePort = cliParser.getParsedPort(CliParser.MIDDLEWARE_PORT);
48-
if (middlewareHostname == null || middlewarePort == -1) {
53+
s_middlewarePort = cliParser.getParsedPort(CliParser.MIDDLEWARE_PORT);
54+
if (cliParser.parsedArg(CliParser.SHOULD_RECOVER))
55+
should_recover = true;
56+
57+
IMiddlewareResourceManager midRM = null;
58+
if (s_middlewareHostname == null || s_middlewarePort == -1) {
4959
// bad bad not good
5060
} else {
51-
midRM = RMIUtils.getRMIobject(middlewareHostname, middlewarePort, "MiddlewareServer");
61+
midRM = RMIUtils.getRMIobject(s_middlewareHostname, s_middlewarePort, "MiddlewareServer");
5262
}
5363
// Create a new Server object
5464
RMICustomerResourceManager server = new RMICustomerResourceManager(s_serverName, midRM);
@@ -73,5 +83,21 @@ public static void main(String args[]) {
7383
if (System.getSecurityManager() == null) {
7484
System.setSecurityManager(new SecurityManager());
7585
}
86+
87+
// TODO: recover state
88+
if (should_recover) {
89+
System.out.println(BLUE.colorString("recovering state from files"));
90+
}
91+
92+
// for recovery, force middleware to reconnect to carRM
93+
try {
94+
Thread.sleep(1000);
95+
midRM.reconnect("customer", s_serverHostname, s_serverPort, "CustomerServer");
96+
} catch (RemoteException e) {
97+
System.out.println(RED.colorString("Error: ")+"could not reconnect middleware to car RM");
98+
} catch (Exception e) {
99+
System.out.println(RED.colorString("RMICustomerRM: ")+e.toString());
100+
e.printStackTrace();
101+
}
76102
}
77103
}

0 commit comments

Comments
 (0)