90
START_TEST (gcs_state_msg_test_quorum)
92
gcs_state_msg_t* st1, *st2, *st3;
95
gu_uuid_generate (&g1, NULL, 0);
96
gu_uuid_generate (&g2, NULL, 0);
97
gu_uuid_generate (&g3, NULL, 0);
99
st1 = st2 = st3 = NULL;
90
START_TEST (gcs_state_msg_test_quorum_inherit)
92
gcs_state_msg_t* st[3] = { NULL, };
95
gu_uuid_t group1_uuid, group2_uuid;
96
gu_uuid_t prim1_uuid, prim2_uuid;
98
gu_uuid_generate (&state_uuid, NULL, 0);
99
gu_uuid_generate (&group1_uuid, NULL, 0);
100
gu_uuid_generate (&group2_uuid, NULL, 0);
101
gu_uuid_generate (&prim1_uuid, NULL, 0);
102
gu_uuid_generate (&prim2_uuid, NULL, 0);
104
gcs_seqno_t prim1_seqno = 123;
105
gcs_seqno_t prim2_seqno = 834;
107
gcs_seqno_t act1_seqno = 345;
108
gcs_seqno_t act2_seqno = 239472508908LL;
110
gcs_state_quorum_t quorum;
114
/* First just nodes from different groups and configurations, none JOINED */
115
st[0] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim2_uuid,
116
5, prim2_seqno - 1, act2_seqno - 1,
117
GCS_NODE_STATE_PRIM, GCS_NODE_STATE_PRIM,
120
fail_if(NULL == st[0]);
122
st[1] = gcs_state_msg_create (&state_uuid, &group1_uuid, &prim1_uuid,
123
3, prim1_seqno, act1_seqno,
124
GCS_NODE_STATE_PRIM, GCS_NODE_STATE_PRIM,
127
fail_if(NULL == st[1]);
129
st[2] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim2_uuid,
130
5, prim2_seqno, act2_seqno,
131
GCS_NODE_STATE_PRIM, GCS_NODE_STATE_PRIM,
134
fail_if(NULL == st[2]);
136
gu_info (" Inherited 1");
137
int ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
138
sizeof(st)/sizeof(gcs_state_msg_t*),
141
fail_if (1 != quorum.version);
142
fail_if (false != quorum.primary);
143
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &GU_UUID_NIL));
144
fail_if (GCS_SEQNO_ILL != quorum.act_id);
145
fail_if (GCS_SEQNO_ILL != quorum.conf_id);
146
fail_if (-1 != quorum.gcs_proto_ver);
147
fail_if (-1 != quorum.repl_proto_ver);
148
fail_if (-1 != quorum.appl_proto_ver);
150
/* now make node1 inherit PC */
151
gcs_state_msg_destroy (st[1]);
152
st[1] = gcs_state_msg_create (&state_uuid, &group1_uuid, &prim1_uuid,
153
3, prim1_seqno, act1_seqno,
154
GCS_NODE_STATE_JOINED, GCS_NODE_STATE_DONOR,
157
fail_if(NULL == st[1]);
159
gu_info (" Inherited 2");
160
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
161
sizeof(st)/sizeof(gcs_state_msg_t*),
164
fail_if (1 != quorum.version);
165
fail_if (true != quorum.primary);
166
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &group1_uuid));
167
fail_if (act1_seqno != quorum.act_id);
168
fail_if (prim1_seqno != quorum.conf_id);
169
fail_if (0 != quorum.gcs_proto_ver);
170
fail_if (1 != quorum.repl_proto_ver);
171
fail_if (0 != quorum.appl_proto_ver);
173
/* now make node0 inherit PC (should yield conflicting uuids) */
174
gcs_state_msg_destroy (st[0]);
175
st[0] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim2_uuid,
176
5, prim2_seqno - 1, act2_seqno - 1,
177
GCS_NODE_STATE_SYNCED, GCS_NODE_STATE_SYNCED,
180
fail_if(NULL == st[0]);
182
gu_info (" Inherited 3");
183
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
184
sizeof(st)/sizeof(gcs_state_msg_t*),
187
fail_if (1 != quorum.version);
188
fail_if (false != quorum.primary);
189
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &GU_UUID_NIL));
190
fail_if (GCS_SEQNO_ILL != quorum.act_id);
191
fail_if (GCS_SEQNO_ILL != quorum.conf_id);
192
fail_if (-1 != quorum.gcs_proto_ver);
193
fail_if (-1 != quorum.repl_proto_ver);
194
fail_if (-1 != quorum.appl_proto_ver);
196
/* now make node1 non-joined again: group2 should win */
197
gcs_state_msg_destroy (st[1]);
198
st[1] = gcs_state_msg_create (&state_uuid, &group1_uuid, &prim1_uuid,
199
3, prim1_seqno, act1_seqno,
200
GCS_NODE_STATE_JOINED, GCS_NODE_STATE_PRIM,
203
fail_if(NULL == st[1]);
205
gu_info (" Inherited 4");
206
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
207
sizeof(st)/sizeof(gcs_state_msg_t*),
210
fail_if (1 != quorum.version);
211
fail_if (true != quorum.primary);
212
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &group2_uuid));
213
fail_if (act2_seqno - 1 != quorum.act_id);
214
fail_if (prim2_seqno - 1 != quorum.conf_id);
215
fail_if (0 != quorum.gcs_proto_ver);
216
fail_if (1 != quorum.repl_proto_ver);
217
fail_if (0 != quorum.appl_proto_ver);
219
/* now make node2 joined: it should become a representative */
220
gcs_state_msg_destroy (st[2]);
221
st[2] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim2_uuid,
222
5, prim2_seqno, act2_seqno,
223
GCS_NODE_STATE_SYNCED, GCS_NODE_STATE_SYNCED,
226
fail_if(NULL == st[2]);
228
gu_info (" Inherited 5");
229
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
230
sizeof(st)/sizeof(gcs_state_msg_t*),
233
fail_if (1 != quorum.version);
234
fail_if (true != quorum.primary);
235
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &group2_uuid));
236
fail_if (act2_seqno != quorum.act_id);
237
fail_if (prim2_seqno != quorum.conf_id);
238
fail_if (0 != quorum.gcs_proto_ver);
239
fail_if (1 != quorum.repl_proto_ver);
240
fail_if (0 != quorum.appl_proto_ver);
242
gcs_state_msg_destroy (st[0]);
243
gcs_state_msg_destroy (st[1]);
244
gcs_state_msg_destroy (st[2]);
248
START_TEST (gcs_state_msg_test_quorum_remerge)
250
gcs_state_msg_t* st[3] = { NULL, };
252
gu_uuid_t state_uuid;
253
gu_uuid_t group1_uuid, group2_uuid;
254
gu_uuid_t prim0_uuid, prim1_uuid, prim2_uuid;
256
gu_uuid_generate (&state_uuid, NULL, 0);
257
gu_uuid_generate (&group1_uuid, NULL, 0);
258
gu_uuid_generate (&group2_uuid, NULL, 0);
259
gu_uuid_generate (&prim0_uuid, NULL, 0);
260
gu_uuid_generate (&prim1_uuid, NULL, 0);
261
gu_uuid_generate (&prim2_uuid, NULL, 0);
263
gcs_seqno_t prim1_seqno = 123;
264
gcs_seqno_t prim2_seqno = 834;
266
gcs_seqno_t act1_seqno = 345;
267
gcs_seqno_t act2_seqno = 239472508908LL;
269
gcs_state_quorum_t quorum;
273
/* First just nodes from different groups and configurations, none JOINED */
274
st[0] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim0_uuid,
275
5, prim2_seqno - 1, act2_seqno - 1,
276
GCS_NODE_STATE_JOINER,GCS_NODE_STATE_NON_PRIM,
279
fail_if(NULL == st[0]);
281
st[1] = gcs_state_msg_create (&state_uuid, &group1_uuid, &prim1_uuid,
282
3, prim1_seqno, act1_seqno,
283
GCS_NODE_STATE_JOINER,GCS_NODE_STATE_NON_PRIM,
286
fail_if(NULL == st[1]);
288
st[2] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim2_uuid,
289
5, prim2_seqno, act2_seqno,
290
GCS_NODE_STATE_JOINER,GCS_NODE_STATE_NON_PRIM,
293
fail_if(NULL == st[2]);
295
gu_info (" Remerged 1");
296
int ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
297
sizeof(st)/sizeof(gcs_state_msg_t*),
300
fail_if (1 != quorum.version);
301
fail_if (false != quorum.primary);
302
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &GU_UUID_NIL));
303
fail_if (GCS_SEQNO_ILL != quorum.act_id);
304
fail_if (GCS_SEQNO_ILL != quorum.conf_id);
305
fail_if (-1 != quorum.gcs_proto_ver);
306
fail_if (-1 != quorum.repl_proto_ver);
307
fail_if (-1 != quorum.appl_proto_ver);
309
/* Now make node0 to be joined at least once */
310
gcs_state_msg_destroy (st[0]);
311
st[0] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim0_uuid,
312
5, prim2_seqno - 1, act2_seqno - 1,
313
GCS_NODE_STATE_DONOR, GCS_NODE_STATE_NON_PRIM,
316
fail_if(NULL == st[0]);
318
gu_info (" Remerged 2");
319
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
320
sizeof(st)/sizeof(gcs_state_msg_t*),
323
fail_if (1 != quorum.version);
324
fail_if (true != quorum.primary);
325
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &group2_uuid));
326
fail_if (act2_seqno - 1 != quorum.act_id);
327
fail_if (prim2_seqno - 1 != quorum.conf_id);
328
fail_if (0 != quorum.gcs_proto_ver);
329
fail_if (1 != quorum.repl_proto_ver);
330
fail_if (0 != quorum.appl_proto_ver);
332
/* Now make node2 to be joined too */
333
gcs_state_msg_destroy (st[2]);
334
st[2] = gcs_state_msg_create (&state_uuid, &group2_uuid, &prim2_uuid,
335
5, prim2_seqno, act2_seqno,
336
GCS_NODE_STATE_JOINED,GCS_NODE_STATE_NON_PRIM,
339
fail_if(NULL == st[2]);
341
gu_info (" Remerged 3");
342
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
343
sizeof(st)/sizeof(gcs_state_msg_t*),
346
fail_if (1 != quorum.version);
347
fail_if (true != quorum.primary);
348
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &group2_uuid));
349
fail_if (act2_seqno != quorum.act_id);
350
fail_if (prim2_seqno != quorum.conf_id);
351
fail_if (0 != quorum.gcs_proto_ver);
352
fail_if (1 != quorum.repl_proto_ver);
353
fail_if (0 != quorum.appl_proto_ver);
355
/* now make node1 joined too: conflict */
356
gcs_state_msg_destroy (st[1]);
357
st[1] = gcs_state_msg_create (&state_uuid, &group1_uuid, &prim1_uuid,
358
3, prim1_seqno, act1_seqno,
359
GCS_NODE_STATE_SYNCED,GCS_NODE_STATE_NON_PRIM,
362
fail_if(NULL == st[1]);
364
gu_info (" Remerged 4");
365
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
366
sizeof(st)/sizeof(gcs_state_msg_t*),
369
fail_if (1 != quorum.version);
370
fail_if (false != quorum.primary);
371
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &GU_UUID_NIL));
372
fail_if (GCS_SEQNO_ILL != quorum.act_id);
373
fail_if (GCS_SEQNO_ILL != quorum.conf_id);
374
fail_if (-1 != quorum.gcs_proto_ver);
375
fail_if (-1 != quorum.repl_proto_ver);
376
fail_if (-1 != quorum.appl_proto_ver);
378
/* now make node1 current joiner: should be ignored */
379
gcs_state_msg_destroy (st[1]);
380
st[1] = gcs_state_msg_create (&state_uuid, &group1_uuid, &prim1_uuid,
381
3, prim1_seqno, act1_seqno,
382
GCS_NODE_STATE_SYNCED, GCS_NODE_STATE_JOINER,
385
fail_if(NULL == st[1]);
387
gu_info (" Remerged 5");
388
ret = gcs_state_msg_get_quorum ((const gcs_state_msg_t**)st,
389
sizeof(st)/sizeof(gcs_state_msg_t*),
392
fail_if (1 != quorum.version);
393
fail_if (true != quorum.primary);
394
fail_if (0 != gu_uuid_compare(&quorum.group_uuid, &group2_uuid));
395
fail_if (act2_seqno != quorum.act_id);
396
fail_if (prim2_seqno != quorum.conf_id);
397
fail_if (0 != quorum.gcs_proto_ver);
398
fail_if (1 != quorum.repl_proto_ver);
399
fail_if (0 != quorum.appl_proto_ver);
401
gcs_state_msg_destroy (st[0]);
402
gcs_state_msg_destroy (st[1]);
403
gcs_state_msg_destroy (st[2]);
105
407
Suite *gcs_state_msg_suite(void)
107
409
Suite *s = suite_create("GCS state message");
108
TCase *tc = tcase_create("gcs_state_msg");
110
suite_add_tcase (s, tc);
111
tcase_add_test (tc, gcs_state_msg_test_basic);
112
tcase_add_test (tc, gcs_state_msg_test_quorum);
410
TCase *tc_basic = tcase_create("gcs_state_msg_basic");
411
TCase *tc_inherit = tcase_create("gcs_state_msg_inherit");
412
TCase *tc_remerge = tcase_create("gcs_state_msg_remerge");
414
suite_add_tcase (s, tc_basic);
415
tcase_add_test (tc_basic, gcs_state_msg_test_basic);
417
suite_add_tcase (s, tc_inherit);
418
tcase_add_test (tc_inherit, gcs_state_msg_test_quorum_inherit);
420
suite_add_tcase (s, tc_remerge);
421
tcase_add_test (tc_remerge, gcs_state_msg_test_quorum_remerge);