Merge "Randomize SOA refresh interval"

This commit is contained in:
Jenkins 2016-02-23 14:08:16 +00:00 committed by Gerrit Code Review
commit bea907ca82
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), cfg.IntOpt('default-ttl', default=3600),
# Default SOA Values # 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-retry', default=600),
cfg.IntOpt('default-soa-expire', default=86400), cfg.IntOpt('default-soa-expire', default=86400),
cfg.IntOpt('default-soa-minimum', default=3600), 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) return self.storage.count_tenants(context)
# Zone Methods # 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.domain.create')
@notification('dns.zone.create') @notification('dns.zone.create')
@synchronized_zone(new_zone=True) @synchronized_zone(new_zone=True)
@ -914,6 +928,9 @@ class Service(service.RPCService, service.Service):
if zone.type == 'SECONDARY' and zone.serial is None: if zone.type == 'SECONDARY' and zone.serial is None:
zone.serial = 1 zone.serial = 1
# randomize the zone refresh time
zone.refresh = self._generate_soa_refresh_interval()
zone = self._create_zone_in_storage(context, zone) zone = self._create_zone_in_storage(context, zone)
self.pool_manager_api.create_zone(context, zone) self.pool_manager_api.create_zone(context, zone)

View File

@ -44,6 +44,10 @@ ZONE_TASK_TYPES = ['IMPORT', 'EXPORT']
metadata = MetaData() 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): def default_shard(context, id_col):
return int(context.current_parameters[id_col][0:3], 16) 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('transferred_at', DateTime, default=None),
Column('ttl', Integer, default=CONF.default_ttl, nullable=False), Column('ttl', Integer, default=CONF.default_ttl, nullable=False),
Column('serial', Integer, default=timeutils.utcnow_ts, 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), nullable=False),
Column('retry', Integer, default=CONF.default_soa_retry, nullable=False), Column('retry', Integer, default=CONF.default_soa_retry, nullable=False),
Column('expire', Integer, default=CONF.default_soa_expire, 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): with testtools.ExpectedException(exceptions.OverQuota):
self.create_zone() 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): def test_create_subzone(self):
# Create the Parent Zone using fixture 0 # Create the Parent Zone using fixture 0
parent_zone = self.create_zone(fixture=0) parent_zone = self.create_zone(fixture=0)

View File

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