Module: check_mk
Branch: master
Commit: 44c021fec61ae278a802e7ac97cdb178ed3437eb
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=44c021fec61ae2…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Mon Jan 2 16:48:22 2012 +0100
Linux agent: wrap freeipmi with lock
---
.bugs/311 | 8 ++++++--
ChangeLog | 1 +
agents/check_mk_agent.linux | 19 ++++++++++++-------
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/.bugs/311 b/.bugs/311
index 901faf3..1ee43c0 100644
--- a/.bugs/311
+++ b/.bugs/311
@@ -1,10 +1,10 @@
Title: IPMI cache initialization race condition
Component: checks
+State: done
+Class: nastiness
Benefit: 1
-State: open
Cost: 4
Date: 2011-07-18 15:42:34
-Class: nastiness
Targetversion: 1.2.0
there is a very nasty issue with the IPMI agent code - if we kill the initial build of
the SDR
@@ -18,3 +18,7 @@ Very ugly issue, maybe xinetd can disable multiple runs of the same
service (but
mean staleness issues will stop the agent forever)
Or we implement a caching feature similar to that of <<<ipmitool>>>.
+
+2012-01-02 16:47:41: changed state open -> done
+I've implemented a lock with a timeout of 60 secs now. Still
+need some host with freeipmi in order to test this.
diff --git a/ChangeLog b/ChangeLog
index 7805173..209d092 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -19,6 +19,7 @@
in the range-setting will not affect the graph anymore.
* if/if64/lnx_if: pad port numbers with zeros in order to sort correctly.
This can be turned off with if_inventory_pad_portnumbers = False.
+ * Linux agent: wrap freeipmi with lock in order to avoid cache corruption
1.1.13i2:
Core, Setup, etc.:
diff --git a/agents/check_mk_agent.linux b/agents/check_mk_agent.linux
index 9d2a9ce..8c8541d 100755
--- a/agents/check_mk_agent.linux
+++ b/agents/check_mk_agent.linux
@@ -249,13 +249,18 @@ then
else
IPMI_FORMAT=""
fi
- for class in Temperature 'Power Unit' Fan
- do
- $WAITMAX ipmi-sensors $IPMI_FORMAT --sdr-cache-directory /var/cache -g
"$class" | sed -e 's/ /_/g' -e 's/:_\?/ /g' -e 's@
\([^(]*\)_(\([^)]*\))@ \2_\1@'
- # In case of a timeout immediately leave loop.
- if [ $? = 255 ] ; then break ; fi
- WAITMAX="waitmax 3"
- done
+ # Aquire lock with flock in order to avoid multiple runs of ipmi-sensors
+ # in case of parallel or overlapping calls of the agent.
+ (
+ flock -n 200 --wait 60
+ for class in Temperature 'Power Unit' Fan
+ do
+ $WAITMAX ipmi-sensors $IPMI_FORMAT --sdr-cache-directory /var/cache -g
"$class" | sed -e 's/ /_/g' -e 's/:_\?/ /g' -e 's@
\([^(]*\)_(\([^)]*\))@ \2_\1@'
+ # In case of a timeout immediately leave loop.
+ if [ $? = 255 ] ; then break ; fi
+ WAITMAX="waitmax 3"
+ done
+ ) 200 >> $"$sdrcache"
fi
# State of LSI MegaRAID controller via MegaCli. You can download that tool from: