From owner-svn-src-projects@FreeBSD.ORG Fri Oct 11 22:54:03 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C4E9D2E1; Fri, 11 Oct 2013 22:54:03 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B273A29B0; Fri, 11 Oct 2013 22:54:03 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r9BMs3qa070427; Fri, 11 Oct 2013 22:54:03 GMT (envelope-from asomers@svn.freebsd.org) Received: (from asomers@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r9BMs34K070422; Fri, 11 Oct 2013 22:54:03 GMT (envelope-from asomers@svn.freebsd.org) Message-Id: <201310112254.r9BMs34K070422@svn.freebsd.org> From: Alan Somers Date: Fri, 11 Oct 2013 22:54:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256358 - projects/zfsd/head/cddl/sbin/zfsd X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Oct 2013 22:54:03 -0000 Author: asomers Date: Fri Oct 11 22:54:02 2013 New Revision: 256358 URL: http://svnweb.freebsd.org/changeset/base/256358 Log: Miscellaneous bug fixes in zfsd. cddl/sbin/zfsd/zfsd.cc Properly handle POLLHUP, POLLER, and EINTR on the devd socket. Ignore POLLHUP led to zfsd spinning the cpu. cddl/sbin/zfsd/case_file.cc: cddl/sbin/zfsd/dev_ctl_event.cc: Use a constant format string so that syslog() cannot be confused by random '%' characters in the string we are logging. Fixes a warning with Clang. cddl/sbin/zfsd/zfsd.cc: In EventBuffer::ExtractEvent(), add a missing argument to one syslog() invocation and specify that an integer is a size_t in another. Fixes warnings in Clang. Submitted by: asomers, gibbs Approved by: ken (mentor) Sponsored by: Spectra Logic Corporation Modified: projects/zfsd/head/cddl/sbin/zfsd/case_file.cc projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc Modified: projects/zfsd/head/cddl/sbin/zfsd/case_file.cc ============================================================================== --- projects/zfsd/head/cddl/sbin/zfsd/case_file.cc Fri Oct 11 22:44:15 2013 (r256357) +++ projects/zfsd/head/cddl/sbin/zfsd/case_file.cc Fri Oct 11 22:54:02 2013 (r256358) @@ -167,7 +167,7 @@ CaseFile::RefreshVdevState() stringstream msg; msg << "CaseFile::RefreshVdevState: Unknown pool for Vdev("; msg << m_poolGUID << "," << m_vdevGUID << ")."; - syslog(LOG_INFO, msg.str().c_str()); + syslog(LOG_INFO, "%s", msg.str().c_str()); return (false); } Modified: projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc ============================================================================== --- projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc Fri Oct 11 22:44:15 2013 (r256357) +++ projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc Fri Oct 11 22:54:02 2013 (r256358) @@ -642,7 +642,7 @@ ZfsEvent::Process() const stringstream msg; msg << "No replicas available for pool " << poolGUID; msg << ", ignoring"; - syslog(LOG_INFO, msg.str().c_str()); + syslog(LOG_INFO, "%s", msg.str().c_str()); return; } @@ -658,7 +658,7 @@ ZfsEvent::Process() const msg << "ZfsEvent::Process: Event for unknown pool "; msg << poolGUID << " "; msg << (queued ? "queued" : "dropped"); - syslog(priority, msg.str().c_str()); + syslog(priority, "%s", msg.str().c_str()); return; } @@ -670,7 +670,7 @@ ZfsEvent::Process() const msg << "ZfsEvent::Process: Event for unknown vdev "; msg << VdevGUID() << " "; msg << (queued ? "queued" : "dropped"); - syslog(priority, msg.str().c_str()); + syslog(priority, "%s", msg.str().c_str()); return; } Modified: projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc ============================================================================== --- projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc Fri Oct 11 22:44:15 2013 (r256357) +++ projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc Fri Oct 11 22:54:02 2013 (r256358) @@ -181,7 +181,8 @@ EventBuffer::ExtractEvent(string &eventS continue; } syslog(LOG_WARNING, - "Event exceeds event size limit of %d bytes."); + "Event exceeds event size limit of %d bytes.", + MAX_EVENT_SIZE); } else { /* * Include the normal terminator in the extracted @@ -206,7 +207,7 @@ EventBuffer::ExtractEvent(string &eventS m_synchronized = false; syslog(LOG_WARNING, - "Truncated %d characters from event.", + "Truncated %zd characters from event.", eventLen - fieldEnd); } @@ -512,10 +513,31 @@ ZfsDaemon::EventsPending() struct pollfd fds[1]; int result; - fds->fd = s_devdSockFD; - fds->events = POLLIN; - fds->revents = 0; - result = poll(fds, NUM_ELEMENTS(fds), /*timeout*/0); + do { + fds->fd = s_devdSockFD; + fds->events = POLLIN; + fds->revents = 0; + result = poll(fds, NUM_ELEMENTS(fds), /*timeout*/0); + } while ( (result == -1) && (errno == EINTR) ) ; + + if (result == -1) { + /* Unexpected error; try reconnecting the socket */ + throw ZfsdException( + "ZfsdDaemon::EventsPending(): Unexpected error from poll()"); + } + + if ((fds->revents & POLLHUP) != 0) { + /* The other end hung up the socket. Throw an exception + * so ZfsDaemon will try to reconnect + */ + throw ZfsdException("ZfsDaemon::EventsPending(): Got POLLHUP"); + } + + if ((fds->revents & POLLERR) != 0) { + /* Try reconnecting. */ + throw ZfsdException( + "ZfsdDaemon:EventsPending(): Got POLLERR. Reconnecting."); + } return ((fds->revents & POLLIN) != 0); }