From 41ca314cc2fafaaa9089438bdfd24880bafa9079 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 22 Dec 2011 23:43:52 +0000 Subject: [PATCH] 3260. [bug] "rrset-order cyclic" could appears to not rotate for some query patterns. [RT #27170] --- CHANGES | 3 +++ lib/dns/rbtdb.c | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ab6060de47..500853a5a2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3260. [bug] "rrset-order cyclic" could appears to not rotate + for some query patterns. [RT #27170] + --- 9.9.0rc1 released --- 3259. [bug] named-compilezone: Suppress "dump zone to " diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index d4e7316dc3..c346118c55 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.323 2011/12/07 22:21:05 marka Exp $ */ +/* $Id: rbtdb.c,v 1.324 2011/12/22 23:43:52 marka Exp $ */ /*! \file */ @@ -2744,6 +2744,14 @@ zone_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { return (result); } +static inline unsigned int +prand(isc_uint32_t val) { + val ^= val >> 16; + val ^= val >> 8; + val ^= val >> 4; + return (val & 0xf); +} + static inline void bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, rdatasetheader_t *header, isc_stdtime_t now, @@ -2783,6 +2791,8 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, raw = (unsigned char *)header + sizeof(*header); rdataset->private3 = raw; rdataset->count = header->count++; + /* Add a weak pseudo random value [0..15]. */ + header->count += prand(header->count); if (rdataset->count == ISC_UINT32_MAX) rdataset->count = 0;