<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>dhcpd 3.1.2b1 failover with reserved flags</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->
<BR>

<P><FONT SIZE=2>I just submitted this email to dhcp-bugs, but wanted to put it out on the mailing list incase anyone else sees problems like this that i ran into<BR>
<BR>
****<BR>
I wanted to run these in production for awhile before submitting them, not sure if they've been resolved in newer versions (given the release notes, i didn't see much around them), but then i forgot to submit them.  We've been running them in production for quite a while now and they seemed to have fixed problems around a failover pair and reserved leases.  We were having 2 problems if I remember correctly:<BR>
<BR>
1.  In mdb.c it was not always preferring a reserved lease<BR>
2.  in the failover pair, a secondary server wouldn't allocate a reserved lease<BR>
<BR>
I am not a coder, so i'm not sure if it's kosher or not, but as i said it's been running in production for a few months now on our end and it fixed the 2 problems above.<BR>
<BR>
Let me know what you think.<BR>
<BR>
--- mdb.c.orig  2009-03-16 13:27:37.000000000 -0500<BR>
+++ mdb.c       2009-03-16 22:35:35.000000000 -0500<BR>
@@ -1684,18 +1684,21 @@<BR>
  * the 'uid_hash_add' and 'hw_hash_add' functions (this is common logic<BR>
  * to those two functions).<BR>
  *<BR>
- * 1) ACTIVE leases are preferred.  The active lease with<BR>
+ * 1) RESERVED leases are always preferred<BR>
+ * 2) ACTIVE leases are preferred.  The active lease with<BR>
  *    the longest lifetime is preferred over shortest.<BR>
- * 2) "transitional states" are next, this time with the<BR>
+ * 3) "transitional states" are next, this time with the<BR>
  *    most recent CLTT.<BR>
- * 3) free/backup/etc states are next, again with CLTT.  In truth we<BR>
+ * 4) free/backup/etc states are next, again with CLTT.  In truth we<BR>
  *    should never see reset leases for this.<BR>
- * 4) Abandoned leases are always dead last.<BR>
+ * 5) Abandoned leases are always dead last.<BR>
  */<BR>
 static isc_boolean_t<BR>
 client_lease_preferred(struct lease *cand, struct lease *lease)<BR>
 {<BR>
-       if (cand->binding_state == FTS_ACTIVE) {<BR>
+       if (lease->flags & RESERVED_LEASE) {<BR>
+               return ISC_TRUE;<BR>
+       } else if (cand->binding_state == FTS_ACTIVE) {<BR>
                if (lease->binding_state == FTS_ACTIVE &&<BR>
                    lease->ends >= cand->ends)<BR>
                        return ISC_TRUE;<BR>
<BR>
--- failover.c.orig     2008-09-24 11:20:26.000000000 -0500<BR>
+++ failover.c  2009-03-26 16:52:46.000000000 -0500<BR>
@@ -6068,6 +6068,18 @@<BR>
                        if (peer -> i_am == primary)<BR>
                                return 1;<BR>
<BR>
+                       if (lease->flags & RESERVED_LEASE)<BR>
+                               return 1;<BR>
+<BR>
+                        /* If lease is RESERVED allow secondary to allocate<BR>
+                         * lease<BR>
+                         */<BR>
+<BR>
+                        if ((peer -> i_am == secondary) &&<BR>
+                             (lease->flags & RESERVED_LEASE)) {<BR>
+                                return 1;<BR>
+                        }<BR>
+<BR>
                        return(peer->service_state == service_partner_down &&<BR>
                               ((lease->tsfp < peer->me.stos) ?<BR>
                                (peer->me.stos + peer->mclt < cur_time) :<BR>
@@ -6091,6 +6103,10 @@<BR>
                         * to MCLT, rather than a TSFP-optimal lease, which is<BR>
                         * the only danger for a lease in one of these states.<BR>
                         */<BR>
+<BR>
+                       if (lease->flags & RESERVED_LEASE)<BR>
+                               return 1;<BR>
+<BR>
                        return((peer->service_state == service_partner_down) &&<BR>
                               (lease->tsfp < cur_time));<BR>
<BR>
@@ -6100,9 +6116,20 @@<BR>
                         * least TSFP+MCLT or STOS+MCLT must have expired,<BR>
                         * whichever is greater.<BR>
                         */<BR>
-                       if (peer->i_am == secondary)<BR>
+                       if (peer->i_am == secondary)<BR>
+                               return 1;<BR>
+<BR>
+                       if (lease->flags & RESERVED_LEASE)<BR>
                                return 1;<BR>
<BR>
+                        /* If lease is RESERVED allow primary to allocate<BR>
+                         * lease<BR>
+                         */<BR>
+                        if ((peer -> i_am == primary) &&<BR>
+                             (lease->flags & RESERVED_LEASE)) {<BR>
+                                return 1;<BR>
+                        }<BR>
+<BR>
                        return((peer->service_state == service_partner_down) &&<BR>
                               ((lease->tsfp < peer->me.stos) ?<BR>
                                (peer->me.stos + peer->mclt < cur_time) :<BR>
<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>