summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMehdi Abaakouk <sileht@redhat.com>2016-04-29 10:30:13 +0200
committerMehdi Abaakouk <sileht@redhat.com>2016-04-29 13:56:40 +0200
commitfe66169a2e1f774617f60cc5902d84b110efafec (patch)
tree0c299cb5de894365e1d50c9274f3b753cebd7f07
parentaf3cb7b5245a572763501502ba33b21a36a26492 (diff)
downloadceilometer-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.py18
-rw-r--r--ceilometer/tests/unit/hardware/inspector/test_snmp.py31
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,