svn commit: r256469 - in projects/zfsd/head: cddl/sbin/zfsd etc/mtree lib lib/libdevctl share/mk
Alan Somers
asomers at FreeBSD.org
Mon Oct 14 22:58:50 UTC 2013
Author: asomers
Date: Mon Oct 14 22:58:48 2013
New Revision: 256469
URL: http://svnweb.freebsd.org/changeset/base/256469
Log:
Extract devctl event processing support out of zfsd and into a new library:
libdevctl.
etc/mtree/BSD.include.dist:
Add the /usr/include/devctl directory to the base system.
lib/Makefile:
lib/libdevctl/Makefile:
Build support for the new library.
lib/libdevctl/consumer.cc:
lib/libdevctl/consumer.h:
cddl/sbin/zfsd/zfsd.cc:
cddl/sbin/zfsd/zfsd.h:
New class, DevCtl::Consumer, from functionality extracted
from ZfsDaemon, which can connect to devd, parse an event
stream, and invoke event handlers.
lib/libdevctl/event.cc:
lib/libdevctl/event.h:
cddl/sbin/zfsd/dev_ctl_event.cc:
cddl/sbin/zfsd/dev_ctl_event.h:
Strip Zfsd specific event handling from Zfsd's event classes
to create DevCtl::Event, DevCtl::DevfsEvent, and
DevCtl::ZfsEvent.
lib/libdevctl/event_buffer.cc:
lib/libdevctl/event_buffer.h:
cddl/sbin/zfsd/zfsd.cc:
cddl/sbin/zfsd/zfsd.h:
DevCtl::EventBuffer: buffer for incoming devctl stream used
to parse/extract individual event strings.
lib/libdevctl/event_factory.cc:
lib/libdevctl/event_factory.h:
cddl/sbin/zfsd/zfsd.cc:
cddl/sbin/zfsd/zfsd.h:
DevCtl::EventFactory: Method map for converting event
strings to Devctl::Event objects.
lib/libdevctl/exception.cc:
lib/libdevctl/exception.h:
cddl/sbin/zfsd/zfsd_exception.cc:
cddl/sbin/zfsd/zfsd_exception.h:
DevCtl::Exception and DevCtl::ParseException, the exceptions
which are thrown by this library.
lib/libdevctl/guid.cc:
lib/libdevctl/guid.h:
cddl/sbin/zfsd/guid.cc:
cddl/sbin/zfsd/guid.h:
DevCtl::Guid: Helper routines for dealing with 64bit GUIDs
such as found in Zfs pools and vdevs.
lib/libdevctl/reader.cc:
lib/libdevctl/reader.h:
cddl/sbin/zfsd/zfsd.cc:
cddl/sbin/zfsd/zfsd.h:
DevCtl::Reader class hierarchy. Used to direct a Consumer
to an event stream (e.g. from devd or a local/saved file).
cddl/sbin/zfsd/zfsd_event.cc:
cddl/sbin/zfsd/zfsd_event.h:
Zfsd specialization of DevCtl::Event types.
cddl/sbin/zfsd/zfsd_exception.cc:
cddl/sbin/zfsd/zfsd_exception.h:
Zfsd specific exception types, now derived from
DevCtl::Excpetion.
cddl/sbin/zfsd/Makefile:
cddl/sbin/zfsd/callout.cc:
cddl/sbin/zfsd/callout.h:
cddl/sbin/zfsd/case_file.cc:
cddl/sbin/zfsd/case_file.h:
cddl/sbin/zfsd/vdev.cc:
cddl/sbin/zfsd/vdev.h:
cddl/sbin/zfsd/vdev_iterator.cc:
cddl/sbin/zfsd/vdev_iterator.h:
cddl/sbin/zfsd/zfsd.cc:
cddl/sbin/zfsd/zfsd.h:
cddl/sbin/zfsd/zfsd_event.cc:
cddl/sbin/zfsd/zfsd_event.h:
cddl/sbin/zfsd/zfsd_exception.cc:
cddl/sbin/zfsd/zfsd_exception.h:
cddl/sbin/zfsd/zfsd_main.cc:
cddl/sbin/zfsd/zpool_list.cc:
cddl/sbin/zfsd/zpool_list.h:
Miscelaneuous refactoring to support using libdevctl instead
of local implementation.
cddl/sbin/zfsd/Makefile:
cddl/sbin/zfsd/Makefile.common:
tools/regression/zfsd/Makefile:
Export common build information for zfsd and its unit tests
to a "Makefile.common".
Submitted by: gibbs
Approved by: ken (mentor)
Sponsored by: Spectra Logic Corporation
Added:
projects/zfsd/head/cddl/sbin/zfsd/Makefile.common
projects/zfsd/head/cddl/sbin/zfsd/zfsd_event.cc
projects/zfsd/head/cddl/sbin/zfsd/zfsd_event.h
projects/zfsd/head/lib/libdevctl/
projects/zfsd/head/lib/libdevctl/Makefile
projects/zfsd/head/lib/libdevctl/consumer.cc
projects/zfsd/head/lib/libdevctl/consumer.h
projects/zfsd/head/lib/libdevctl/event.cc
projects/zfsd/head/lib/libdevctl/event.h
projects/zfsd/head/lib/libdevctl/event_buffer.cc
projects/zfsd/head/lib/libdevctl/event_buffer.h
projects/zfsd/head/lib/libdevctl/event_factory.cc
projects/zfsd/head/lib/libdevctl/event_factory.h
projects/zfsd/head/lib/libdevctl/exception.cc
projects/zfsd/head/lib/libdevctl/exception.h
projects/zfsd/head/lib/libdevctl/guid.cc
projects/zfsd/head/lib/libdevctl/guid.h
projects/zfsd/head/lib/libdevctl/reader.cc
projects/zfsd/head/lib/libdevctl/reader.h
Deleted:
projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.cc
projects/zfsd/head/cddl/sbin/zfsd/dev_ctl_event.h
projects/zfsd/head/cddl/sbin/zfsd/guid.cc
projects/zfsd/head/cddl/sbin/zfsd/guid.h
Modified:
projects/zfsd/head/cddl/sbin/zfsd/Makefile
projects/zfsd/head/cddl/sbin/zfsd/callout.cc
projects/zfsd/head/cddl/sbin/zfsd/callout.h
projects/zfsd/head/cddl/sbin/zfsd/case_file.cc
projects/zfsd/head/cddl/sbin/zfsd/case_file.h
projects/zfsd/head/cddl/sbin/zfsd/vdev.cc
projects/zfsd/head/cddl/sbin/zfsd/vdev.h
projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.cc
projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.h
projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc
projects/zfsd/head/cddl/sbin/zfsd/zfsd.h
projects/zfsd/head/cddl/sbin/zfsd/zfsd_exception.cc
projects/zfsd/head/cddl/sbin/zfsd/zfsd_exception.h
projects/zfsd/head/cddl/sbin/zfsd/zfsd_main.cc
projects/zfsd/head/cddl/sbin/zfsd/zpool_list.cc
projects/zfsd/head/cddl/sbin/zfsd/zpool_list.h
projects/zfsd/head/etc/mtree/BSD.include.dist
projects/zfsd/head/lib/Makefile
projects/zfsd/head/share/mk/bsd.libnames.mk
Modified: projects/zfsd/head/cddl/sbin/zfsd/Makefile
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/Makefile Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/Makefile Mon Oct 14 22:58:48 2013 (r256469)
@@ -1,44 +1,7 @@
# $FreeBSD$
-PROG_CXX= zfsd
-SRCS= callout.cc \
- case_file.cc \
- dev_ctl_event.cc \
- guid.cc \
- vdev.cc \
- vdev_iterator.cc \
- zfsd.cc \
- zfsd_exception.cc \
- zpool_list.cc \
- zfsd_main.cc
-
-NO_MAN= YES
-
-WARNS?= 1
-
-INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzpool/common
-INCFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/include
-INCFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/lib/libumem
-INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris
-INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/head
-INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libuutil/common
-INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libumem/common
-INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzfs/common
-INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libnvpair
-INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/zfs
-INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common
-INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs
-INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/sys
+.include "Makefile.common"
-CFLAGS= -Wall -g -DNEED_SOLARIS_BOOLEAN ${INCFLAGS}
-
-DPADD= ${LIBZFS} ${LIBUTIL} ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} \
- ${LIBNVPAIR} ${LIBUUTIL}
-LDADD= -lzfs -lutil -lgeom -lbsdxml -lsbuf -lnvpair -luutil
-
-cscope:
- find ${.CURDIR} -type f -a \( -name "*.[ch]" -o -name "*.cc" \) \
- > ${.CURDIR}/cscope.files
- cd ${.CURDIR} && cscope -buq ${INCFLAGS}
+PROG_CXX= zfsd
.include <bsd.prog.mk>
Added: projects/zfsd/head/cddl/sbin/zfsd/Makefile.common
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/zfsd/head/cddl/sbin/zfsd/Makefile.common Mon Oct 14 22:58:48 2013 (r256469)
@@ -0,0 +1,43 @@
+# $FreeBSD$
+
+SRCS= callout.cc \
+ case_file.cc \
+ zfsd_event.cc \
+ vdev.cc \
+ vdev_iterator.cc \
+ zfsd.cc \
+ zfsd_exception.cc \
+ zpool_list.cc \
+ zfsd_main.cc
+
+NO_MAN= YES
+
+WARNS?= 3
+
+# Ignore warnings about Solaris specific pragmas.
+IGNORE_PRAGMA= YES
+
+INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzpool/common
+INCFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/include
+INCFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris/lib/libumem
+INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris
+INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/head
+INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libuutil/common
+INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libumem/common
+INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libzfs/common
+INCFLAGS+= -I${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libnvpair
+INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/common/zfs
+INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common
+INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/fs/zfs
+INCFLAGS+= -I${.CURDIR}/../../../sys/cddl/contrib/opensolaris/uts/common/sys
+
+CFLAGS= -g -DNEED_SOLARIS_BOOLEAN ${INCFLAGS}
+
+DPADD= ${LIBDEVCTL} ${LIBZFS} ${LIBUTIL} ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} \
+ ${LIBNVPAIR} ${LIBUUTIL}
+LDADD= -ldevctl -lzfs -lutil -lgeom -lbsdxml -lsbuf -lnvpair -luutil
+
+cscope:
+ find ${.CURDIR} -type f -a \( -name "*.[ch]" -o -name "*.cc" \) \
+ > ${.CURDIR}/cscope.files
+ cd ${.CURDIR} && cscope -buq ${INCFLAGS}
Modified: projects/zfsd/head/cddl/sbin/zfsd/callout.cc
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/callout.cc Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/callout.cc Mon Oct 14 22:58:48 2013 (r256469)
@@ -37,10 +37,23 @@
* timer services built on top of the POSIX interval timer.
*/
+#include <sys/time.h>
+
#include <signal.h>
#include <syslog.h>
+#include <list>
+#include <map>
+#include <string>
+
+#include <devctl/guid.h>
+#include <devctl/event.h>
+#include <devctl/event_factory.h>
+#include <devctl/consumer.h>
+#include <devctl/exception.h>
+
#include "callout.h"
+#include "vdev_iterator.h"
#include "zfsd.h"
#include "zfsd_exception.h"
Modified: projects/zfsd/head/cddl/sbin/zfsd/callout.h
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/callout.h Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/callout.h Mon Oct 14 22:58:48 2013 (r256469)
@@ -34,15 +34,17 @@
* \file callout.h
*
* \brief Interface for timer based callback services.
+ *
+ * Header requirements:
+ *
+ * #include <sys/time.h>
+ *
+ * #include <list>
*/
#ifndef _CALLOUT_H_
#define _CALLOUT_H_
-#include <sys/time.h>
-
-#include <list>
-
/**
* \brief Type of the function callback from a Callout.
*/
Modified: projects/zfsd/head/cddl/sbin/zfsd/case_file.cc
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/case_file.cc Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/case_file.cc Mon Oct 14 22:58:48 2013 (r256469)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2011 Spectra Logic Corporation
+ * Copyright (c) 2011, 2012, 2013 Spectra Logic Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,6 +38,11 @@
* across reboots. For now, this is just a log of soft errors which we
* accumulate in order to mark a device as degraded.
*/
+#include <sys/cdefs.h>
+#include <sys/time.h>
+
+#include <sys/fs/zfs.h>
+
#include <dirent.h>
#include <iomanip>
#include <fstream>
@@ -46,12 +51,31 @@
#include <syslog.h>
#include <unistd.h>
+#include <libzfs.h>
+
+#include <list>
+#include <map>
+#include <string>
+
+#include <devctl/guid.h>
+#include <devctl/event.h>
+#include <devctl/event_buffer.h>
+#include <devctl/event_factory.h>
+#include <devctl/exception.h>
+#include <devctl/consumer.h>
+#include <devctl/reader.h>
+
+#include "callout.h"
+#include "zfsd_event.h"
#include "case_file.h"
#include "vdev.h"
+#include "vdev_iterator.h"
#include "zfsd.h"
#include "zfsd_exception.h"
#include "zpool_list.h"
+__FBSDID("$FreeBSD$");
+
/*============================ Namespace Control =============================*/
using std::auto_ptr;
using std::hex;
@@ -60,26 +84,43 @@ using std::stringstream;
using std::setfill;
using std::setw;
+using DevCtl::Event;
+using DevCtl::EventBuffer;
+using DevCtl::EventFactory;
+using DevCtl::EventList;
+using DevCtl::Guid;
+using DevCtl::IstreamReader;
+using DevCtl::ParseException;
+
/*-------------------------- File-scoped classes ----------------------------*/
/**
* \brief Functor that operators on STL collections of CaseFiles
+ *
* Selectively calls ReEvaluate on the casefile, based on its pool GUID.
*/
class CaseFileReEvaluator : public std::unary_function<CaseFile, bool>
{
public:
- CaseFileReEvaluator(Guid guid, const ZfsEvent &event) :
- m_poolGUID(guid), m_event(event) {};
- void operator() (CaseFile *casefile) {
- if (m_poolGUID == casefile->PoolGUID())
- casefile->ReEvaluate(m_event);
- }
+ CaseFileReEvaluator(Guid guid, const ZfsEvent &event);
+
+ void operator() (CaseFile *casefile);
+
private:
Guid m_poolGUID;
- const ZfsEvent &m_event;
+ const ZfsEvent &m_event;
};
+CaseFileReEvaluator::CaseFileReEvaluator(Guid guid, const ZfsEvent &event)
+ : m_poolGUID(guid), m_event(event)
+{
+}
+void
+CaseFileReEvaluator::operator() (CaseFile *casefile)
+{
+ if (m_poolGUID == casefile->PoolGUID())
+ casefile->ReEvaluate(m_event);
+}
/*--------------------------------- CaseFile ---------------------------------*/
//- CaseFile Static Data -------------------------------------------------------
@@ -88,7 +129,6 @@ const string CaseFile::s_caseFilePath =
const timeval CaseFile::s_removeGracePeriod = { 60 /*sec*/, 0 /*usec*/};
//- CaseFile Static Public Methods ---------------------------------------------
-
CaseFile *
CaseFile::Find(Guid poolGUID, Guid vdevGUID)
{
@@ -509,7 +549,7 @@ CaseFile::ActivateSpare() {
}
void
-CaseFile::RegisterCallout(const DevCtlEvent &event)
+CaseFile::RegisterCallout(const Event &event)
{
timeval now, countdown, elapsed, timestamp, zero, remaining;
@@ -594,13 +634,13 @@ CaseFile::Log()
zpool_state_to_name(VdevState(), VDEV_AUX_NONE));
if (m_tentativeEvents.size() != 0) {
syslog(LOG_INFO, "\t=== Tentative Events ===\n");
- for (DevCtlEventList::iterator event(m_tentativeEvents.begin());
+ for (EventList::iterator event(m_tentativeEvents.begin());
event != m_tentativeEvents.end(); event++)
(*event)->Log(LOG_INFO);
}
if (m_events.size() != 0) {
syslog(LOG_INFO, "\t=== Events ===\n");
- for (DevCtlEventList::iterator event(m_events.begin());
+ for (EventList::iterator event(m_events.begin());
event != m_events.end(); event++)
(*event)->Log(LOG_INFO);
}
@@ -738,7 +778,7 @@ CaseFile::~CaseFile()
void
CaseFile::PurgeEvents()
{
- for (DevCtlEventList::iterator event(m_events.begin());
+ for (EventList::iterator event(m_events.begin());
event != m_events.end(); event++)
delete *event;
@@ -748,7 +788,7 @@ CaseFile::PurgeEvents()
void
CaseFile::PurgeTentativeEvents()
{
- for (DevCtlEventList::iterator event(m_tentativeEvents.begin());
+ for (EventList::iterator event(m_tentativeEvents.begin());
event != m_tentativeEvents.end(); event++)
delete *event;
@@ -756,12 +796,12 @@ CaseFile::PurgeTentativeEvents()
}
void
-CaseFile::SerializeEvList(const DevCtlEventList events, int fd,
+CaseFile::SerializeEvList(const EventList events, int fd,
const char* prefix) const
{
if (events.empty())
return;
- for (DevCtlEventList::const_iterator curEvent = events.begin();
+ for (EventList::const_iterator curEvent = events.begin();
curEvent != events.end(); curEvent++) {
const string &eventString((*curEvent)->GetEventString());
@@ -816,7 +856,7 @@ CaseFile::DeSerialize(ifstream &caseStre
* call ExtractEvent
* continue
*/
- DevCtlEventList* destEvents;
+ EventList* destEvents;
string tentFlag("tentative ");
string line;
std::stringbuf lineBuf;
@@ -832,8 +872,9 @@ CaseFile::DeSerialize(ifstream &caseStre
}
fakeDevdSocket << line;
fakeDevdSocket << '\n';
+ const EventFactory &factory(ZfsDaemon::Get().GetFactory());
while (eventBuffer.ExtractEvent(evString)) {
- DevCtlEvent *event(DevCtlEvent::CreateEvent(evString));
+ Event *event(Event::CreateEvent(factory, evString));
if (event != NULL) {
destEvents->push_back(event);
RegisterCallout(*event);
@@ -993,23 +1034,29 @@ CaseFile::Replace(const char* vdev_type,
}
/* Does the argument event refer to a checksum error? */
-static bool IsChecksumEvent(const DevCtlEvent* const event){
+static bool
+IsChecksumEvent(const Event* const event)
+{
return ("ereport.fs.zfs.checksum" == event->Value("type"));
}
/* Does the argument event refer to an IO error? */
-static bool IsIOEvent(const DevCtlEvent* const event){
+static bool
+IsIOEvent(const Event* const event)
+{
return ("ereport.fs.zfs.io" == event->Value("type"));
}
bool
-CaseFile::ShouldDegrade() const {
+CaseFile::ShouldDegrade() const
+{
return (std::count_if(m_events.begin(), m_events.end(),
IsChecksumEvent) > ZFS_DEGRADE_IO_COUNT);
}
bool
-CaseFile::ShouldFault() const {
+CaseFile::ShouldFault() const
+{
return (std::count_if(m_events.begin(), m_events.end(),
IsIOEvent) > ZFS_DEGRADE_IO_COUNT);
}
Modified: projects/zfsd/head/cddl/sbin/zfsd/case_file.h
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/case_file.h Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/case_file.h Mon Oct 14 22:58:48 2013 (r256469)
@@ -37,18 +37,17 @@
*
* CaseFile objects aggregate vdev faults that may require ZFSD action
* in order to maintain the health of a ZFS pool.
+ *
+ * Header requirements:
+ *
+ * #include <list>
+ *
+ * #include "callout.h"
+ * #include "zfsd_event.h"
*/
#ifndef _CASE_FILE_H_
#define _CASE_FILE_H_
-#include <list>
-#include <utility>
-
-#include <sys/fs/zfs.h>
-
-#include "callout.h"
-#include "dev_ctl_event.h"
-
/*=========================== Forward Declarations ===========================*/
class CaseFile;
class Vdev;
@@ -95,7 +94,7 @@ public:
* \return If found, a pointer to a valid CaseFile object.
* Otherwise NULL.
*/
- static CaseFile *Find(Guid poolGUID, Guid vdevGUID);
+ static CaseFile *Find(DevCtl::Guid poolGUID, DevCtl::Guid vdevGUID);
/**
* \brief Find a CaseFile object by a vdev's current/last known
@@ -114,7 +113,8 @@ public:
* \param poolGUID Only reevaluate cases for this pool
* \param event Try to consume this event with the casefile
*/
- static void ReEvaluateByGuid(Guid poolGUID, const ZfsEvent &event);
+ static void ReEvaluateByGuid(DevCtl::Guid poolGUID,
+ const ZfsEvent &event);
/**
* \brief Create or return an existing active CaseFile for the
@@ -145,8 +145,8 @@ public:
*/
static void PurgeAll();
- Guid PoolGUID() const;
- Guid VdevGUID() const;
+ DevCtl::Guid PoolGUID() const;
+ DevCtl::Guid VdevGUID() const;
vdev_state VdevState() const;
const string &PoolGUIDString() const;
const string &VdevGUIDString() const;
@@ -171,6 +171,7 @@ public:
/**
* \brief Update this CaseFile in light of the provided ZfsEvent.
+ *
* Must be virtual so it can be overridden in the unit tests
*
* \param event The ZfsEvent to evaluate.
@@ -182,7 +183,7 @@ public:
/**
* \brief Register an itimer callout for the given event, if necessary
*/
- virtual void RegisterCallout(const DevCtlEvent &event);
+ virtual void RegisterCallout(const DevCtl::Event &event);
/**
* \brief Close a case if it is no longer relevant.
@@ -289,7 +290,7 @@ protected:
* \param prefix If not NULL, this prefix will be prepended to
* every event in the file.
*/
- void SerializeEvList(const DevCtlEventList events, int fd,
+ void SerializeEvList(const DevCtl::EventList events, int fd,
const char* prefix=NULL) const;
/**
@@ -327,7 +328,6 @@ protected:
* \param path The file system path to the new vdev
*
* \return true iff the replacement was successful
- *
*/
bool Replace(const char* vdev_type, const char* path);
@@ -351,35 +351,35 @@ protected:
* \brief A list of soft error events counted against the health of
* a vdev.
*/
- DevCtlEventList m_events;
+ DevCtl::EventList m_events;
/**
* \brief A list of soft error events waiting for a grace period
* expiration before being counted against the health of
* a vdev.
*/
- DevCtlEventList m_tentativeEvents;
+ DevCtl::EventList m_tentativeEvents;
- Guid m_poolGUID;
- Guid m_vdevGUID;
- vdev_state m_vdevState;
- string m_poolGUIDString;
- string m_vdevGUIDString;
- string m_vdevPhysPath;
+ DevCtl::Guid m_poolGUID;
+ DevCtl::Guid m_vdevGUID;
+ vdev_state m_vdevState;
+ string m_poolGUIDString;
+ string m_vdevGUIDString;
+ string m_vdevPhysPath;
/**
* \brief Callout activated when a grace period
*/
- Callout m_tentativeTimer;
+ Callout m_tentativeTimer;
};
-inline Guid
+inline DevCtl::Guid
CaseFile::PoolGUID() const
{
return (m_poolGUID);
}
-inline Guid
+inline DevCtl::Guid
CaseFile::VdevGUID() const
{
return (m_vdevGUID);
Modified: projects/zfsd/head/cddl/sbin/zfsd/vdev.cc
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/vdev.cc Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/vdev.cc Mon Oct 14 22:58:48 2013 (r256469)
@@ -38,15 +38,30 @@
* Implementation of the Vdev class.
*/
#include <sys/cdefs.h>
+#include <sys/fs/zfs.h>
+#include <libzfs.h>
+
+#include <list>
+#include <map>
+#include <string>
#include <sstream>
+#include <devctl/guid.h>
+#include <devctl/event.h>
+#include <devctl/event_buffer.h>
+#include <devctl/event_factory.h>
+#include <devctl/exception.h>
+#include <devctl/consumer.h>
+
#include "vdev.h"
+#include "vdev_iterator.h"
#include "zfsd.h"
#include "zfsd_exception.h"
__FBSDID("$FreeBSD$");
/*============================ Namespace Control =============================*/
+using std::string;
using std::stringstream;
/*=========================== Class Implementations ==========================*/
Modified: projects/zfsd/head/cddl/sbin/zfsd/vdev.h
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/vdev.h Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/vdev.h Mon Oct 14 22:58:48 2013 (r256469)
@@ -36,18 +36,25 @@
* \file vdev.h
*
* Definition of the Vdev class.
+ *
+ * Header requirements:
+ *
+ * #include <string>
+ *
+ * #include <devctl/guid.h>
*/
#ifndef _VDEV_H_
#define _VDEV_H_
-#include <ostream>
-#include <string>
-
-#include <sys/fs/zfs.h>
-#include <libzfs.h>
+/*=========================== Forward Declarations ===========================*/
+struct zpool_handle;
+typedef struct zpool_handle zpool_handle_t;
-#include "guid.h"
+struct nvlist;
+typedef struct nvlist nvlist_t;
+/*============================= Class Definitions ============================*/
+/*----------------------------------- Vdev -----------------------------------*/
/**
* \brief Wrapper class for a vdev's name/value configuration list
* simplifying access to commonly used vdev attributes.
@@ -96,30 +103,30 @@ public:
*/
Vdev(nvlist_t *vdevConfig);
- virtual Guid GUID() const;
- virtual Guid PoolGUID() const;
- virtual vdev_state State() const;
- std::string Path() const;
- virtual std::string PhysicalPath() const;
- std::string GUIDString() const;
- nvlist_t *PoolConfig() const;
- nvlist_t *Config() const;
+ virtual DevCtl::Guid GUID() const;
+ virtual DevCtl::Guid PoolGUID() const;
+ virtual vdev_state State() const;
+ std::string Path() const;
+ virtual std::string PhysicalPath() const;
+ std::string GUIDString() const;
+ nvlist_t *PoolConfig() const;
+ nvlist_t *Config() const;
private:
- Guid m_poolGUID;
- Guid m_vdevGUID;
- nvlist_t *m_poolConfig;
- nvlist_t *m_config;
+ DevCtl::Guid m_poolGUID;
+ DevCtl::Guid m_vdevGUID;
+ nvlist_t *m_poolConfig;
+ nvlist_t *m_config;
};
//- Vdev Inline Public Methods ------------------------------------------------
-inline Guid
+inline DevCtl::Guid
Vdev::PoolGUID() const
{
return (m_poolGUID);
}
-inline Guid
+inline DevCtl::Guid
Vdev::GUID() const
{
return (m_vdevGUID);
Modified: projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.cc
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.cc Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.cc Mon Oct 14 22:58:48 2013 (r256469)
@@ -35,17 +35,27 @@
*
* Implementation of the VdevIterator class.
*/
+#include <sys/cdefs.h>
+#include <sys/fs/zfs.h>
+
#include <stdint.h>
#include <syslog.h>
-#include <sys/fs/zfs.h>
#include <libzfs.h>
+#include <list>
+#include <string>
+
+#include <devctl/exception.h>
+#include <devctl/guid.h>
+
#include "vdev.h"
#include "vdev_iterator.h"
-#include "zfsd.h"
#include "zfsd_exception.h"
+/*============================ Namespace Control =============================*/
+using DevCtl::Guid;
+
/*=========================== Class Implementations ==========================*/
/*------------------------------- VdevIterator -------------------------------*/
VdevIterator::VdevIterator(zpool_handle_t *pool)
Modified: projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.h
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.h Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/vdev_iterator.h Mon Oct 14 22:58:48 2013 (r256469)
@@ -34,16 +34,21 @@
* \file vdev_iterator.h
*
* VdevIterator class definition.
+ *
+ * Header requirements:
+ *
+ * #include <list>
*/
#ifndef _VDEV_ITERATOR_H_
#define _VDEV_ITERATOR_H_
-#include <list>
+/*=========================== Forward Declarations ===========================*/
+struct zpool_handle;
+typedef struct zpool_handle zpool_handle_t;
-#include <sys/fs/zfs.h>
-#include <libzfs.h>
+struct nvlist;
+typedef struct nvlist nvlist_t;
-/*=========================== Forward Declarations ===========================*/
class Vdev;
/*============================= Class Definitions ============================*/
@@ -97,7 +102,7 @@ public:
* Upon return, the VdevIterator's cursor points to the vdev just
* past the returned vdev or end() if no matching vdev is found.
*/
- nvlist_t *Find(Guid vdevGUID);
+ nvlist_t *Find(DevCtl::Guid vdevGUID);
/**
* \brief Perform the specified operation on each leaf member of
Modified: projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc
==============================================================================
--- projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc Mon Oct 14 22:42:13 2013 (r256468)
+++ projects/zfsd/head/cddl/sbin/zfsd/zfsd.cc Mon Oct 14 22:58:48 2013 (r256469)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2011 Spectra Logic Corporation
+ * Copyright (c) 2011, 2012, 2013 Spectra Logic Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -42,242 +42,77 @@
*/
#include <sys/cdefs.h>
-#include <sys/disk.h>
-#include <sys/filio.h>
#include <sys/param.h>
-#include <sys/poll.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-
-#include <cstdio>
-#include <cstdlib>
-#include <csignal>
+#include <sys/fs/zfs.h>
+
#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <iostream>
+#include <libgeom.h>
#include <libutil.h>
-#include <sstream>
-#include <string>
+#include <poll.h>
#include <syslog.h>
-#include <sys/fs/zfs.h>
#include <libzfs.h>
-#include <libgeom.h>
+
+#include <list>
+#include <map>
+#include <string>
+
+#include <devctl/guid.h>
+#include <devctl/event.h>
+#include <devctl/event_buffer.h>
+#include <devctl/event_factory.h>
+#include <devctl/exception.h>
+#include <devctl/consumer.h>
+#include <devctl/reader.h>
#include "callout.h"
+#include "zfsd_event.h"
+#include "case_file.h"
#include "vdev.h"
+#include "vdev_iterator.h"
#include "zfsd.h"
#include "zfsd_exception.h"
#include "zpool_list.h"
__FBSDID("$FreeBSD$");
+/*================================== Macros ==================================*/
+#define NUM_ELEMENTS(x) (sizeof(x) / sizeof(*x))
+
/*============================ Namespace Control =============================*/
-using std::string;
-using std::stringstream;
-using std::cerr;
-using std::cout;
-using std::endl;
+using DevCtl::Event;
+using DevCtl::EventBuffer;
+using DevCtl::EventFactory;
+using DevCtl::EventList;
+using DevCtl::Guid;
+using DevCtl::NVPairMap;
/*================================ Global Data ===============================*/
-const char g_devdSock[] = "/var/run/devd.pipe";
int g_debug = 0;
libzfs_handle_t *g_zfsHandle;
-/*-------------------------------- FDReader -------------------------------*/
-//- FDReader Public Methods ----------------------------------------------------
-size_t
-FDReader::in_avail() const
-{
- int bytes;
- if (ioctl(m_fd, FIONREAD, &bytes)) {
- syslog(LOG_ERR, "ioctl FIONREAD: %s", strerror(errno));
- return (0);
- }
- return (bytes);
-}
-
-
-/*-------------------------------- IstreamReader ---------------------------*/
-//- IstreamReader Public Methods ----------------------------------------------
-ssize_t
-IstreamReader::read(char* buf, size_t count)
-{
- m_stream->read(buf, count);
- if (m_stream->fail())
- return (-1);
- return (m_stream->gcount());
-}
-
-
-/*-------------------------------- EventBuffer -------------------------------*/
-//- EventBuffer Static Data ----------------------------------------------------
-/**
- * NOTIFY, NOMATCH, ATTACH, DETACH. See DevCtlEvent::Type.
- */
-const char EventBuffer::s_eventStartTokens[] = "!?+-";
-
-/**
- * Events are terminated by a newline.
- */
-const char EventBuffer::s_eventEndTokens[] = "\n";
-
-/**
- * Key=Value pairs are terminated by whitespace.
- */
-const char EventBuffer::s_keyPairSepTokens[] = " \t\n";
-
-//- EventBuffer Public Methods -------------------------------------------------
-EventBuffer::EventBuffer(Reader& reader)
- : m_reader(reader),
- m_validLen(0),
- m_parsedLen(0),
- m_nextEventOffset(0),
- m_synchronized(true)
-{
-}
-
-bool
-EventBuffer::ExtractEvent(string &eventString)
-{
- stringstream tsField;
- timeval now;
-
- gettimeofday(&now, NULL);
- tsField << " timestamp=" << now.tv_sec;
-
- while (UnParsed() > 0 || Fill()) {
-
- /*
- * If the valid data in the buffer isn't enough to hold
- * a full event, try reading more.
- */
- if (NextEventMaxLen() < MIN_EVENT_SIZE) {
- m_parsedLen += UnParsed();
- continue;
- }
-
- char *nextEvent(m_buf + m_nextEventOffset);
- bool truncated(true);
- size_t eventLen(strcspn(nextEvent, s_eventEndTokens));
-
- if (!m_synchronized) {
- /* Discard data until an end token is read. */
- if (nextEvent[eventLen] != '\0')
- m_synchronized = true;
- m_nextEventOffset += eventLen;
- m_parsedLen = m_nextEventOffset;
- continue;
- } else if (nextEvent[eventLen] == '\0') {
-
- m_parsedLen += eventLen;
- if (m_parsedLen < MAX_EVENT_SIZE) {
- /*
- * Ran out of buffer before hitting
- * a full event. Fill() and try again.
- */
- continue;
- }
- syslog(LOG_WARNING, "Overran event buffer\n\tm_nextEventOffset"
- "=%zd\n\tm_parsedLen=%zd\n\tm_validLen=%zd",
- m_nextEventOffset, m_parsedLen, m_validLen);
- } else {
- /*
- * Include the normal terminator in the extracted
- * event data.
- */
- eventLen += 1;
- truncated = false;
- }
-
- m_nextEventOffset += eventLen;
- m_parsedLen = m_nextEventOffset;
- eventString.assign(nextEvent, eventLen);
-
- if (truncated) {
- size_t fieldEnd;
-
- /* Break cleanly at the end of a key<=>value pair. */
- fieldEnd = eventString.find_last_of(s_keyPairSepTokens);
- if (fieldEnd != string::npos)
- eventString.erase(fieldEnd);
- eventString += '\n';
-
- m_synchronized = false;
- syslog(LOG_WARNING,
- "Truncated %zd characters from event.",
- eventLen - fieldEnd);
- }
-
- /*
- * Add a timestamp as the final field of the event if it is
- * not already present.
- */
- if (eventString.find("timestamp=") == string::npos) {
- size_t eventEnd(eventString.find_last_not_of('\n') + 1);
-
- eventString.insert(eventEnd, tsField.str());
- }
-
- return (true);
- }
- return (false);
-}
-
-//- EventBuffer Private Methods ------------------------------------------------
-bool
-EventBuffer::Fill()
-{
- size_t avail;
- ssize_t consumed(0);
-
- /* Compact the buffer. */
- if (m_nextEventOffset != 0) {
- memmove(m_buf, m_buf + m_nextEventOffset,
- m_validLen - m_nextEventOffset);
- m_validLen -= m_nextEventOffset;
- m_parsedLen -= m_nextEventOffset;
- m_nextEventOffset = 0;
- }
-
- /* Fill any empty space. */
- avail = m_reader.in_avail();
- if (avail) {
- size_t want;
-
- want = std::min(avail, MAX_READ_SIZE - m_validLen);
- consumed = m_reader.read(m_buf + m_validLen, want);
- if (consumed == -1) {
- if (errno == EINTR)
- return (false);
- else
- err(1, "EventBuffer::Fill(): Read failed");
- }
- }
-
- m_validLen += consumed;
- /* Guarantee our buffer is always NUL terminated. */
- m_buf[m_validLen] = '\0';
-
- return (consumed > 0);
-}
-
/*--------------------------------- ZfsDaemon --------------------------------*/
//- ZfsDaemon Static Private Data ----------------------------------------------
-bool ZfsDaemon::s_logCaseFiles;
-bool ZfsDaemon::s_terminateEventLoop;
-char ZfsDaemon::s_pidFilePath[] = "/var/run/zfsd.pid";
-pidfh *ZfsDaemon::s_pidFH;
-FDReader* ZfsDaemon::s_reader;
-int ZfsDaemon::s_devdSockFD = -1;
-int ZfsDaemon::s_signalPipeFD[2];
-bool ZfsDaemon::s_systemRescanRequested(false);
-bool ZfsDaemon::s_consumingEvents(false);
-DevCtlEventList ZfsDaemon::s_unconsumedEvents;
+ZfsDaemon *ZfsDaemon::s_theZfsDaemon;
+bool ZfsDaemon::s_logCaseFiles;
+bool ZfsDaemon::s_terminateEventLoop;
+char ZfsDaemon::s_pidFilePath[] = "/var/run/zfsd.pid";
+pidfh *ZfsDaemon::s_pidFH;
+int ZfsDaemon::s_signalPipeFD[2];
+bool ZfsDaemon::s_systemRescanRequested(false);
+EventFactory::Record ZfsDaemon::s_registryEntries[] =
+{
+ { Event::NOTIFY, "DEVFS", &DevfsEvent::DevfsEventBuilder },
+ { Event::NOTIFY, "ZFS", &ZfsEvent::ZfsEventBuilder }
+};
//- ZfsDaemon Static Public Methods --------------------------------------------
+ZfsDaemon &
+ZfsDaemon::Get()
+{
+ return (*s_theZfsDaemon);
+}
+
void
ZfsDaemon::WakeEventLoop()
{
@@ -294,36 +129,40 @@ ZfsDaemon::RequestSystemRescan()
void
ZfsDaemon::Run()
{
- Init();
+ ZfsDaemon daemon;
while (s_terminateEventLoop == false) {
try {
- DisconnectFromDevd();
+ daemon.DisconnectFromDevd();
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list