dump: failure as open file handles are not closed
Dump manager adds watch using inotify_add_watch when
dump generation starts and closes the fd(file handle)
returned by the inotify_add_watch after dump generation
is completed.
Due to logic error, the fd is not closed, due to that
the application exhausts the fd count over time when a
lot of dumps are generated and it fails eventually.
The dump manager maintains stl::map of the path and watch
objects for newly created dumps so that when dump generation
is completed it can create D-Bus objects for the dumps.
When adding new entry to the stl::map dump directory is passed
and when clearing the entry the file path of dump file is pased
due to this entry from stl::map is not cleard and so is the
watch object.
Tested:
Post changes able to trigger 200+ dumps without any issue.
Verfied the open fd for the dump manager process before and after
dump genration and ensured that fd's are not incread.
before dump generation
root@p10bmc:~# ls -la /proc/4890/fd
dr-x------ 2 root root 0 Jan 20 10:03 .
dr-xr-xr-x 8 root root 0 Jan 20 10:03 ..
lr-x------ 1 root root 64 Jan 20 10:04 0 -> /dev/null
lrwx------ 1 root root 64 Jan 20 10:04 1 -> socket:[35868]
lrwx------ 1 root root 64 Jan 20 10:04 2 -> socket:[35868]
lrwx------ 1 root root 64 Jan 20 10:03 3 -> socket:[35873]
lrwx------ 1 root root 64 Jan 20 10:04 4 ->
anon_inode:[eventpoll]
lr-x------ 1 root root 64 Jan 20 10:04 5 -> anon_inode:inotify
lrwx------ 1 root root 64 Jan 20 10:04 6 ->
anon_inode:[timerfd]
after dump generation
root@p10bmc:~# ls -la /proc/4890/fd
dr-x------ 2 root root 0 Jan 20 10:03 .
dr-xr-xr-x 8 root root 0 Jan 20 10:03 ..
lr-x------ 1 root root 64 Jan 20 10:04 0 -> /dev/null
lrwx------ 1 root root 64 Jan 20 10:04 1 -> socket:[35868]
lrwx------ 1 root root 64 Jan 20 10:04 2 -> socket:[35868]
lrwx------ 1 root root 64 Jan 20 10:03 3 -> socket:[35873]
lrwx------ 1 root root 64 Jan 20 10:04 4 ->
anon_inode:[eventpoll]
lr-x------ 1 root root 64 Jan 20 10:04 5 -> anon_inode:inotify
lrwx------ 1 root root 64 Jan 20 10:04 6 ->
anon_inode:[timerfd]
lrwx------ 1 root root 64 Jan 20 10:05 7 -> socket:[35916]
Signed-off-by: Chirag Sharma <chirshar@in.ibm.com>
Change-Id: I67c704719e9991fdff478891f9dc72045fb0e9e1
diff --git a/dump_manager_bmc.cpp b/dump_manager_bmc.cpp
index d5dd987..94f8f40 100644
--- a/dump_manager_bmc.cpp
+++ b/dump_manager_bmc.cpp
@@ -210,9 +210,19 @@
// and associated inotify watch.
if (IN_CLOSE_WRITE == i.second)
{
- removeWatch(i.first);
+ if (!std::filesystem::is_directory(i.first))
+ {
+ // Don't require filename to be passed, as the path
+ // of dump directory is stored in the childWatchMap
+ removeWatch(i.first.parent_path());
- createEntry(i.first);
+ // dump file is written now create D-Bus entry
+ createEntry(i.first);
+ }
+ else
+ {
+ removeWatch(i.first);
+ }
}
// Start inotify watch on newly created directory.
else if ((IN_CREATE == i.second) &&