Randomize SOA refresh interval

Change-Id: I4271d428fbb0d81faaa9c06c41d00d9584e0cd90
This commit is contained in:
Federico Ceratto 2016-02-12 11:04:25 +00:00 committed by Federico Ceratto
parent d3162f1f30
commit aa140ff92f
6 changed files with 42 additions and 4 deletions

View File

@ -54,7 +54,9 @@ cfg.CONF.register_opts([
cfg.IntOpt('default-ttl', default=3600),
# Default SOA Values
cfg.IntOpt('default-soa-refresh', default=3600),
cfg.IntOpt('default-soa-refresh-min', default=3500,
deprecated_name='default-soa-refresh'),
cfg.IntOpt('default-soa-refresh-max', default=3600),
cfg.IntOpt('default-soa-retry', default=600),
cfg.IntOpt('default-soa-expire', default=86400),
cfg.IntOpt('default-soa-minimum', default=3600),

View File

@ -843,6 +843,20 @@ class Service(service.RPCService, service.Service):
return self.storage.count_tenants(context)
# Zone Methods
def _generate_soa_refresh_interval(self):
"""Generate a random refresh interval to stagger AXFRs across multiple
zones and resolvers
maximum val: default_soa_refresh_min
minimum val: default_soa_refresh_max
"""
assert cfg.CONF.default_soa_refresh_min is not None
assert cfg.CONF.default_soa_refresh_max is not None
dispersion = (cfg.CONF.default_soa_refresh_max -
cfg.CONF.default_soa_refresh_min) * random.random()
refresh_time = cfg.CONF.default_soa_refresh_min + dispersion
return int(refresh_time)
@notification('dns.domain.create')
@notification('dns.zone.create')
@synchronized_zone(new_zone=True)
@ -914,6 +928,9 @@ class Service(service.RPCService, service.Service):
if zone.type == 'SECONDARY' and zone.serial is None:
zone.serial = 1
# randomize the zone refresh time
zone.refresh = self._generate_soa_refresh_interval()
zone = self._create_zone_in_storage(context, zone)
self.pool_manager_api.create_zone(context, zone)

View File

@ -44,6 +44,10 @@ ZONE_TASK_TYPES = ['IMPORT', 'EXPORT']
metadata = MetaData()
# TODO(Federico) some default column values are not needed because we
# explicitely set the value on record insertion. Having default values could
# hide bugs.
def default_shard(context, id_col):
return int(context.current_parameters[id_col][0:3], 16)
@ -96,7 +100,8 @@ zones = Table('zones', metadata,
Column('transferred_at', DateTime, default=None),
Column('ttl', Integer, default=CONF.default_ttl, nullable=False),
Column('serial', Integer, default=timeutils.utcnow_ts, nullable=False),
Column('refresh', Integer, default=CONF.default_soa_refresh,
# The refresh interval is randomized by _generate_soa_refresh_interval
Column('refresh', Integer, default=CONF.default_soa_refresh_min,
nullable=False),
Column('retry', Integer, default=CONF.default_soa_retry, nullable=False),
Column('expire', Integer, default=CONF.default_soa_expire, nullable=False),

View File

@ -517,6 +517,11 @@ class CentralServiceTest(CentralTestCase):
with testtools.ExpectedException(exceptions.OverQuota):
self.create_zone()
def test_create_zone_with_refresh_time_dispersion(self):
random.seed(42)
zone = self.create_zone()
self.assertEqual(3563, zone['refresh'])
def test_create_subzone(self):
# Create the Parent Zone using fixture 0
parent_zone = self.create_zone(fixture=0)

View File

@ -4,7 +4,7 @@
Guru Meditation Reports
=========================
A Guru Meditation Reports(GMR) is generated by the Designate services when
A Guru Meditation Report (GMR) is generated by the Designate services when
service processes receiving SIGUSR2 signal. The report is a general-purpose
debug report for developers and system admins which contains the current state
of a running Designate service process.
@ -309,7 +309,8 @@ GMR Example
debug = True
default-soa-expire = 86400
default-soa-minimum = 3600
default-soa-refresh = 3600
default-soa-refresh-min = 3500
default-soa-refresh-max = 3600
default-soa-retry = 600
default-ttl = 3600
default_log_levels =

View File

@ -0,0 +1,8 @@
---
features:
- Randomize SOA refresh interval to stagger AXFRs across multiple zones and
resolvers.
Introduce the new configuration parameters default-soa-refresh-min and
default-soa-refresh-max
deprecations:
- default-soa-refresh configuration option