1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package jgroup.util.log;
19
20 import static jgroup.util.log.ViewEvent.RecoveryState.FULLY_REPLICATED;
21 import static jgroup.util.log.ViewEvent.RecoveryState.NEED_RECOVERY;
22 import static jgroup.util.log.ViewEvent.RecoveryState.NEW_MEMBER;
23 import static jgroup.util.log.ViewEvent.RecoveryState.NORMAL;
24 import static jgroup.util.log.ViewEvent.RecoveryState.TOO_MANY_REPLICAS;
25 import jgroup.core.MemberId;
26 import jgroup.core.View;
27 import jgroup.relacs.config.AppConfig;
28 import jgroup.relacs.types.ViewId;
29 import jgroup.util.Network;
30
31
32
33
34
35
36
37 public final class ViewEvent
38 extends Event
39 {
40
41
42
43
44
45 private static final long serialVersionUID = 4049640096401864757L;
46
47
48
49
50 public enum Type implements EventType { ARM, Merge, Server, Client }
51
52 enum RecoveryState { NEW_MEMBER, NORMAL, NEED_RECOVERY, FULLY_REPLICATED, TOO_MANY_REPLICAS }
53
54
55
56
57
58
59
60
61
62 private final View view;
63
64 private int minimalRedundancy;
65
66 private int initialRedundancy;
67
68 private RecoveryState state;
69
70
71
72
73
74
75 public ViewEvent(EventType type, View view)
76 {
77 super(type, "ViewChange");
78 this.view = (View) view.clone();
79 AppConfig thisApp = AppConfig.getApplication(this.view.getGid());
80 try {
81 this.minimalRedundancy = thisApp.getMinimalRedundancy();
82 this.initialRedundancy = thisApp.getInitialRedundancy();
83 } catch (IllegalStateException e) {
84
85
86
87
88 }
89 computeState();
90 }
91
92
93
94
95
96
97 private void computeState()
98 {
99 int vsize = view.size();
100 if (vsize == initialRedundancy) {
101 state = FULLY_REPLICATED;
102 } else if (vsize < minimalRedundancy) {
103 if (isFirstView())
104 state = NEW_MEMBER;
105 else
106 state = NEED_RECOVERY;
107 } else if (vsize > initialRedundancy) {
108 state = TOO_MANY_REPLICAS;
109 } else if (vsize >= minimalRedundancy && vsize < initialRedundancy) {
110 state = NORMAL;
111 }
112 assert state != null;
113 }
114
115
116
117
118
119
120 public int getViewSize()
121 {
122 return view.size();
123 }
124
125 public long getViewId()
126 {
127 return view.getVid();
128 }
129
130 public View getView()
131 {
132 return view;
133 }
134
135 public int getGroupId()
136 {
137 return view.getGid();
138 }
139
140
141
142
143
144
145
146 public boolean isFirstView()
147 {
148 if (view.size() == 1) {
149 MemberId memb = view.getMembers()[0];
150
151 long theInitialVid = ViewId.create(memb.getEndPoint(), 0);
152 return theInitialVid == view.getVid();
153 } else {
154 return false;
155 }
156 }
157
158 public boolean isFullyReplicated()
159 {
160 return state == FULLY_REPLICATED;
161 }
162
163 public boolean isOK()
164 {
165 return state == NORMAL || state == FULLY_REPLICATED;
166 }
167
168 public boolean needRecovery()
169 {
170 return state == NEED_RECOVERY;
171 }
172
173 public boolean hasTooManyReplicas()
174 {
175 return state == TOO_MANY_REPLICAS;
176 }
177
178
179
180
181
182
183 public String toString()
184 {
185 StringBuilder buf = commonToString(true);
186 commonToString(buf);
187 return buf.toString();
188 }
189
190
191
192
193 public String shortToString()
194 {
195 StringBuilder buf = new StringBuilder("ViewEvent");
196 commonToString(buf);
197 return buf.toString();
198 }
199
200 protected void commonToString(StringBuilder buf)
201 {
202 buf.append(" gid=");
203 buf.append(view.getGid());
204 buf.append(" view.size=");
205 buf.append(view.size());
206 buf.append(" (");
207 buf.append(state);
208 buf.append(") vid=");
209 buf.append(view.getVid());
210 buf.append(" members: ");
211 MemberId[] members = view.getMembers();
212 for (int i = 0; i < members.length; i++) {
213 buf.append(Network.getMachineName(members[i].getCanonicalHostName()));
214 buf.append(" ");
215 }
216 }
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234 }