From a479de2e75c2db37fbac87475e38ef69026223c1 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 4 Nov 2008 15:55:27 +0000 Subject: [PATCH] dmeventd --- Makefile.in | 4 +- daemons/Makefile.in | 5 +- daemons/dmeventd/Makefile.in | 1 + dmeventd/Makefile.in | 22 -- dmeventd/mirror/.exported_symbols | 3 - dmeventd/mirror/Makefile.in | 35 ---- dmeventd/mirror/dmeventd_mirror.c | 289 -------------------------- dmeventd/snapshot/.exported_symbols | 3 - dmeventd/snapshot/Makefile.in | 35 ---- dmeventd/snapshot/dmeventd_snapshot.c | 213 ------------------- make.tmpl.in | 5 + 11 files changed, 11 insertions(+), 604 deletions(-) delete mode 100644 dmeventd/Makefile.in delete mode 100644 dmeventd/mirror/.exported_symbols delete mode 100644 dmeventd/mirror/Makefile.in delete mode 100644 dmeventd/mirror/dmeventd_mirror.c delete mode 100644 dmeventd/snapshot/.exported_symbols delete mode 100644 dmeventd/snapshot/Makefile.in delete mode 100644 dmeventd/snapshot/dmeventd_snapshot.c diff --git a/Makefile.in b/Makefile.in index 0740f77c4..5196e7bc1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -43,13 +43,13 @@ include make.tmpl libdm: include lib: libdm daemons: lib -tools: lib +tools: lib device-mapper po: tools daemons libdm.device-mapper: include.device-mapper daemons.device-mapper: libdm.device-mapper tools.device-mapper: libdm.device-mapper -device-mapper: tools.device-mapper daemons.device-mapper +device-mapper: tools.device-mapper daemons.device-mapper man.device-mapper ifeq ("@INTL@", "yes") lib.pofile: include.pofile diff --git a/daemons/Makefile.in b/daemons/Makefile.in index adc9cab08..766469e15 100644 --- a/daemons/Makefile.in +++ b/daemons/Makefile.in @@ -15,6 +15,8 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ +.PHONY: dmeventd clvmd + ifneq ("@CLVMD@", "none") SUBDIRS = clvmd endif @@ -23,7 +25,6 @@ ifeq ("@DMEVENTD@", "yes") SUBDIRS += dmeventd endif -device-mapper: dmeventd - include $(top_srcdir)/make.tmpl +device-mapper: dmeventd.device-mapper diff --git a/daemons/dmeventd/Makefile.in b/daemons/dmeventd/Makefile.in index 951670061..7a91d7784 100644 --- a/daemons/dmeventd/Makefile.in +++ b/daemons/dmeventd/Makefile.in @@ -37,6 +37,7 @@ endif include $(top_srcdir)/make.tmpl all: dmeventd +device-mapper: dmeventd LDFLAGS += -ldl -ldevmapper -lpthread CLDFLAGS += -ldl -ldevmapper -lpthread diff --git a/dmeventd/Makefile.in b/dmeventd/Makefile.in deleted file mode 100644 index 7fe9dc824..000000000 --- a/dmeventd/Makefile.in +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. -# Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. -# -# This file is part of LVM2. -# -# This copyrighted material is made available to anyone wishing to use, -# modify, copy, or redistribute it subject to the terms and conditions -# of the GNU General Public License v.2. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -SUBDIRS += mirror snapshot - -include $(top_srcdir)/make.tmpl - diff --git a/dmeventd/mirror/.exported_symbols b/dmeventd/mirror/.exported_symbols deleted file mode 100644 index b88c70501..000000000 --- a/dmeventd/mirror/.exported_symbols +++ /dev/null @@ -1,3 +0,0 @@ -process_event -register_device -unregister_device diff --git a/dmeventd/mirror/Makefile.in b/dmeventd/mirror/Makefile.in deleted file mode 100644 index 68c15c8df..000000000 --- a/dmeventd/mirror/Makefile.in +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. -# Copyright (C) 2004-2005, 2008 Red Hat, Inc. All rights reserved. -# -# This file is part of LVM2. -# -# This copyrighted material is made available to anyone wishing to use, -# modify, copy, or redistribute it subject to the terms and conditions -# of the GNU General Public License v.2. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -INCLUDES += -I${top_srcdir}/tools -CLDFLAGS += -L${top_srcdir}/tools -ldevmapper @LVM2CMD_LIB@ - -SOURCES = dmeventd_mirror.c - -ifeq ("@LIB_SUFFIX@","dylib") - LIB_SHARED = libdevmapper-event-lvm2mirror.dylib -else - LIB_SHARED = libdevmapper-event-lvm2mirror.so -endif - -include $(top_srcdir)/make.tmpl - -install: libdevmapper-event-lvm2mirror.$(LIB_SUFFIX) - $(INSTALL) -D $(OWNER) $(GROUP) -m 555 $(STRIP) $< \ - $(libdir)/$<.$(LIB_VERSION) - $(LN_S) -f $<.$(LIB_VERSION) $(libdir)/$< diff --git a/dmeventd/mirror/dmeventd_mirror.c b/dmeventd/mirror/dmeventd_mirror.c deleted file mode 100644 index fc610aea8..000000000 --- a/dmeventd/mirror/dmeventd_mirror.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (C) 2005 Red Hat, Inc. All rights reserved. - * - * This file is part of LVM2. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License v.2.1. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "lvm2cmd.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include /* FIXME Replace syslog with multilog */ -/* FIXME Missing openlog? */ - -#define ME_IGNORE 0 -#define ME_INSYNC 1 -#define ME_FAILURE 2 - -/* - * register_device() is called first and performs initialisation. - * Only one device may be registered or unregistered at a time. - */ -static pthread_mutex_t _register_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* - * Number of active registrations. - */ -static int _register_count = 0; - -static struct dm_pool *_mem_pool = NULL; -static void *_lvm_handle = NULL; - -/* - * Currently only one event can be processed at a time. - */ -static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER; - -static int _get_mirror_event(char *params) -{ - int i, r = ME_INSYNC; - char **args = NULL; - char *dev_status_str; - char *log_status_str; - char *sync_str; - char *p = NULL; - int log_argc, num_devs; - - /* - * dm core parms: 0 409600 mirror - * Mirror core parms: 2 253:4 253:5 400/400 - * New-style failure params: 1 AA - * New-style log params: 3 cluster 253:3 A - * or 3 disk 253:3 A - * or 1 core - */ - - /* number of devices */ - if (!dm_split_words(params, 1, 0, &p)) - goto out_parse; - - if (!(num_devs = atoi(p))) - goto out_parse; - p += strlen(p) + 1; - - /* devices names + "400/400" + "1 AA" + 1 or 3 log parms + NULL */ - args = dm_malloc((num_devs + 7) * sizeof(char *)); - if (!args || dm_split_words(p, num_devs + 7, 0, args) < num_devs + 5) - goto out_parse; - - dev_status_str = args[2 + num_devs]; - log_argc = atoi(args[3 + num_devs]); - log_status_str = args[3 + num_devs + log_argc]; - sync_str = args[num_devs]; - - /* Check for bad mirror devices */ - for (i = 0; i < num_devs; i++) - if (dev_status_str[i] == 'D') { - syslog(LOG_ERR, "Mirror device, %s, has failed.\n", args[i]); - r = ME_FAILURE; - } - - /* Check for bad disk log device */ - if (log_argc > 1 && log_status_str[0] == 'D') { - syslog(LOG_ERR, "Log device, %s, has failed.\n", - args[2 + num_devs + log_argc]); - r = ME_FAILURE; - } - - if (r == ME_FAILURE) - goto out; - - p = strstr(sync_str, "/"); - if (p) { - p[0] = '\0'; - if (strcmp(sync_str, p+1)) - r = ME_IGNORE; - p[0] = '/'; - } else - goto out_parse; - -out: - if (args) - dm_free(args); - return r; - -out_parse: - if (args) - dm_free(args); - syslog(LOG_ERR, "Unable to parse mirror status string."); - return ME_IGNORE; -} - -static void _temporary_log_fn(int level, const char *file __attribute((unused)), - int line __attribute((unused)), - const char *format) -{ - if (!strncmp(format, "WARNING: ", 9) && (level < 5)) - syslog(LOG_CRIT, "%s", format); - else - syslog(LOG_DEBUG, "%s", format); -} - -static int _remove_failed_devices(const char *device) -{ - int r; -#define CMD_SIZE 256 /* FIXME Use system restriction */ - char cmd_str[CMD_SIZE]; - char *vg = NULL, *lv = NULL, *layer = NULL; - - if (strlen(device) > 200) /* FIXME Use real restriction */ - return -ENAMETOOLONG; /* FIXME These return code distinctions are not used so remove them! */ - - if (!dm_split_lvm_name(_mem_pool, device, &vg, &lv, &layer)) { - syslog(LOG_ERR, "Unable to determine VG name from %s", - device); - return -ENOMEM; /* FIXME Replace with generic error return - reason for failure has already got logged */ - } - - /* FIXME Is any sanity-checking required on %s? */ - if (CMD_SIZE <= snprintf(cmd_str, CMD_SIZE, "vgreduce --config devices{ignore_suspended_devices=1} --removemissing --force %s", vg)) { - /* this error should be caught above, but doesn't hurt to check again */ - syslog(LOG_ERR, "Unable to form LVM command: Device name too long"); - dm_pool_empty(_mem_pool); /* FIXME: not safe with multiple threads */ - return -ENAMETOOLONG; /* FIXME Replace with generic error return - reason for failure has already got logged */ - } - - r = lvm2_run(_lvm_handle, cmd_str); - - dm_pool_empty(_mem_pool); /* FIXME: not safe with multiple threads */ - return (r == 1) ? 0 : -1; -} - -void process_event(struct dm_task *dmt, - enum dm_event_mask event __attribute((unused)), - void **unused __attribute((unused))) -{ - void *next = NULL; - uint64_t start, length; - char *target_type = NULL; - char *params; - const char *device = dm_task_get_name(dmt); - - if (pthread_mutex_trylock(&_event_mutex)) { - syslog(LOG_NOTICE, "Another thread is handling an event. Waiting..."); - pthread_mutex_lock(&_event_mutex); - } - do { - next = dm_get_next_target(dmt, next, &start, &length, - &target_type, ¶ms); - - if (!target_type) { - syslog(LOG_INFO, "%s mapping lost.\n", device); - continue; - } - - if (strcmp(target_type, "mirror")) { - syslog(LOG_INFO, "%s has unmirrored portion.\n", device); - continue; - } - - switch(_get_mirror_event(params)) { - case ME_INSYNC: - /* FIXME: all we really know is that this - _part_ of the device is in sync - Also, this is not an error - */ - syslog(LOG_NOTICE, "%s is now in-sync\n", device); - break; - case ME_FAILURE: - syslog(LOG_ERR, "Device failure in %s\n", device); - if (_remove_failed_devices(device)) - /* FIXME Why are all the error return codes unused? Get rid of them? */ - syslog(LOG_ERR, "Failed to remove faulty devices in %s\n", - device); - /* Should check before warning user that device is now linear - else - syslog(LOG_NOTICE, "%s is now a linear device.\n", - device); - */ - break; - case ME_IGNORE: - break; - default: - /* FIXME Provide value then! */ - syslog(LOG_INFO, "Unknown event received.\n"); - } - } while (next); - - pthread_mutex_unlock(&_event_mutex); -} - -int register_device(const char *device, - const char *uuid __attribute((unused)), - int major __attribute((unused)), - int minor __attribute((unused)), - void **unused __attribute((unused))) -{ - int r = 0; - - pthread_mutex_lock(&_register_mutex); - - syslog(LOG_INFO, "Monitoring mirror device %s for events\n", device); - - /* - * Need some space for allocations. 1024 should be more - * than enough for what we need (device mapper name splitting) - */ - if (!_mem_pool && !(_mem_pool = dm_pool_create("mirror_dso", 1024))) - goto out; - - if (!_lvm_handle) { - lvm2_log_fn(_temporary_log_fn); - if (!(_lvm_handle = lvm2_init())) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - goto out; - } - lvm2_log_level(_lvm_handle, LVM2_LOG_SUPPRESS); - /* FIXME Temporary: move to dmeventd core */ - lvm2_run(_lvm_handle, "_memlock_inc"); - } - - _register_count++; - r = 1; - -out: - pthread_mutex_unlock(&_register_mutex); - - return r; -} - -int unregister_device(const char *device, - const char *uuid __attribute((unused)), - int major __attribute((unused)), - int minor __attribute((unused)), - void **unused __attribute((unused))) -{ - pthread_mutex_lock(&_register_mutex); - - syslog(LOG_INFO, "No longer monitoring mirror device %s for events\n", - device); - - if (!--_register_count) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - lvm2_run(_lvm_handle, "_memlock_dec"); - lvm2_exit(_lvm_handle); - _lvm_handle = NULL; - } - - pthread_mutex_unlock(&_register_mutex); - - return 1; -} diff --git a/dmeventd/snapshot/.exported_symbols b/dmeventd/snapshot/.exported_symbols deleted file mode 100644 index b88c70501..000000000 --- a/dmeventd/snapshot/.exported_symbols +++ /dev/null @@ -1,3 +0,0 @@ -process_event -register_device -unregister_device diff --git a/dmeventd/snapshot/Makefile.in b/dmeventd/snapshot/Makefile.in deleted file mode 100644 index 48acbbd22..000000000 --- a/dmeventd/snapshot/Makefile.in +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. -# Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. -# -# This file is part of the LVM2. -# -# This copyrighted material is made available to anyone wishing to use, -# modify, copy, or redistribute it subject to the terms and conditions -# of the GNU General Public License v.2. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -INCLUDES += -I${top_srcdir}/tools -CLDFLAGS += -L${top_srcdir}/tools -ldevmapper @LVM2CMD_LIB@ - -SOURCES = dmeventd_snapshot.c - -ifeq ("@LIB_SUFFIX@","dylib") - LIB_SHARED = libdevmapper-event-lvm2snapshot.dylib -else - LIB_SHARED = libdevmapper-event-lvm2snapshot.so -endif - -include $(top_srcdir)/make.tmpl - -install: libdevmapper-event-lvm2snapshot.$(LIB_SUFFIX) - $(INSTALL) -D $(OWNER) $(GROUP) -m 555 $(STRIP) $< \ - $(libdir)/$<.$(LIB_VERSION) - $(LN_S) -f $<.$(LIB_VERSION) $(libdir)/$< diff --git a/dmeventd/snapshot/dmeventd_snapshot.c b/dmeventd/snapshot/dmeventd_snapshot.c deleted file mode 100644 index 3e250af27..000000000 --- a/dmeventd/snapshot/dmeventd_snapshot.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2007-2008 Red Hat, Inc. All rights reserved. - * - * This file is part of LVM2. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License v.2.1. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "libdevmapper.h" -#include "libdevmapper-event.h" -#include "lvm2cmd.h" -#include "lvm-string.h" - -#include -#include -#include -#include -#include -#include -#include - -#include /* FIXME Replace syslog with multilog */ -/* FIXME Missing openlog? */ - -/* First warning when snapshot is 80% full. */ -#define WARNING_THRESH 80 -/* Further warnings at 85%, 90% and 95% fullness. */ -#define WARNING_STEP 5 - -static pthread_mutex_t _register_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* - * Number of active registrations. - */ -static int _register_count = 0; - -static struct dm_pool *_mem_pool = NULL; -static void *_lvm_handle = NULL; - -struct snap_status { - int invalid; - int used; - int max; -}; - -/* - * Currently only one event can be processed at a time. - */ -static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER; - -static void _temporary_log_fn(int level, - const char *file __attribute((unused)), - int line __attribute((unused)), - const char *format) -{ - if (!strncmp(format, "WARNING: ", 9) && (level < 5)) - syslog(LOG_CRIT, "%s", format); - else - syslog(LOG_DEBUG, "%s", format); -} - -/* FIXME possibly reconcile this with target_percent when we gain - access to regular LVM library here. */ -static void _parse_snapshot_params(char *params, struct snap_status *stat) -{ - char *p; - /* - * xx/xx -- fractions used/max - * Invalid -- snapshot invalidated - * Unknown -- status unknown - */ - stat->used = stat->max = 0; - - if (!strncmp(params, "Invalid", 7)) { - stat->invalid = 1; - return; - } - - /* - * When we return without setting non-zero max, the parent is - * responsible for reporting errors. - */ - if (!strncmp(params, "Unknown", 7)) - return; - - if (!(p = strstr(params, "/"))) - return; - - *p = '\0'; - p++; - - stat->used = atoi(params); - stat->max = atoi(p); -} - -void process_event(struct dm_task *dmt, - enum dm_event_mask event __attribute((unused)), - void **private) -{ - void *next = NULL; - uint64_t start, length; - char *target_type = NULL; - char *params; - struct snap_status stat = { 0 }; - const char *device = dm_task_get_name(dmt); - int percent, *percent_warning = (int*)private; - - /* No longer monitoring, waiting for remove */ - if (!*percent_warning) - return; - - if (pthread_mutex_trylock(&_event_mutex)) { - syslog(LOG_NOTICE, "Another thread is handling an event. Waiting..."); - pthread_mutex_lock(&_event_mutex); - } - - dm_get_next_target(dmt, next, &start, &length, &target_type, ¶ms); - if (!target_type) - goto out; - - _parse_snapshot_params(params, &stat); - /* - * If the snapshot has been invalidated or we failed to parse - * the status string. Report the full status string to syslog. - */ - if (stat.invalid || !stat.max) { - syslog(LOG_ERR, "Snapshot %s changed state to: %s\n", device, params); - *percent_warning = 0; - goto out; - } - - percent = 100 * stat.used / stat.max; - if (percent >= *percent_warning) { - syslog(LOG_WARNING, "Snapshot %s is now %i%% full.\n", device, percent); - /* Print warning on the next multiple of WARNING_STEP. */ - *percent_warning = (percent / WARNING_STEP) * WARNING_STEP + WARNING_STEP; - } -out: - pthread_mutex_unlock(&_event_mutex); -} - -int register_device(const char *device, - const char *uuid __attribute((unused)), - int major __attribute((unused)), - int minor __attribute((unused)), - void **private) -{ - int r = 0; - int *percent_warning = (int*)private; - - pthread_mutex_lock(&_register_mutex); - - /* - * Need some space for allocations. 1024 should be more - * than enough for what we need (device mapper name splitting) - */ - if (!_mem_pool && !(_mem_pool = dm_pool_create("snapshot_dso", 1024))) - goto out; - - *percent_warning = WARNING_THRESH; /* Print warning if snapshot is full */ - - if (!_lvm_handle) { - lvm2_log_fn(_temporary_log_fn); - if (!(_lvm_handle = lvm2_init())) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - goto out; - } - lvm2_log_level(_lvm_handle, LVM2_LOG_SUPPRESS); - /* FIXME Temporary: move to dmeventd core */ - lvm2_run(_lvm_handle, "_memlock_inc"); - } - - syslog(LOG_INFO, "Monitoring snapshot %s\n", device); - - _register_count++; - r = 1; - -out: - pthread_mutex_unlock(&_register_mutex); - - return r; -} - -int unregister_device(const char *device, - const char *uuid __attribute((unused)), - int major __attribute((unused)), - int minor __attribute((unused)), - void **unused __attribute((unused))) -{ - pthread_mutex_lock(&_register_mutex); - - syslog(LOG_INFO, "No longer monitoring snapshot %s\n", - device); - - if (!--_register_count) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - lvm2_run(_lvm_handle, "_memlock_dec"); - lvm2_exit(_lvm_handle); - _lvm_handle = NULL; - } - - pthread_mutex_unlock(&_register_mutex); - - return 1; -} diff --git a/make.tmpl.in b/make.tmpl.in index 6245a0dac..64378ff66 100644 --- a/make.tmpl.in +++ b/make.tmpl.in @@ -86,6 +86,11 @@ endif LDFLAGS += -L$(top_srcdir)/libdm -L$(top_srcdir)/lib CLDFLAGS += -L$(top_srcdir)/libdm -L$(top_srcdir)/lib +ifeq ("@DMEVENTD@", "yes") + LDFLAGS += -L$(top_srcdir)/daemons/dmeventd + CLDFLAGS += -L$(top_srcdir)/daemons/dmeventd +endif + ifeq ("@DM_COMPAT@", "yes") DEFS += -DDM_COMPAT endif -- 2.43.5