1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package jgroup.relacs.mss;
20
21 import jgroup.core.EndPoint;
22 import jgroup.util.BooleanSet;
23
24
25
26
27
28
29
30
31
32
33
34 final class DSView
35 {
36
37
38
39
40
41
42 private HostTable hosttable;
43
44
45 private BooleanSet reachableSet;
46
47
48 private BooleanSet newUnreachableSet;
49
50
51 private BooleanSet newReachableSet;
52
53
54 private BooleanSet newIncarnationSet;
55
56
57
58
59
60
61 DSView(HostTable hosttable, MssHost localhost)
62 {
63
64 this.hosttable = hosttable;
65
66
67 reachableSet = new BooleanSet(hosttable.size());
68 reachableSet.set(localhost.getIndex());
69 newUnreachableSet = new BooleanSet(hosttable.size());
70 newReachableSet = new BooleanSet(hosttable.size());
71 newIncarnationSet = new BooleanSet(hosttable.size());
72 }
73
74
75
76
77
78
79
80
81
82 void setAsUnreachable(MssHost member)
83 {
84 reachableSet.unset(member.getIndex());
85 newReachableSet.unset(member.getIndex());
86 newUnreachableSet.set(member.getIndex());
87 newIncarnationSet.unset(member.getIndex());
88 }
89
90
91
92
93 void setAsReachable(MssHost member)
94 {
95 reachableSet.set(member.getIndex());
96 newReachableSet.set(member.getIndex());
97 newUnreachableSet.unset(member.getIndex());
98 }
99
100
101
102
103 void setNewIncarnation(MssHost member)
104 {
105 newIncarnationSet.set(member.getIndex());
106 }
107
108
109
110
111
112 void clear()
113 {
114 newReachableSet.clear();
115 newUnreachableSet.clear();
116 newIncarnationSet.clear();
117 }
118
119
120
121
122
123 boolean hasChanged()
124 {
125 return (newReachableSet.size() > 0) || (newUnreachableSet.size() > 0);
126 }
127
128
129
130
131 MssHost[] getReachableHosts()
132 {
133 return bitToHosts(reachableSet);
134 }
135
136
137
138
139 MssHost[] getNewReachableHosts()
140 {
141 return bitToHosts(newReachableSet);
142 }
143
144
145
146
147 MssHost[] getNewUnreachableHosts()
148 {
149 return bitToHosts(newUnreachableSet);
150 }
151
152
153
154
155 MssHost[] getNewIncarnationHosts()
156 {
157 return bitToHosts(newIncarnationSet);
158 }
159
160
161
162
163 EndPoint[] getReachableEndPoints()
164 {
165 return bitToEndPoints(reachableSet);
166 }
167
168
169
170
171 EndPoint[] getNewReachableEndPoints()
172 {
173 return bitToEndPoints(newReachableSet);
174 }
175
176
177
178
179 EndPoint[] getNewUnreachableEndPoints()
180 {
181 return bitToEndPoints(newUnreachableSet);
182 }
183
184
185
186
187 EndPoint[] getNewIncarnationEndPoints()
188 {
189 return bitToEndPoints(newIncarnationSet);
190 }
191
192
193
194
195
196
197 private EndPoint[] bitToEndPoints(BooleanSet bitSet)
198 {
199 EndPoint[] members = new EndPoint[bitSet.size()];
200 for (int i=0, j=0; i < bitSet.lastIndex(); i++) {
201 if (bitSet.lookup(i))
202 members[j++] = hosttable.get(i).getEndPoint();
203 }
204 return members;
205 }
206
207 private MssHost[] bitToHosts(BooleanSet bitSet)
208 {
209 MssHost[] members = new MssHost[bitSet.size()];
210 for (int i=0, j=0; i < bitSet.lastIndex(); i++) {
211 if (bitSet.lookup(i))
212 members[j++] = hosttable.get(i);
213 }
214 return members;
215 }
216
217
218
219
220
221
222 public String toString()
223 {
224 StringBuilder buf = new StringBuilder("[ReachableSet: ");
225 boolean first = true;
226 for (int i = 0; i < reachableSet.lastIndex(); i++) {
227 if (reachableSet.lookup(i)) {
228 if (first) {
229 first = false;
230 } else {
231 buf.append(", ");
232 }
233 buf.append(hosttable.get(i));
234 }
235 }
236 buf.append("]");
237 return buf.toString();
238 }
239
240 }