mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-09-04 00:05:30 +00:00
- Add recover_wait state.
- If we make transition from startup to recover_wait, set a timer to get us to recover_done. - If peer state update is received, _always_ check to see if we should do a transition out of startup.
This commit is contained in:
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char copyright[] =
|
static char copyright[] =
|
||||||
"$Id: failover.c,v 1.45 2001/04/20 15:14:40 mellon Exp $ Copyright (c) 1999-2001 The Internet Software Consortium. All rights reserved.\n";
|
"$Id: failover.c,v 1.46 2001/04/20 18:11:40 mellon Exp $ Copyright (c) 1999-2001 The Internet Software Consortium. All rights reserved.\n";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
@@ -1256,10 +1256,18 @@ isc_result_t dhcp_failover_state_signal (omapi_object_t *o,
|
|||||||
|
|
||||||
dhcp_failover_link_reference (&state -> link_to_peer,
|
dhcp_failover_link_reference (&state -> link_to_peer,
|
||||||
link, MDL);
|
link, MDL);
|
||||||
dhcp_failover_send_state (state);
|
|
||||||
#if 0
|
#if 0
|
||||||
dhcp_failover_state_transition (state, "connect");
|
/* XXX This is probably the right thing to do, but
|
||||||
|
XXX for release three, to make the smallest possible
|
||||||
|
XXX change, we are doing this when the peer state
|
||||||
|
XXX changes instead. */
|
||||||
|
if (state -> me.state == startup)
|
||||||
|
dhcp_failover_set_state (state,
|
||||||
|
state -> saved_state);
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
|
dhcp_failover_send_state (state);
|
||||||
|
|
||||||
if (link -> imsg -> options_present & FTB_MAX_UNACKED)
|
if (link -> imsg -> options_present & FTB_MAX_UNACKED)
|
||||||
state -> partner.max_flying_updates =
|
state -> partner.max_flying_updates =
|
||||||
link -> imsg -> max_unacked;
|
link -> imsg -> max_unacked;
|
||||||
@@ -1404,6 +1412,7 @@ isc_result_t dhcp_failover_state_transition (dhcp_failover_state_t *state,
|
|||||||
case unknown_state:
|
case unknown_state:
|
||||||
case recover_done:
|
case recover_done:
|
||||||
case startup:
|
case startup:
|
||||||
|
case recover_wait:
|
||||||
return dhcp_failover_send_state (state);
|
return dhcp_failover_send_state (state);
|
||||||
}
|
}
|
||||||
} else if (!strcmp (name, "startup")) {
|
} else if (!strcmp (name, "startup")) {
|
||||||
@@ -1481,6 +1490,11 @@ isc_result_t dhcp_failover_set_service_state (dhcp_failover_state_t *state)
|
|||||||
state -> nrr = " (paused)";
|
state -> nrr = " (paused)";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case recover_wait:
|
||||||
|
state -> service_state = not_responding;
|
||||||
|
state -> nrr = " (recover wait)";
|
||||||
|
break;
|
||||||
|
|
||||||
case recover_done:
|
case recover_done:
|
||||||
state -> service_state = not_responding;
|
state -> service_state = not_responding;
|
||||||
state -> nrr = " (recover done)";
|
state -> nrr = " (recover done)";
|
||||||
@@ -1530,30 +1544,30 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
|
|||||||
resend, just in case. */
|
resend, just in case. */
|
||||||
if (state -> ack_queue_tail) {
|
if (state -> ack_queue_tail) {
|
||||||
struct lease *lp;
|
struct lease *lp;
|
||||||
|
|
||||||
/* Zap the flags. */
|
/* Zap the flags. */
|
||||||
for (lp = state -> ack_queue_head; lp; lp = lp -> next_pending)
|
for (lp = state -> ack_queue_head; lp; lp = lp -> next_pending)
|
||||||
lp -> flags = ((lp -> flags & ~ON_ACK_QUEUE) |
|
lp -> flags = ((lp -> flags & ~ON_ACK_QUEUE) |
|
||||||
ON_UPDATE_QUEUE);
|
ON_UPDATE_QUEUE);
|
||||||
|
|
||||||
/* Now hook the ack queue to the beginning of the update
|
/* Now hook the ack queue to the beginning of the update
|
||||||
queue. */
|
queue. */
|
||||||
if (state -> update_queue_head) {
|
if (state -> update_queue_head) {
|
||||||
lease_reference (&state -> ack_queue_tail -> next_pending,
|
lease_reference (&state -> ack_queue_tail -> next_pending,
|
||||||
state -> update_queue_head, MDL);
|
state -> update_queue_head, MDL);
|
||||||
lease_dereference (&state -> update_queue_head, MDL);
|
lease_dereference (&state -> update_queue_head, MDL);
|
||||||
}
|
}
|
||||||
lease_reference (&state -> update_queue_head,
|
lease_reference (&state -> update_queue_head,
|
||||||
state -> ack_queue_head, MDL);
|
state -> ack_queue_head, MDL);
|
||||||
if (!state -> update_queue_tail) {
|
if (!state -> update_queue_tail) {
|
||||||
#if defined (POINTER_DEBUG)
|
#if defined (POINTER_DEBUG)
|
||||||
if (state -> ack_queue_tail -> next_pending) {
|
if (state -> ack_queue_tail -> next_pending) {
|
||||||
log_error ("next pending on ack queue tail.");
|
log_error ("next pending on ack queue tail.");
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
lease_reference (&state -> update_queue_tail,
|
lease_reference (&state -> update_queue_tail,
|
||||||
state -> ack_queue_tail, MDL);
|
state -> ack_queue_tail, MDL);
|
||||||
}
|
}
|
||||||
lease_dereference (&state -> ack_queue_tail, MDL);
|
lease_dereference (&state -> ack_queue_tail, MDL);
|
||||||
lease_dereference (&state -> ack_queue_head, MDL);
|
lease_dereference (&state -> ack_queue_head, MDL);
|
||||||
@@ -1561,8 +1575,10 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
|
|||||||
}
|
}
|
||||||
cancel_timeout (dhcp_failover_keepalive, state);
|
cancel_timeout (dhcp_failover_keepalive, state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case recover:
|
case recover:
|
||||||
|
case recover_wait:
|
||||||
|
case recover_done:
|
||||||
case potential_conflict:
|
case potential_conflict:
|
||||||
case partner_down:
|
case partner_down:
|
||||||
case communications_interrupted:
|
case communications_interrupted:
|
||||||
@@ -1575,8 +1591,11 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
|
|||||||
/* Tentatively make the transition. */
|
/* Tentatively make the transition. */
|
||||||
saved_state = state -> me.state;
|
saved_state = state -> me.state;
|
||||||
saved_stos = state -> me.stos;
|
saved_stos = state -> me.stos;
|
||||||
state -> me.stos = cur_time;
|
/* Keep the old stos if we're going into recover_wait. */
|
||||||
state -> me.state = new_state;
|
if (new_state != recover_wait) {
|
||||||
|
state -> me.stos = cur_time;
|
||||||
|
state -> me.state = new_state;
|
||||||
|
}
|
||||||
|
|
||||||
if (!write_failover_state (state) || !commit_leases ()) {
|
if (!write_failover_state (state) || !commit_leases ()) {
|
||||||
/* XXX What to do? What to do? */
|
/* XXX What to do? What to do? */
|
||||||
@@ -1604,31 +1623,42 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
|
|||||||
if (state -> link_to_peer)
|
if (state -> link_to_peer)
|
||||||
dhcp_failover_send_state (state);
|
dhcp_failover_send_state (state);
|
||||||
|
|
||||||
switch (new_state)
|
switch (new_state) {
|
||||||
{
|
case normal:
|
||||||
case normal:
|
if (state -> partner.state == normal)
|
||||||
if (state -> partner.state == normal)
|
dhcp_failover_state_pool_check (state);
|
||||||
dhcp_failover_state_pool_check (state);
|
break;
|
||||||
break;
|
|
||||||
|
case potential_conflict:
|
||||||
case potential_conflict:
|
if (state -> i_am == primary)
|
||||||
if (state -> i_am == primary)
|
dhcp_failover_send_update_request (state);
|
||||||
dhcp_failover_send_update_request (state);
|
break;
|
||||||
break;
|
|
||||||
|
case startup:
|
||||||
case startup:
|
if (saved_state != startup)
|
||||||
if (saved_state != startup)
|
state -> saved_state = saved_state;
|
||||||
state -> saved_state = saved_state;
|
add_timeout (cur_time + 15,
|
||||||
add_timeout (cur_time + 15,
|
dhcp_failover_startup_timeout,
|
||||||
dhcp_failover_startup_timeout,
|
state,
|
||||||
state,
|
(tvref_t)omapi_object_reference,
|
||||||
(tvref_t)omapi_object_reference,
|
(tvunref_t)
|
||||||
(tvunref_t)
|
omapi_object_dereference);
|
||||||
omapi_object_dereference);
|
break;
|
||||||
break;
|
|
||||||
|
/* If we come back in recover_wait and there's still waiting
|
||||||
default:
|
to do, set a timeout. */
|
||||||
break;
|
case recover_wait:
|
||||||
|
if (state -> me.stos + state -> mclt > cur_time)
|
||||||
|
add_timeout ((int)(state -> me.stos + state -> mclt),
|
||||||
|
dhcp_failover_recover_done,
|
||||||
|
state,
|
||||||
|
(tvref_t)omapi_object_reference,
|
||||||
|
(tvunref_t)
|
||||||
|
omapi_object_dereference);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ISC_R_SUCCESS;
|
return ISC_R_SUCCESS;
|
||||||
@@ -1644,8 +1674,11 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
new_state = msg -> server_state;
|
new_state = msg -> server_state;
|
||||||
startupp = (msg -> server_flags & FTF_STARTUP) ? 1 : 0;
|
startupp = (msg -> server_flags & FTF_STARTUP) ? 1 : 0;
|
||||||
|
|
||||||
if (state -> partner.state == new_state)
|
if (state -> partner.state == new_state) {
|
||||||
|
if (state -> me.state == startup)
|
||||||
|
dhcp_failover_set_state (state, state -> saved_state);
|
||||||
return ISC_R_SUCCESS;
|
return ISC_R_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
state -> partner.state = new_state;
|
state -> partner.state = new_state;
|
||||||
|
|
||||||
@@ -1702,8 +1735,9 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
communications_interrupted);
|
communications_interrupted);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case recover_wait:
|
||||||
case recover_done:
|
case recover_done:
|
||||||
/* XXX what to do here? */
|
/* We probably don't need to do anything here. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case unknown_state:
|
case unknown_state:
|
||||||
@@ -1750,6 +1784,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
|
|
||||||
/* We should have asked for an update already. */
|
/* We should have asked for an update already. */
|
||||||
case recover_done:
|
case recover_done:
|
||||||
|
case recover_wait:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case unknown_state:
|
case unknown_state:
|
||||||
@@ -1767,6 +1802,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case recover_done:
|
case recover_done:
|
||||||
|
case recover_wait:
|
||||||
case potential_conflict:
|
case potential_conflict:
|
||||||
case partner_down:
|
case partner_down:
|
||||||
case communications_interrupted:
|
case communications_interrupted:
|
||||||
@@ -1799,6 +1835,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case recover_done:
|
case recover_done:
|
||||||
|
case recover_wait:
|
||||||
dhcp_failover_set_state (state, normal);
|
dhcp_failover_set_state (state, normal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1837,6 +1874,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
case normal:
|
case normal:
|
||||||
case communications_interrupted:
|
case communications_interrupted:
|
||||||
case recover_done:
|
case recover_done:
|
||||||
|
case recover_wait:
|
||||||
/* XXX so we don't need to do this specially in
|
/* XXX so we don't need to do this specially in
|
||||||
XXX the CONNECT and CONNECTACK handlers. */
|
XXX the CONNECT and CONNECTACK handlers. */
|
||||||
dhcp_failover_set_state (state, normal);
|
dhcp_failover_set_state (state, normal);
|
||||||
@@ -1867,6 +1905,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
case communications_interrupted:
|
case communications_interrupted:
|
||||||
case resolution_interrupted:
|
case resolution_interrupted:
|
||||||
case recover_done:
|
case recover_done:
|
||||||
|
case recover_wait:
|
||||||
dhcp_failover_set_state (state, potential_conflict);
|
dhcp_failover_set_state (state, potential_conflict);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1895,9 +1934,10 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
case communications_interrupted:
|
case communications_interrupted:
|
||||||
case resolution_interrupted:
|
case resolution_interrupted:
|
||||||
case paused:
|
case paused:
|
||||||
|
case recover:
|
||||||
|
case recover_wait:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case recover:
|
|
||||||
case shut_down:
|
case shut_down:
|
||||||
dhcp_failover_set_state (state, partner_down);
|
dhcp_failover_set_state (state, partner_down);
|
||||||
break;
|
break;
|
||||||
@@ -1915,6 +1955,10 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
|
|||||||
case paused:
|
case paused:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* We still have to wait... */
|
||||||
|
case recover_wait:
|
||||||
|
break;
|
||||||
|
|
||||||
case unknown_state:
|
case unknown_state:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2959,6 +3003,9 @@ const char *dhcp_failover_state_name_print (enum failover_state state)
|
|||||||
case recover_done:
|
case recover_done:
|
||||||
return "recover-done";
|
return "recover-done";
|
||||||
|
|
||||||
|
case recover_wait:
|
||||||
|
return "recover-wait";
|
||||||
|
|
||||||
case shut_down:
|
case shut_down:
|
||||||
return "shutdown";
|
return "shutdown";
|
||||||
|
|
||||||
@@ -4400,7 +4447,7 @@ dhcp_failover_process_update_request_all (dhcp_failover_state_t *state,
|
|||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dhcp_failover_process_update_done (dhcp_failover_state_t *state,
|
dhcp_failover_process_update_done (dhcp_failover_state_t *state,
|
||||||
failover_message_t *msg)
|
failover_message_t *msg)
|
||||||
{
|
{
|
||||||
log_info ("failover peer %s: peer update completed.",
|
log_info ("failover peer %s: peer update completed.",
|
||||||
state -> name);
|
state -> name);
|
||||||
@@ -4415,6 +4462,7 @@ dhcp_failover_process_update_done (dhcp_failover_state_t *state,
|
|||||||
case paused:
|
case paused:
|
||||||
case recover_done:
|
case recover_done:
|
||||||
case startup:
|
case startup:
|
||||||
|
case recover_wait:
|
||||||
break; /* shouldn't happen. */
|
break; /* shouldn't happen. */
|
||||||
|
|
||||||
/* We got the UPDDONE, so we can go into normal state! */
|
/* We got the UPDDONE, so we can go into normal state! */
|
||||||
@@ -4424,6 +4472,7 @@ dhcp_failover_process_update_done (dhcp_failover_state_t *state,
|
|||||||
|
|
||||||
case recover:
|
case recover:
|
||||||
if (state -> me.stos + state -> mclt > cur_time) {
|
if (state -> me.stos + state -> mclt > cur_time) {
|
||||||
|
dhcp_failover_set_state (state, recover_wait);
|
||||||
add_timeout ((int)(state -> me.stos + state -> mclt),
|
add_timeout ((int)(state -> me.stos + state -> mclt),
|
||||||
dhcp_failover_recover_done,
|
dhcp_failover_recover_done,
|
||||||
state,
|
state,
|
||||||
|
Reference in New Issue
Block a user