[lvm-devel] LVM2 ./WHATS_NEW tools/polldaemon.c
zkabelac at sourceware.org
zkabelac at sourceware.org
Tue Feb 28 10:06:54 UTC 2012
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: zkabelac at sourceware.org 2012-02-28 10:06:54
Modified files:
. : WHATS_NEW
tools : polldaemon.c
Log message:
Duplicate standard in/out descriptors for daemon
Addressing somewhat tricky bug here.
Since stdin,stdout,stderr were closed it's been occasionally possible to
see some unexpected messages to be flowing into a clvmd and generating some
randomly sized allocation of many megabytes. Since the message was not
being generated by standard send_message() construction, after some more
testing it apperead to be a debug log message - thus something has flown
to local socket opened on strandard out descriptor.
To fix the issue - use standard file descriptor duplication code for daemons.
For making easier debugging of polling daemon - developer might want to recompile
without modifition of standard file descriptors.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.2320&r2=1.2321
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/polldaemon.c.diff?cvsroot=lvm2&r1=1.46&r2=1.47
--- LVM2/WHATS_NEW 2012/02/28 09:58:19 1.2320
+++ LVM2/WHATS_NEW 2012/02/28 10:06:53 1.2321
@@ -1,5 +1,6 @@
Version 2.02.94 -
====================================
+ For polling daemon reopen stdin,stdout,stderr to /dev/null.
Limit the max size of processed clvmd message to ~8KB.
Do not send uninitilised bytes in cluster error reply messages.
Use unsigned type for bitmask instead of enum type for lvm properties.
--- LVM2/tools/polldaemon.c 2011/09/06 18:49:32 1.46
+++ LVM2/tools/polldaemon.c 2012/02/28 10:06:54 1.47
@@ -32,6 +32,8 @@
*/
static int _become_daemon(struct cmd_context *cmd)
{
+ static const char devnull[] = "/dev/null";
+ int null_fd;
pid_t pid;
struct sigaction act = {
{_sigchld_handler},
@@ -57,12 +59,27 @@
if (setsid() == -1)
log_error("Background process failed to setsid: %s",
strerror(errno));
- init_verbose(VERBOSE_BASE_LEVEL);
- close(STDIN_FILENO);
- close(STDOUT_FILENO);
- close(STDERR_FILENO);
+ /* For poll debugging it's best to disable for compilation */
+#if 1
+ if ((null_fd = open(devnull, O_RDWR)) == -1) {
+ log_sys_error("open", devnull);
+ _exit(ECMD_FAILED);
+ }
+
+ if (dup2(null_fd, STDIN_FILENO) || /* reopen stdin */
+ dup2(null_fd, STDOUT_FILENO) || /* reopen stdout */
+ dup2(null_fd, STDERR_FILENO)) { /* reopen stderr */
+ log_sys_error("dup2", "redirect");
+ (void) close(null_fd);
+ _exit(ECMD_FAILED);
+ }
+ if (null_fd > STDERR_FILENO)
+ (void) close(null_fd);
+
+ init_verbose(VERBOSE_BASE_LEVEL);
+#endif
strncpy(*cmd->argv, "(lvm2)", strlen(*cmd->argv));
reset_locking();
More information about the lvm-devel
mailing list