summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-10-19 10:26:09 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-10-19 10:28:18 -0400
commit4d1e8397e167163023df83f6ddddb34ccca4a824 (patch)
treec1e21824196720267c39412e1282f2d51fa02fbf /src
parentd2ef855948a34b9494b463ceb57dfd575b2df20f (diff)
downloadbcfg2-4d1e8397e167163023df83f6ddddb34ccca4a824.tar.gz
bcfg2-4d1e8397e167163023df83f6ddddb34ccca4a824.tar.bz2
bcfg2-4d1e8397e167163023df83f6ddddb34ccca4a824.zip
copy probe data when writing probed.xml to avoid race condition
Diffstat (limited to 'src')
-rw-r--r--src/lib/Bcfg2/Server/Plugins/Probes.py17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/lib/Bcfg2/Server/Plugins/Probes.py b/src/lib/Bcfg2/Server/Plugins/Probes.py
index c2a928e0f..45d3c2763 100644
--- a/src/lib/Bcfg2/Server/Plugins/Probes.py
+++ b/src/lib/Bcfg2/Server/Plugins/Probes.py
@@ -197,9 +197,14 @@ class Probes(Bcfg2.Server.Plugin.Probing,
""" Write received probe data to probed.xml """
top = lxml.etree.Element("Probed")
for client, probed in sorted(self.probedata.items()):
- ctag = lxml.etree.SubElement(top, 'Client', name=client,
- timestamp=str(int(probed.timestamp)))
- for probe in sorted(probed):
+ # make a copy of probe data for this client in case it
+ # submits probe data while we're trying to write
+ # probed.xml
+ probedata = copy.copy(probed)
+ ctag = \
+ lxml.etree.SubElement(top, 'Client', name=client,
+ timestamp=str(int(probedata.timestamp)))
+ for probe in sorted(probedata):
lxml.etree.SubElement(ctag, 'Probe', name=probe,
value=str(self.probedata[client][probe]))
for group in sorted(self.cgroups[client]):
@@ -313,8 +318,8 @@ class Probes(Bcfg2.Server.Plugin.Probing,
if data.text == None:
self.logger.info("Got null response to probe %s from %s" %
(data.get('name'), client.hostname))
- self.probedata[client.hostname].update({data.get('name'):
- ProbeData('')})
+ self.probedata[client.hostname][data.get('name')] = \
+ ProbeData('')
return
dlines = data.text.split('\n')
self.logger.debug("%s:probe:%s:%s" %
@@ -327,7 +332,7 @@ class Probes(Bcfg2.Server.Plugin.Probing,
self.cgroups[client.hostname].append(newgroup)
dlines.remove(line)
dobj = ProbeData("\n".join(dlines))
- self.probedata[client.hostname].update({data.get('name'): dobj})
+ self.probedata[client.hostname][data.get('name')] = dobj
def get_additional_groups(self, meta):
return self.cgroups.get(meta.hostname, list())