diff options
author | Mehdi Abaakouk <sileht@redhat.com> | 2016-04-29 10:30:13 +0200 |
---|---|---|
committer | Mehdi Abaakouk <sileht@redhat.com> | 2016-04-29 13:56:40 +0200 |
commit | fe66169a2e1f774617f60cc5902d84b110efafec (patch) | |
tree | 0c299cb5de894365e1d50c9274f3b753cebd7f07 | |
parent | af3cb7b5245a572763501502ba33b21a36a26492 (diff) | |
download | ceilometer-fe66169a2e1f774617f60cc5902d84b110efafec.tar.gz |
Fix concurrency issue with snmp pollsters
pysnmp oneliner.CommandGenerator() is not thread safe.
This change creates one oneliner.CommandGenerator() per query to fix
the issue.
Closes-bug: #1576577
Change-Id: Ibf32c068abed5d7198150bc206987f050a093cd8
(cherry picked from commit c898ecd921123eab61a8f88e61686ab4edf82b35)
-rw-r--r-- | ceilometer/hardware/inspector/snmp.py | 18 | ||||
-rw-r--r-- | ceilometer/tests/unit/hardware/inspector/test_snmp.py | 31 |
2 files changed, 19 insertions, 30 deletions
diff --git a/ceilometer/hardware/inspector/snmp.py b/ceilometer/hardware/inspector/snmp.py index a9d937be..0ea1d27e 100644 --- a/ceilometer/hardware/inspector/snmp.py +++ b/ceilometer/hardware/inspector/snmp.py @@ -128,10 +128,6 @@ class SNMPInspector(base.Inspector): extra.update('project_id': xy, 'user_id': zw) """ - def __init__(self): - super(SNMPInspector, self).__init__() - self._cmdGen = cmdgen.CommandGenerator() - def _query_oids(self, host, oids, cache, is_bulk): # send GetRequest or GetBulkRequest to get oid values and # populate the values into cache @@ -140,17 +136,13 @@ class SNMPInspector(base.Inspector): host.port or self._port)) oid_cache = cache.setdefault(self._CACHE_KEY_OID, {}) + cmd_runner = cmdgen.CommandGenerator() if is_bulk: - ret = self._cmdGen.bulkCmd(authData, - transport, - 0, 100, - *oids, - lookupValues=True) + ret = cmd_runner.bulkCmd(authData, transport, 0, 100, *oids, + lookupValues=True) else: - ret = self._cmdGen.getCmd(authData, - transport, - *oids, - lookupValues=True) + ret = cmd_runner.getCmd(authData, transport, *oids, + lookupValues=True) (error, data) = parse_snmp_return(ret, is_bulk) if error: raise SNMPException("An error occurred, oids %(oid)s, " diff --git a/ceilometer/tests/unit/hardware/inspector/test_snmp.py b/ceilometer/tests/unit/hardware/inspector/test_snmp.py index b7286232..8899ad6d 100644 --- a/ceilometer/tests/unit/hardware/inspector/test_snmp.py +++ b/ceilometer/tests/unit/hardware/inspector/test_snmp.py @@ -33,19 +33,19 @@ class FakeObjectName(object): return str(self.name) -def faux_getCmd_new(authData, transportTarget, *oids, **kwargs): - varBinds = [(FakeObjectName(oid), - int(oid.split('.')[-1])) for oid in oids] - return (None, None, 0, varBinds) +class FakeCommandGenerator(object): + def getCmd(self, authData, transportTarget, *oids, **kwargs): + varBinds = [(FakeObjectName(oid), + int(oid.split('.')[-1])) for oid in oids] + return (None, None, 0, varBinds) - -def faux_bulkCmd_new(authData, transportTarget, nonRepeaters, maxRepetitions, - *oids, **kwargs): - varBindTable = [ - [(FakeObjectName(oid + ".%d" % i), i) for i in range(1, 3)] - for oid in oids - ] - return (None, None, 0, varBindTable) + def bulkCmd(authData, transportTarget, nonRepeaters, maxRepetitions, + *oids, **kwargs): + varBindTable = [ + [(FakeObjectName("%s.%d" % (oid, i)), i) for i in range(1, 3)] + for oid in oids + ] + return (None, None, 0, varBindTable) class TestSNMPInspector(test_base.BaseTestCase): @@ -73,9 +73,8 @@ class TestSNMPInspector(test_base.BaseTestCase): self.inspector = snmp.SNMPInspector() self.host = netutils.urlsplit("snmp://localhost") self.useFixture(mockpatch.PatchObject( - self.inspector._cmdGen, 'getCmd', new=faux_getCmd_new)) - self.useFixture(mockpatch.PatchObject( - self.inspector._cmdGen, 'bulkCmd', new=faux_bulkCmd_new)) + snmp.cmdgen, 'CommandGenerator', + return_value=FakeCommandGenerator())) def test_snmp_error(self): def get_list(func, *args, **kwargs): @@ -133,8 +132,6 @@ class TestSNMPInspector(test_base.BaseTestCase): self.assertEqual(ret[0][0], ret[0][1]['meta']) def test_post_op_net(self): - self.useFixture(mockpatch.PatchObject( - self.inspector._cmdGen, 'bulkCmd', new=faux_bulkCmd_new)) cache = {} metadata = dict(name='lo', speed=0, |