From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14343 invoked by alias); 28 Feb 2012 10:06:56 -0000 Received: (qmail 14320 invoked by uid 9737); 28 Feb 2012 10:06:54 -0000 Date: Tue, 28 Feb 2012 10:06:00 -0000 Message-ID: <20120228100654.14318.qmail@sourceware.org> From: zkabelac@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2 ./WHATS_NEW tools/polldaemon.c Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2012-02/txt/msg00214.txt.bz2 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();