2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-31 14:25:41 +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:
Ted Lemon
2001-04-20 18:11:40 +00:00
parent 3417f5cf6a
commit fd273e02d9

View File

@@ -43,7 +43,7 @@
#ifndef lint
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 */
#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,
link, MDL);
dhcp_failover_send_state (state);
#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
dhcp_failover_send_state (state);
if (link -> imsg -> options_present & FTB_MAX_UNACKED)
state -> partner.max_flying_updates =
link -> imsg -> max_unacked;
@@ -1404,6 +1412,7 @@ isc_result_t dhcp_failover_state_transition (dhcp_failover_state_t *state,
case unknown_state:
case recover_done:
case startup:
case recover_wait:
return dhcp_failover_send_state (state);
}
} 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)";
break;
case recover_wait:
state -> service_state = not_responding;
state -> nrr = " (recover wait)";
break;
case recover_done:
state -> service_state = not_responding;
state -> nrr = " (recover done)";
@@ -1530,30 +1544,30 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
resend, just in case. */
if (state -> ack_queue_tail) {
struct lease *lp;
/* Zap the flags. */
for (lp = state -> ack_queue_head; lp; lp = lp -> next_pending)
lp -> flags = ((lp -> flags & ~ON_ACK_QUEUE) |
ON_UPDATE_QUEUE);
/* Now hook the ack queue to the beginning of the update
queue. */
if (state -> update_queue_head) {
lease_reference (&state -> ack_queue_tail -> next_pending,
state -> update_queue_head, MDL);
lease_dereference (&state -> update_queue_head, MDL);
lease_reference (&state -> ack_queue_tail -> next_pending,
state -> update_queue_head, MDL);
lease_dereference (&state -> update_queue_head, MDL);
}
lease_reference (&state -> update_queue_head,
state -> ack_queue_head, MDL);
if (!state -> update_queue_tail) {
#if defined (POINTER_DEBUG)
if (state -> ack_queue_tail -> next_pending) {
log_error ("next pending on ack queue tail.");
abort ();
}
if (state -> ack_queue_tail -> next_pending) {
log_error ("next pending on ack queue tail.");
abort ();
}
#endif
lease_reference (&state -> update_queue_tail,
state -> ack_queue_tail, MDL);
lease_reference (&state -> update_queue_tail,
state -> ack_queue_tail, MDL);
}
lease_dereference (&state -> ack_queue_tail, 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);
break;
case recover:
case recover_wait:
case recover_done:
case potential_conflict:
case partner_down:
case communications_interrupted:
@@ -1575,8 +1591,11 @@ isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *state,
/* Tentatively make the transition. */
saved_state = state -> me.state;
saved_stos = state -> me.stos;
state -> me.stos = cur_time;
state -> me.state = new_state;
/* Keep the old stos if we're going into recover_wait. */
if (new_state != recover_wait) {
state -> me.stos = cur_time;
state -> me.state = new_state;
}
if (!write_failover_state (state) || !commit_leases ()) {
/* 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)
dhcp_failover_send_state (state);
switch (new_state)
{
case normal:
if (state -> partner.state == normal)
dhcp_failover_state_pool_check (state);
break;
case potential_conflict:
if (state -> i_am == primary)
dhcp_failover_send_update_request (state);
break;
case startup:
if (saved_state != startup)
state -> saved_state = saved_state;
add_timeout (cur_time + 15,
dhcp_failover_startup_timeout,
state,
(tvref_t)omapi_object_reference,
(tvunref_t)
omapi_object_dereference);
break;
default:
break;
switch (new_state) {
case normal:
if (state -> partner.state == normal)
dhcp_failover_state_pool_check (state);
break;
case potential_conflict:
if (state -> i_am == primary)
dhcp_failover_send_update_request (state);
break;
case startup:
if (saved_state != startup)
state -> saved_state = saved_state;
add_timeout (cur_time + 15,
dhcp_failover_startup_timeout,
state,
(tvref_t)omapi_object_reference,
(tvunref_t)
omapi_object_dereference);
break;
/* If we come back in recover_wait and there's still waiting
to do, set a timeout. */
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;
@@ -1644,8 +1674,11 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
new_state = msg -> server_state;
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;
}
state -> partner.state = new_state;
@@ -1702,8 +1735,9 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
communications_interrupted);
break;
case recover_wait:
case recover_done:
/* XXX what to do here? */
/* We probably don't need to do anything here. */
break;
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. */
case recover_done:
case recover_wait:
break;
case unknown_state:
@@ -1767,6 +1802,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
break;
case recover_done:
case recover_wait:
case potential_conflict:
case partner_down:
case communications_interrupted:
@@ -1799,6 +1835,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
break;
case recover_done:
case recover_wait:
dhcp_failover_set_state (state, normal);
break;
@@ -1837,6 +1874,7 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
case normal:
case communications_interrupted:
case recover_done:
case recover_wait:
/* XXX so we don't need to do this specially in
XXX the CONNECT and CONNECTACK handlers. */
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 resolution_interrupted:
case recover_done:
case recover_wait:
dhcp_failover_set_state (state, potential_conflict);
break;
@@ -1895,9 +1934,10 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
case communications_interrupted:
case resolution_interrupted:
case paused:
case recover:
case recover_wait:
break;
case recover:
case shut_down:
dhcp_failover_set_state (state, partner_down);
break;
@@ -1915,6 +1955,10 @@ isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *state,
case paused:
break;
/* We still have to wait... */
case recover_wait:
break;
case unknown_state:
break;
}
@@ -2959,6 +3003,9 @@ const char *dhcp_failover_state_name_print (enum failover_state state)
case recover_done:
return "recover-done";
case recover_wait:
return "recover-wait";
case shut_down:
return "shutdown";
@@ -4400,7 +4447,7 @@ dhcp_failover_process_update_request_all (dhcp_failover_state_t *state,
isc_result_t
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.",
state -> name);
@@ -4415,6 +4462,7 @@ dhcp_failover_process_update_done (dhcp_failover_state_t *state,
case paused:
case recover_done:
case startup:
case recover_wait:
break; /* shouldn't happen. */
/* 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:
if (state -> me.stos + state -> mclt > cur_time) {
dhcp_failover_set_state (state, recover_wait);
add_timeout ((int)(state -> me.stos + state -> mclt),
dhcp_failover_recover_done,
state,