[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[lvm-devel] LVM2 ./WHATS_NEW tools/polldaemon.c



CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	zkabelac 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();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]