RFC: Project geom-events
Lev Serebryakov
lev at FreeBSD.org
Tue Oct 4 18:05:20 UTC 2011
Hello, Freebsd-geom.
I've just committed (a branch with) the project, I worked on for
last month (and imagined for last two years).
It is GEOM Events subsystem.
What is it?
We now have pretty impressive set of GEOM modules, which covers many
areas: infrastructure support (like geom_part), encryption (like
geom_eli) and, what is interesting me most, RAID transformations like
geom_stripe, geom_mirror and geom_raid.
One thing is missed from software RAIDs is spare drives and state
monitoring (yes, I know, that geom_raid supports spare drivers for
metadata formats which supports them, but it not universal solution).
My long-standing dream was to write special daemon for this, but,
when I got some time for this project, and started to design, I
understood, that we have such daemon: devd(8).
So, here it is. GEOM Events.
Project consists of several parts (all are ready and commited to
project branch!):
(1) Simple kernel API, which wraps up devctl_notify() call to unify
different GEOM events. Now 4 events are specified:
(a) DISCONNECT -- when GEOM loses (orphans or throw away due to
errors) underlying provider.
(b) DESTROY -- when GEOM destorys it provider.
(c) SYNCSTART -- when GEOM starts to synchronizing volume
(synchronizing new mirror component or recalculate RAID3/RAID5
checksum)
(d) SYNCSTOP -- wwen GEOM finishes synchronization.
Each event has arguments like class of GEOM, geom itself, provider
in question and some others. For details, please, see geom-events(8)
man page :)
(2) Simple change in devd(8) config to process events from GEOM
system and forward them to geom-events(8) scirpt.
(3) geom-events(8) script which processes these events. It is
fully-configurable and could perform these actions in reaction
to events:
(a) Replace failed providers with spare ones in case of
DISCONNECT events.
(b) Log events to syslog(8) with logger(1)
(c) Notify administrator (typically -- root) with mail(1).
(4) geom-events needs one small helper binary program: ggetmode(8).
ggetmode(8) takes one argument -- provider name -- and prints
its access mode, like r1w1e1 or r0w0e0. geom-events(8) script
determines is spare provider avail or not, comparing it access
mode with "r0w0e0" string.
(5) Changes in all geom classes to post these events.
I've covered all "actual" base classes with some exceptions:
(a) geom_mbr and other old-stlye partition classes is untouched, as
they are obsolete now.
(b) geom_vinum is not covered. It is too complex for me, sorry :(
(c) geom_raid is covered, but changes are not trivial ones. It
needs review from Alexander Motin. Commit message describes
what and why was changed.
I've wrote extensive documentation for all new components --
especially for geom-events(8) script, which is main source of
information about this project now.
I've tested all classes in virtual machine, with spare drives and
all stuff. Everything work perfectly.
**I really appreciate your comments, and I want to see this project
committed to CURRENT and MFCed to 9-STABLE in (near) future.**
Project sources are in "projects/geom-events" SVN branch. All but
last commits are organized by component, so you could review only
changes in your part of tree.
http://svnweb.freebsd.org/base/projects/geom-events/
This branch contains fix from kern/160562, to make raid3 spare
drives work.
Patch against CURRENT is attached.
Thank you.
--
// Black Lion AKA Lev Serebryakov <lev at FreeBSD.org>
More information about the freebsd-geom
mailing list