Ema has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/367903 )
Change subject: Add support for One-packet scheduling (OPS) ...................................................................... Add support for One-packet scheduling (OPS) Add a new boolean service configuration parameter, `ops`, defaulting to False. The parameter can only be True for UDP services, and enables One-packet scheduling. With OPS, a new scheduling decision is made for every packet, hopefully avoiding the issues LVS has when tracking "UDP connections". Ref: http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.UDP.html Change-Id: If643710b99b2eadd1874c4e125f354e3773bed0d --- M pybal/ipvs.py M pybal/main.py M pybal/test/test_ipvs.py 3 files changed, 34 insertions(+), 8 deletions(-) Approvals: Ema: Looks good to me, approved BBlack: Looks good to me, but someone else must approve jenkins-bot: Verified diff --git a/pybal/ipvs.py b/pybal/ipvs.py index eda6474..8365e50 100644 --- a/pybal/ipvs.py +++ b/pybal/ipvs.py @@ -100,6 +100,10 @@ if len(service) > 3: cmd += ' -s ' + service[3] + # One-packet scheduling + if len(service) > 4 and service[4]: + cmd += ' -o' + return cmd @classmethod @@ -162,7 +166,7 @@ SVC_SCHEDULERS = ('rr', 'wrr', 'lc', 'wlc', 'lblc', 'lblcr', 'dh', 'sh', 'sed', 'nq') - def __init__(self, name, (protocol, ip, port, scheduler), configuration): + def __init__(self, name, (protocol, ip, port, scheduler, ops), configuration): """Constructor""" self.name = name @@ -172,10 +176,16 @@ scheduler not in self.SVC_SCHEDULERS): raise ValueError('Invalid protocol or scheduler') + if protocol == 'tcp' and ops: + raise ValueError( + 'OPS can only be used with UDP virtual services') + self.protocol = protocol self.ip = ip self.port = port self.scheduler = scheduler + # Boolean to toggle "One-packet scheduling" + self.ops = ops self.configuration = configuration @@ -189,10 +199,10 @@ self.createService() def service(self): - """Returns a tuple (protocol, ip, port, scheduler) that + """Returns a tuple (protocol, ip, port, scheduler, ops) that describes this LVS instance.""" - return (self.protocol, self.ip, self.port, self.scheduler) + return (self.protocol, self.ip, self.port, self.scheduler, self.ops) def createService(self): """Initializes this LVS instance in LVS.""" diff --git a/pybal/main.py b/pybal/main.py index b0184a9..65b38e1 100755 --- a/pybal/main.py +++ b/pybal/main.py @@ -13,7 +13,7 @@ import logging import signal -from ConfigParser import SafeConfigParser +from ConfigParser import SafeConfigParser, NoOptionError from twisted.internet import reactor @@ -85,11 +85,16 @@ for section in config.sections(): if section != 'global': + try: + ops = config.getboolean(section, 'ops') + except NoOptionError: + ops = False cfgtuple = ( config.get(section, 'protocol'), config.get(section, 'ip'), config.getint(section, 'port'), - config.get(section, 'scheduler')) + config.get(section, 'scheduler'), + ops) # Read the custom configuration options of the LVS section configdict = util.ConfigDict(config.items(section)) diff --git a/pybal/test/test_ipvs.py b/pybal/test/test_ipvs.py index 45da486..c53ff21 100644 --- a/pybal/test/test_ipvs.py +++ b/pybal/test/test_ipvs.py @@ -104,7 +104,7 @@ def setUp(self): super(LVSServiceTestCase, self).setUp() self.config['dryrun'] = 'true' - self.service = ('tcp', '127.0.0.1', 80, 'rr') + self.service = ('tcp', '127.0.0.1', 80, 'rr', False) pybal.bgpfailover.BGPFailover.prefixes.clear() def stubbedModifyState(cls, cmdList): @@ -120,12 +120,16 @@ def testConstructor(self): """Test `LVSService.__init__`.""" with self.assertRaises(ValueError): - service = ('invalid-protocol', '127.0.0.1', 80, 'rr') + service = ('invalid-protocol', '127.0.0.1', 80, 'rr', False) pybal.ipvs.LVSService('invalid-protocol', service, self.config) with self.assertRaises(ValueError): - service = ('tcp', '127.0.0.1', 80, 'invalid-scheduler') + service = ('tcp', '127.0.0.1', 80, 'invalid-scheduler', False) pybal.ipvs.LVSService('invalid-scheduler', service, self.config) + + with self.assertRaises(ValueError): + service = ('tcp', '127.0.0.1', 80, 'rr', True) + pybal.ipvs.LVSService('ops-with-tcp', service, self.config) self.config['bgp'] = 'true' pybal.ipvs.LVSService('http', self.service, self.config) @@ -142,6 +146,13 @@ self.assertEquals(lvs_service.ipvsManager.cmdList, ['-D -t 127.0.0.1:80', '-A -t 127.0.0.1:80 -s rr']) + def testCreateServiceOps(self): + """Test `LVSService.createService`.""" + service = ('udp', '127.0.0.1', 53, 'rr', True) + lvs_service = pybal.ipvs.LVSService('dns', service, self.config) + self.assertEquals(lvs_service.ipvsManager.cmdList, + ['-D -u 127.0.0.1:53', '-A -u 127.0.0.1:53 -s rr -o']) + def testAssignServers(self): """Test `LVSService.assignServers`.""" lvs_service = pybal.ipvs.LVSService('http', self.service, self.config) -- To view, visit https://gerrit.wikimedia.org/r/367903 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: If643710b99b2eadd1874c4e125f354e3773bed0d Gerrit-PatchSet: 2 Gerrit-Project: operations/debs/pybal Gerrit-Branch: master Gerrit-Owner: Ema <e...@wikimedia.org> Gerrit-Reviewer: BBlack <bbl...@wikimedia.org> Gerrit-Reviewer: Ema <e...@wikimedia.org> Gerrit-Reviewer: Giuseppe Lavagetto <glavage...@wikimedia.org> Gerrit-Reviewer: Volans <rcocci...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits