220
214
if (LIST_ISEMPTY(vs->rs))
222
log_message(LOG_INFO,
223
"%s the pool for VS [%s:%d]"
224
, add?"Adding alive servers to":"Removing alive servers from"
225
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
226
, ntohs(SVR_PORT(vs)));
217
log_message(LOG_INFO, "%s the pool for VS [%s]:%d"
218
, add?"Adding alive servers to":"Removing alive servers from"
219
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
220
, ntohs(inet_sockaddrport(&vs->addr)));
227
221
for (e = LIST_HEAD(vs->rs); e; ELEMENT_NEXT(e)) {
228
222
rs = ELEMENT_DATA(e);
229
223
if (!ISALIVE(rs)) /* We only handle alive servers */
231
if (!(add ^ rs->set)) /* Already done */
233
if (add) rs->alive = 0;
234
ipvs_cmd(add?LVS_CMD_ADD_DEST:LVS_CMD_DEL_DEST,
235
check_data->vs_group, vs, rs);
227
ipvs_cmd(add?LVS_CMD_ADD_DEST:LVS_CMD_DEL_DEST, check_data->vs_group, vs, rs);
232
/* set quorum state depending on current weight of real servers */
234
update_quorum_state(virtual_server * vs)
236
char rsip[INET6_ADDRSTRLEN];
238
/* If we have just gained quorum, it's time to consider notify_up. */
239
if (vs->quorum_state == DOWN &&
240
weigh_live_realservers(vs) >= vs->quorum + vs->hysteresis) {
241
vs->quorum_state = UP;
242
log_message(LOG_INFO, "Gained quorum %lu+%lu=%lu <= %u for VS [%s]:%d"
245
, vs->quorum + vs->hysteresis
246
, weigh_live_realservers(vs)
247
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
248
, ntohs(inet_sockaddrport(&vs->addr)));
249
if (vs->s_svr && ISALIVE(vs->s_svr)) {
250
log_message(LOG_INFO, "Removing sorry server [%s]:%d from VS [%s]:%d"
251
, inet_sockaddrtos2(&vs->s_svr->addr, rsip)
252
, ntohs(inet_sockaddrport(&vs->s_svr->addr))
253
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
254
, ntohs(inet_sockaddrport(&vs->addr)));
256
ipvs_cmd(LVS_CMD_DEL_DEST, check_data->vs_group, vs, vs->s_svr);
257
vs->s_svr->alive = 0;
259
/* Adding back alive real servers */
260
perform_quorum_state(vs, 1);
263
log_message(LOG_INFO, "Executing [%s] for VS [%s]:%d"
265
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
266
, ntohs(inet_sockaddrport(&vs->addr)));
267
notify_exec(vs->quorum_up);
272
/* If we have just lost quorum for the VS, we need to consider
273
* VS notify_down and sorry_server cases
275
if (vs->quorum_state == UP &&
276
weigh_live_realservers(vs) < vs->quorum - vs->hysteresis) {
277
vs->quorum_state = DOWN;
278
log_message(LOG_INFO, "Lost quorum %lu-%lu=%lu > %u for VS [%s]:%d"
281
, vs->quorum - vs->hysteresis
282
, weigh_live_realservers(vs)
283
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
284
, ntohs(inet_sockaddrport(&vs->addr)));
285
if (vs->quorum_down) {
286
log_message(LOG_INFO, "Executing [%s] for VS [%s]:%d"
288
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
289
, ntohs(inet_sockaddrport(&vs->addr)));
290
notify_exec(vs->quorum_down);
293
log_message(LOG_INFO, "Adding sorry server [%s]:%d to VS [%s]:%d"
294
, inet_sockaddrtos2(&vs->s_svr->addr, rsip)
295
, ntohs(inet_sockaddrport(&vs->s_svr->addr))
296
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
297
, ntohs(inet_sockaddrport(&vs->addr)));
299
/* the sorry server is now up in the pool, we flag it alive */
300
ipvs_cmd(LVS_CMD_ADD_DEST, check_data->vs_group, vs, vs->s_svr);
301
vs->s_svr->alive = 1;
303
/* Remove remaining alive real servers */
304
perform_quorum_state(vs, 0);
240
310
/* manipulate add/remove rs according to alive state */
242
312
perform_svr_state(int alive, virtual_server * vs, real_server * rs)
244
char rsip[16], vsip[16];
246
* | ISALIVE(rs) | alive | context
247
* | 0 | 0 | first check failed under alpha mode, unreachable here
248
* | 0 | 1 | RS went up, add it to the pool
249
* | 1 | 0 | RS went down, remove it from the pool
250
* | 1 | 1 | first check succeeded w/o alpha mode, unreachable here
314
char rsip[INET6_ADDRSTRLEN];
317
* | ISALIVE(rs) | alive | context
318
* | 0 | 0 | first check failed under alpha mode, unreachable here
319
* | 0 | 1 | RS went up, add it to the pool
320
* | 1 | 0 | RS went down, remove it from the pool
321
* | 1 | 1 | first check succeeded w/o alpha mode, unreachable here
253
323
if (!ISALIVE(rs) && alive) {
255
/* adding a server to the vs pool, if sorry server is flagged alive,
256
* we remove it from the vs pool.
259
if (ISALIVE(vs->s_svr) &&
260
(vs->quorum_state == UP ||
261
(weigh_live_realservers(vs) + rs->weight >=
262
vs->quorum + vs->hysteresis))) {
263
log_message(LOG_INFO,
264
"Removing sorry server [%s:%d] from VS [%s:%d]",
265
inet_ntoa2(SVR_IP(vs->s_svr), rsip)
266
, ntohs(SVR_PORT(vs->s_svr))
267
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
268
, ntohs(SVR_PORT(vs)));
270
ipvs_cmd(LVS_CMD_DEL_DEST
271
, check_data->vs_group
274
vs->s_svr->alive = 0;
278
log_message(LOG_INFO, "%s service [%s:%d] to VS [%s:%d]",
279
(rs->inhibit) ? "Enabling" : "Adding"
280
, inet_ntoa2(SVR_IP(rs), rsip)
281
, ntohs(SVR_PORT(rs))
282
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
283
, ntohs(SVR_PORT(vs)));
324
log_message(LOG_INFO, "%s service [%s]:%d to VS [%s]:%d"
325
, (rs->inhibit) ? "Enabling" : "Adding"
326
, inet_sockaddrtos2(&rs->addr, rsip)
327
, ntohs(inet_sockaddrport(&rs->addr))
328
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
329
, ntohs(inet_sockaddrport(&vs->addr)));
284
330
/* Add only if we have quorum or no sorry server */
285
331
if (vs->quorum_state == UP || !vs->s_svr || !ISALIVE(vs->s_svr)) {
286
332
ipvs_cmd(LVS_CMD_ADD_DEST, check_data->vs_group, vs, rs);
288
334
rs->alive = alive;
289
335
if (rs->notify_up) {
290
log_message(LOG_INFO, "Executing [%s] for service [%s:%d]"
293
, inet_ntoa2(SVR_IP(rs), rsip)
294
, ntohs(SVR_PORT(rs))
295
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
296
, ntohs(SVR_PORT(vs)));
336
log_message(LOG_INFO, "Executing [%s] for service [%s]:%d in VS [%s]:%d"
338
, inet_sockaddrtos2(&rs->addr, rsip)
339
, ntohs(inet_sockaddrport(&rs->addr))
340
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
341
, ntohs(inet_sockaddrport(&vs->addr)));
297
342
notify_exec(rs->notify_up);
299
/* If we have just gained quorum, it's time to consider notify_up. */
300
if (vs->quorum_state == DOWN
301
&& weigh_live_realservers(vs) >= vs->quorum + vs->hysteresis) {
302
vs->quorum_state = UP;
303
log_message(LOG_INFO, "Gained quorum %lu+%lu=%lu <= %u for VS [%s:%d]"
306
, vs->quorum + vs->hysteresis
307
, weigh_live_realservers(vs)
308
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
309
, ntohs(SVR_PORT(vs)));
311
/* Adding back alive real servers */
312
perform_quorum_state(vs, 1);
314
log_message(LOG_INFO, "Executing [%s] for VS [%s:%d]"
316
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
317
, ntohs(SVR_PORT(vs)));
318
notify_exec(vs->quorum_up);
345
/* We may have gained quorum */
346
update_quorum_state(vs);
324
349
if (ISALIVE(rs) && !alive) {
326
log_message(LOG_INFO, "%s service [%s:%d] from VS [%s:%d]",
327
(rs->inhibit) ? "Disabling" : "Removing"
328
, inet_ntoa2(SVR_IP(rs), rsip)
329
, ntohs(SVR_PORT(rs))
330
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
331
, ntohs(SVR_PORT(vs)));
333
/* server is down, it is removed from the LVS realserver pool */
334
/* Remove only if we have quorum or no sorry server */
350
log_message(LOG_INFO, "%s service [%s]:%d from VS [%s]:%d"
351
, (rs->inhibit) ? "Disabling" : "Removing"
352
, inet_sockaddrtos2(&rs->addr, rsip)
353
, ntohs(inet_sockaddrport(&rs->addr))
354
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
355
, ntohs(inet_sockaddrport(&vs->addr)));
357
/* server is down, it is removed from the LVS realserver pool
358
* Remove only if we have quorum or no sorry server
335
360
if (vs->quorum_state == UP || !vs->s_svr || !ISALIVE(vs->s_svr)) {
336
361
ipvs_cmd(LVS_CMD_DEL_DEST, check_data->vs_group, vs, rs);
338
363
rs->alive = alive;
339
364
if (rs->notify_down) {
340
log_message(LOG_INFO, "Executing [%s] for service [%s:%d]"
343
, inet_ntoa2(SVR_IP(rs), rsip)
344
, ntohs(SVR_PORT(rs))
345
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
346
, ntohs(SVR_PORT(vs)));
365
log_message(LOG_INFO, "Executing [%s] for service [%s]:%d in VS [%s]:%d"
367
, inet_sockaddrtos2(&rs->addr, rsip)
368
, ntohs(inet_sockaddrport(&rs->addr))
369
, (vs->vsgname) ? vs->vsgname : inet_sockaddrtos(&vs->addr)
370
, ntohs(inet_sockaddrport(&vs->addr)));
347
371
notify_exec(rs->notify_down);
350
/* If we have just lost quorum for the VS, we need to consider
351
* VS notify_down and sorry_server cases
353
if (vs->quorum_state == UP
354
&& weigh_live_realservers(vs) < vs->quorum - vs->hysteresis) {
355
vs->quorum_state = DOWN;
356
log_message(LOG_INFO, "Lost quorum %lu-%lu=%lu > %u for VS [%s:%d]"
359
, vs->quorum - vs->hysteresis
360
, weigh_live_realservers(vs)
361
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
362
, ntohs(SVR_PORT(vs)));
363
if (vs->quorum_down) {
364
log_message(LOG_INFO, "Executing [%s] for VS [%s:%d]"
366
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
367
, ntohs(SVR_PORT(vs)));
368
notify_exec(vs->quorum_down);
371
log_message(LOG_INFO,
372
"Adding sorry server [%s:%d] to VS [%s:%d]",
373
inet_ntoa2(SVR_IP(vs->s_svr), rsip)
374
, ntohs(SVR_PORT(vs->s_svr))
375
, (vs->vsgname) ? vs->vsgname : inet_ntoa2(SVR_IP(vs), vsip)
376
, ntohs(SVR_PORT(vs)));
378
/* the sorry server is now up in the pool, we flag it alive */
379
ipvs_cmd(LVS_CMD_ADD_DEST, check_data->vs_group, vs, vs->s_svr);
380
vs->s_svr->alive = 1;
382
/* Remove remaining alive real servers */
383
perform_quorum_state(vs, 0);
374
/* We may have lost quorum */
375
update_quorum_state(vs);