From 1e54d2c8a249bbb627bde27fda779cd0e48641cb Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 15 Mar 2010 12:51:44 +0100 Subject: don't read syslog if it didn't change --- lib/Plugins/KerneloopsScanner.cpp | 15 ++++++++++++--- lib/Plugins/KerneloopsScanner.h | 2 ++ src/Hooks/dumpoops.cpp | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/Plugins/KerneloopsScanner.cpp b/lib/Plugins/KerneloopsScanner.cpp index fdcc3e5..b3fe1ec 100644 --- a/lib/Plugins/KerneloopsScanner.cpp +++ b/lib/Plugins/KerneloopsScanner.cpp @@ -50,7 +50,7 @@ static int scan_dmesg(vector_string_t& oopsList) /* "dumpoops" tool uses these two functions too */ extern "C" { -int scan_syslog_file(vector_string_t& oopsList, const char *filename) +int scan_syslog_file(vector_string_t& oopsList, const char *filename, time_t *last_changed_p) { VERB1 log("Scanning syslog file '%s'", filename); @@ -59,7 +59,6 @@ int scan_syslog_file(vector_string_t& oopsList, const char *filename) int fd; int cnt_FoundOopses; ssize_t sz; - fd = open(filename, O_RDONLY); if (fd < 0) return 0; @@ -69,6 +68,15 @@ int scan_syslog_file(vector_string_t& oopsList, const char *filename) return 0; } + if (last_changed_p != NULL) { + if (*last_changed_p == statb.st_mtime) { + VERB1 log("Syslog file '%s' hasn't changed since last scan, skipping", filename); + close(fd); + return 0; + } + *last_changed_p = statb.st_mtime; + } + /* * In theory we have a race here, since someone could spew * to /var/log/messages before we read it in... we try to @@ -137,6 +145,7 @@ void save_oops_to_debug_dump(const vector_string_t& oopsList) CKerneloopsScanner::CKerneloopsScanner() { int cnt_FoundOopses; + m_syslog_last_change = 0; /* Scan dmesg, on first call only */ vector_string_t oopsList; @@ -155,7 +164,7 @@ void CKerneloopsScanner::Run(const char *pActionDir, const char *pArgs, int forc } vector_string_t oopsList; - int cnt_FoundOopses = scan_syslog_file(oopsList, syslog_file); + int cnt_FoundOopses = scan_syslog_file(oopsList, syslog_file, &m_syslog_last_change); if (cnt_FoundOopses > 0) { save_oops_to_debug_dump(oopsList); /* diff --git a/lib/Plugins/KerneloopsScanner.h b/lib/Plugins/KerneloopsScanner.h index da856e0..2bff134 100644 --- a/lib/Plugins/KerneloopsScanner.h +++ b/lib/Plugins/KerneloopsScanner.h @@ -33,6 +33,8 @@ class CKerneloopsScanner : public CAction { + private: + time_t m_syslog_last_change; public: CKerneloopsScanner(); virtual void Run(const char *pActionDir, const char *pArgs, int force); diff --git a/src/Hooks/dumpoops.cpp b/src/Hooks/dumpoops.cpp index ae92619..99ecf00 100644 --- a/src/Hooks/dumpoops.cpp +++ b/src/Hooks/dumpoops.cpp @@ -75,7 +75,7 @@ int main(int argc, char **argv) /* Load KerneloopsScanner plugin */ // const plugin_info_t *plugin_info; CPlugin* (*plugin_newf)(void); - int (*scan_syslog_file)(vector_string_t& oopsList, const char *filename); + int (*scan_syslog_file)(vector_string_t& oopsList, const char *filename, time_t *last_changed_p); void (*save_oops_to_debug_dump)(const vector_string_t& oopsList); void *handle; @@ -96,7 +96,7 @@ int main(int argc, char **argv) /* Use it: parse and dump the oops */ vector_string_t oopsList; - int cnt = scan_syslog_file(oopsList, argv[0]); + int cnt = scan_syslog_file(oopsList, argv[0], NULL); log("found oopses: %d", cnt); if (cnt > 0) { -- cgit