diff options
author | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2012-10-19 10:26:09 -0400 |
---|---|---|
committer | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2012-10-19 10:28:18 -0400 |
commit | 4d1e8397e167163023df83f6ddddb34ccca4a824 (patch) | |
tree | c1e21824196720267c39412e1282f2d51fa02fbf /src/lib | |
parent | d2ef855948a34b9494b463ceb57dfd575b2df20f (diff) | |
download | bcfg2-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/lib')
-rw-r--r-- | src/lib/Bcfg2/Server/Plugins/Probes.py | 17 |
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()) |