-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRingToken.java
129 lines (100 loc) · 3.96 KB
/
RingToken.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.util.*;
public class RingToken {
public static class Process {
int elected;
int id;
Process(int id, int elected) {
this.id = id;
this.elected = elected;
}
}
public static void main(String args[]) {
List<Process> processes = new ArrayList<>();
Random rand = new Random();
// initial case with 6th process as coordinator
for(int i=0;i<5;i++) {
processes.add(new Process(rand.nextInt(100), 200));
}
processes.add(new Process(200, 200));
Collections.shuffle(processes);
System.out.println("Initial Process Ring");
print(processes);
// P=5 Fails
// New Leader to be Elected
// Process Starting Election is just before P=5
int initial_process_index = 5;
for(int i=0;i<5;i++) {
if (processes.get(i+1).id == 200) {
initial_process_index = i;
break;
}
}
// Current Process Same as Election Starting Process
// Starting process sets message as its own ID
int current_process_index = initial_process_index;
int message = processes.get(current_process_index).id;
System.out.println("\nStarting Process Index " + current_process_index + "\n");
current_process_index++;
current_process_index%=6;
System.out.println("Process Ring While Finding Max ID");
print(processes, message);
// Finding Max ID
do {
int cur = current_process_index;
// Exclude Failed Process
if (processes.get(cur).id != 200) {
// If own ID is bigger than previous ID then set it as own message
if (processes.get(cur).id > message) {
message = processes.get(cur).id;
}
print(processes, message);
}
current_process_index++;
current_process_index%=6;
} while (current_process_index != initial_process_index);
int maxid = message;
// Finding Coordinator with max ID
while(processes.get(current_process_index).id != maxid) {
current_process_index++;
current_process_index%=6;
}
int coordinator_process = current_process_index;
initial_process_index = coordinator_process;
System.out.println("\nProcess Ring While Sending Coordinator Message");
// Send Coordinator Message & Set elected
do {
processes.get(current_process_index).elected = processes.get(coordinator_process).id;
print(processes);
current_process_index++;
current_process_index%=6;
} while (current_process_index != initial_process_index);
System.out.println("\nFinal Process Ring");
print(processes);
System.out.println("\nCoordinator Process Index " + coordinator_process + "\n");
}
public static void print(List<Process> processes, int message) {
System.out.println("---------------------");
System.out.print("P.I ");
for(int i=0;i<6;i++) {
System.out.print(processes.get(i).id + " ");
}
System.out.print("\nP.M " + message);
System.out.print("\nP.E ");
for(int i=0;i<6;i++) {
System.out.print(processes.get(i).elected + " ");
}
System.out.println("\n---------------------");
}
public static void print(List<Process> processes) {
System.out.println("---------------------");
System.out.print("P.I ");
for(int i=0;i<6;i++) {
System.out.print(processes.get(i).id + " ");
}
System.out.print("\nP.E ");
for(int i=0;i<6;i++) {
System.out.print(processes.get(i).elected + " ");
}
System.out.println("\n---------------------");
}
}