a91fbc1088
Now mdcheck service can't be run successfully. We need to put mdcheck in to the right place (/usr/share/mdadm/mdcheck) and it needs to remove the dependency of mdadm_env.sh which is fixed in patch 76c224c6c. And there is a history problem. It needed KillMode=none before, so it removed the upstream patch 52c67fcdd. Now this problem has been fixed, so we can do the backport more easilly now. We don't need to remove the upstream patch here again. Resolves: bz#2175540 Signed-off-by: Xiao Ni <xni@redhat.com>
314 lines
11 KiB
Diff
314 lines
11 KiB
Diff
From 50232a6ec4a5c46c608181d72d0c633831a03134 Mon Sep 17 00:00:00 2001
|
|
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
Date: Thu, 2 Feb 2023 12:27:00 +0100
|
|
Subject: [PATCH 088/120] Mdmonitor: Pass events to alert() using enums instead
|
|
of strings
|
|
|
|
Add events enum, and mapping_t struct, that maps them to strings, so
|
|
that enums are passed around instead of strings.
|
|
|
|
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
Acked-by: Coly Li <colyli@suse.de>
|
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
|
---
|
|
Monitor.c | 136 +++++++++++++++++++++++++++++++++---------------------
|
|
1 file changed, 83 insertions(+), 53 deletions(-)
|
|
|
|
diff --git a/Monitor.c b/Monitor.c
|
|
index 9ef4dab8..029e9efd 100644
|
|
--- a/Monitor.c
|
|
+++ b/Monitor.c
|
|
@@ -32,6 +32,8 @@
|
|
#include <libudev.h>
|
|
#endif
|
|
|
|
+#define EVENT_NAME_MAX 32
|
|
+
|
|
struct state {
|
|
char devname[MD_NAME_MAX + sizeof("/dev/md/")]; /* length of "/dev/md/" + device name + terminating byte*/
|
|
char devnm[MD_NAME_MAX]; /* to sync with mdstat info */
|
|
@@ -65,10 +67,43 @@ struct alert_info {
|
|
int dosyslog;
|
|
int test;
|
|
} info;
|
|
+
|
|
+enum event {
|
|
+ EVENT_SPARE_ACTIVE = 0,
|
|
+ EVENT_NEW_ARRAY,
|
|
+ EVENT_MOVE_SPARE,
|
|
+ EVENT_TEST_MESSAGE,
|
|
+ EVENT_REBUILD_STARTED,
|
|
+ EVENT_REBUILD,
|
|
+ EVENT_REBUILD_FINISHED,
|
|
+ EVENT_SPARES_MISSING,
|
|
+ EVENT_DEVICE_DISAPPEARED,
|
|
+ EVENT_FAIL,
|
|
+ EVENT_FAIL_SPARE,
|
|
+ EVENT_DEGRADED_ARRAY,
|
|
+ EVENT_UNKNOWN
|
|
+};
|
|
+
|
|
+mapping_t events_map[] = {
|
|
+ {"SpareActive", EVENT_SPARE_ACTIVE},
|
|
+ {"NewArray", EVENT_NEW_ARRAY},
|
|
+ {"MoveSpare", EVENT_MOVE_SPARE},
|
|
+ {"TestMessage", EVENT_TEST_MESSAGE},
|
|
+ {"RebuildStarted", EVENT_REBUILD_STARTED},
|
|
+ {"Rebuild", EVENT_REBUILD},
|
|
+ {"RebuildFinished", EVENT_REBUILD_FINISHED},
|
|
+ {"SparesMissing", EVENT_SPARES_MISSING},
|
|
+ {"DeviceDisappeared", EVENT_DEVICE_DISAPPEARED},
|
|
+ {"Fail", EVENT_FAIL},
|
|
+ {"FailSpare", EVENT_FAIL_SPARE},
|
|
+ {"DegradedArray", EVENT_DEGRADED_ARRAY},
|
|
+ {NULL, EVENT_UNKNOWN}
|
|
+};
|
|
+
|
|
static int make_daemon(char *pidfile);
|
|
static int check_one_sharer(int scan);
|
|
static void write_autorebuild_pid(void);
|
|
-static void alert(const char *event, const char *dev, const char *disc);
|
|
+static void alert(const enum event event_enum, const unsigned int progress, const char *dev, const char *disc);
|
|
static int check_array(struct state *st, struct mdstat_ent *mdstat, int increments, char *prefer);
|
|
static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist);
|
|
static void try_spare_migration(struct state *statelist);
|
|
@@ -415,7 +450,7 @@ static void write_autorebuild_pid()
|
|
}
|
|
}
|
|
|
|
-static void execute_alert_cmd(const char *event, const char *dev, const char *disc)
|
|
+static void execute_alert_cmd(const char *event_name, const char *dev, const char *disc)
|
|
{
|
|
int pid = fork();
|
|
|
|
@@ -427,12 +462,12 @@ static void execute_alert_cmd(const char *event, const char *dev, const char *di
|
|
pr_err("Cannot fork to execute alert command");
|
|
break;
|
|
case 0:
|
|
- execl(info.alert_cmd, info.alert_cmd, event, dev, disc, NULL);
|
|
+ execl(info.alert_cmd, info.alert_cmd, event_name, dev, disc, NULL);
|
|
exit(2);
|
|
}
|
|
}
|
|
|
|
-static void send_event_email(const char *event, const char *dev, const char *disc)
|
|
+static void send_event_email(const char *event_name, const char *dev, const char *disc)
|
|
{
|
|
FILE *mp, *mdstat;
|
|
char buf[BUFSIZ];
|
|
@@ -450,9 +485,9 @@ static void send_event_email(const char *event, const char *dev, const char *dis
|
|
else
|
|
fprintf(mp, "From: %s monitoring <root>\n", Name);
|
|
fprintf(mp, "To: %s\n", info.mailaddr);
|
|
- fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, info.hostname);
|
|
+ fprintf(mp, "Subject: %s event on %s:%s\n\n", event_name, dev, info.hostname);
|
|
fprintf(mp, "This is an automatically generated mail message. \n");
|
|
- fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev);
|
|
+ fprintf(mp, "A %s event had been detected on md device %s.\n\n", event_name, dev);
|
|
|
|
if (disc && disc[0] != ' ')
|
|
fprintf(mp,
|
|
@@ -474,20 +509,20 @@ static void send_event_email(const char *event, const char *dev, const char *dis
|
|
pclose(mp);
|
|
}
|
|
|
|
-static void log_event_to_syslog(const char *event, const char *dev, const char *disc)
|
|
+static void log_event_to_syslog(const enum event event_enum, const char *event_name, const char *dev, const char *disc)
|
|
{
|
|
int priority;
|
|
/* Log at a different severity depending on the event.
|
|
*
|
|
* These are the critical events: */
|
|
- if (strncmp(event, "Fail", 4) == 0 ||
|
|
- strncmp(event, "Degrade", 7) == 0 ||
|
|
- strncmp(event, "DeviceDisappeared", 17) == 0)
|
|
+ if (event_enum == EVENT_FAIL ||
|
|
+ event_enum == EVENT_DEGRADED_ARRAY ||
|
|
+ event_enum == EVENT_DEVICE_DISAPPEARED)
|
|
priority = LOG_CRIT;
|
|
/* Good to know about, but are not failures: */
|
|
- else if (strncmp(event, "Rebuild", 7) == 0 ||
|
|
- strncmp(event, "MoveSpare", 9) == 0 ||
|
|
- strncmp(event, "Spares", 6) != 0)
|
|
+ else if (event_enum == EVENT_REBUILD ||
|
|
+ event_enum == EVENT_MOVE_SPARE ||
|
|
+ event_enum == EVENT_SPARES_MISSING)
|
|
priority = LOG_WARNING;
|
|
/* Everything else: */
|
|
else
|
|
@@ -495,33 +530,37 @@ static void log_event_to_syslog(const char *event, const char *dev, const char *
|
|
|
|
if (disc && disc[0] != ' ')
|
|
syslog(priority,
|
|
- "%s event detected on md device %s, component device %s", event, dev, disc);
|
|
+ "%s event detected on md device %s, component device %s",
|
|
+ event_name, dev, disc);
|
|
else if (disc)
|
|
- syslog(priority, "%s event detected on md device %s: %s", event, dev, disc);
|
|
+ syslog(priority, "%s event detected on md device %s: %s", event_name, dev, disc);
|
|
else
|
|
- syslog(priority, "%s event detected on md device %s", event, dev);
|
|
+ syslog(priority, "%s event detected on md device %s", event_name, dev);
|
|
}
|
|
|
|
-static void alert(const char *event, const char *dev, const char *disc)
|
|
+static void alert(const enum event event_enum, const unsigned int progress, const char *dev, const char *disc)
|
|
{
|
|
- if (!info.alert_cmd && !info.mailaddr && !info.dosyslog) {
|
|
- time_t now = time(0);
|
|
+ char event_name[EVENT_NAME_MAX];
|
|
|
|
- printf("%1.15s: %s on %s %s\n", ctime(&now) + 4,
|
|
- event, dev, disc?disc:"unknown device");
|
|
+ if (event_enum == EVENT_REBUILD) {
|
|
+ snprintf(event_name, sizeof(event_name), "%s%02d",
|
|
+ map_num_s(events_map, EVENT_REBUILD), progress);
|
|
+ } else {
|
|
+ snprintf(event_name, sizeof(event_name), "%s", map_num_s(events_map, event_enum));
|
|
}
|
|
+
|
|
if (info.alert_cmd)
|
|
- execute_alert_cmd(event, dev, disc);
|
|
+ execute_alert_cmd(event_name, dev, disc);
|
|
|
|
- if (info.mailaddr && (strncmp(event, "Fail", 4) == 0 ||
|
|
- strncmp(event, "Test", 4) == 0 ||
|
|
- strncmp(event, "Spares", 6) == 0 ||
|
|
- strncmp(event, "Degrade", 7) == 0)) {
|
|
- send_event_email(event, dev, disc);
|
|
+ if (info.mailaddr && (event_enum == EVENT_FAIL ||
|
|
+ event_enum == EVENT_TEST_MESSAGE ||
|
|
+ event_enum == EVENT_SPARES_MISSING ||
|
|
+ event_enum == EVENT_DEGRADED_ARRAY)) {
|
|
+ send_event_email(event_name, dev, disc);
|
|
}
|
|
|
|
if (info.dosyslog)
|
|
- log_event_to_syslog(event, dev, disc);
|
|
+ log_event_to_syslog(event_enum, event_name, dev, disc);
|
|
}
|
|
|
|
static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
@@ -546,7 +585,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
unsigned long redundancy_only_flags = 0;
|
|
|
|
if (info.test)
|
|
- alert("TestMessage", dev, NULL);
|
|
+ alert(EVENT_TEST_MESSAGE, 0, dev, NULL);
|
|
|
|
retval = 0;
|
|
|
|
@@ -595,7 +634,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
*/
|
|
if (sra->array.level == 0 || sra->array.level == -1) {
|
|
if (!st->err && !st->from_config)
|
|
- alert("DeviceDisappeared", dev, " Wrong-Level");
|
|
+ alert(EVENT_DEVICE_DISAPPEARED, 0, dev, " Wrong-Level");
|
|
st->err++;
|
|
goto out;
|
|
}
|
|
@@ -612,7 +651,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
st->percent = RESYNC_NONE;
|
|
new_array = 1;
|
|
if (!is_container)
|
|
- alert("NewArray", st->devname, NULL);
|
|
+ alert(EVENT_NEW_ARRAY, 0, st->devname, NULL);
|
|
}
|
|
|
|
if (st->utime == array.utime && st->failed == sra->array.failed_disks &&
|
|
@@ -625,29 +664,20 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
}
|
|
if (st->utime == 0 && /* new array */
|
|
mse->pattern && strchr(mse->pattern, '_') /* degraded */)
|
|
- alert("DegradedArray", dev, NULL);
|
|
+ alert(EVENT_DEGRADED_ARRAY, 0, dev, NULL);
|
|
|
|
if (st->utime == 0 && /* new array */ st->expected_spares > 0 &&
|
|
sra->array.spare_disks < st->expected_spares)
|
|
- alert("SparesMissing", dev, NULL);
|
|
+ alert(EVENT_SPARES_MISSING, 0, dev, NULL);
|
|
if (st->percent < 0 && st->percent != RESYNC_UNKNOWN &&
|
|
mse->percent >= 0)
|
|
- alert("RebuildStarted", dev, NULL);
|
|
+ alert(EVENT_REBUILD_STARTED, 0, dev, NULL);
|
|
if (st->percent >= 0 && mse->percent >= 0 &&
|
|
(mse->percent / increments) > (st->percent / increments)) {
|
|
- char percentalert[18];
|
|
- /*
|
|
- * "RebuildNN" (10 chars) or "RebuildStarted" (15 chars)
|
|
- */
|
|
-
|
|
if((mse->percent / increments) == 0)
|
|
- snprintf(percentalert, sizeof(percentalert),
|
|
- "RebuildStarted");
|
|
+ alert(EVENT_REBUILD_STARTED, 0, dev, NULL);
|
|
else
|
|
- snprintf(percentalert, sizeof(percentalert),
|
|
- "Rebuild%02d", mse->percent);
|
|
-
|
|
- alert(percentalert, dev, NULL);
|
|
+ alert(EVENT_REBUILD, mse->percent, dev, NULL);
|
|
}
|
|
|
|
if (mse->percent == RESYNC_NONE && st->percent >= 0) {
|
|
@@ -660,9 +690,9 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
snprintf(cnt, sizeof(cnt),
|
|
" mismatches found: %d (on raid level %d)",
|
|
sra->mismatch_cnt, sra->array.level);
|
|
- alert("RebuildFinished", dev, cnt);
|
|
+ alert(EVENT_REBUILD_FINISHED, 0, dev, cnt);
|
|
} else
|
|
- alert("RebuildFinished", dev, NULL);
|
|
+ alert(EVENT_REBUILD_FINISHED, 0, dev, NULL);
|
|
}
|
|
st->percent = mse->percent;
|
|
|
|
@@ -716,14 +746,14 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
change = newstate ^ st->devstate[i];
|
|
if (st->utime && change && !st->err && !new_array) {
|
|
if ((st->devstate[i]&change) & (1 << MD_DISK_SYNC))
|
|
- alert("Fail", dev, dv);
|
|
+ alert(EVENT_FAIL, 0, dev, dv);
|
|
else if ((newstate & (1 << MD_DISK_FAULTY)) &&
|
|
(disc.major || disc.minor) &&
|
|
st->devid[i] == makedev(disc.major,
|
|
disc.minor))
|
|
- alert("FailSpare", dev, dv);
|
|
+ alert(EVENT_FAIL_SPARE, 0, dev, dv);
|
|
else if ((newstate&change) & (1 << MD_DISK_SYNC))
|
|
- alert("SpareActive", dev, dv);
|
|
+ alert(EVENT_SPARE_ACTIVE, 0, dev, dv);
|
|
}
|
|
st->devstate[i] = newstate;
|
|
st->devid[i] = makedev(disc.major, disc.minor);
|
|
@@ -747,7 +777,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
|
|
disappeared:
|
|
if (!st->err && !is_container)
|
|
- alert("DeviceDisappeared", dev, NULL);
|
|
+ alert(EVENT_DEVICE_DISAPPEARED, 0, dev, NULL);
|
|
st->err++;
|
|
goto out;
|
|
}
|
|
@@ -806,7 +836,7 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
|
|
st->parent_devnm[0] = 0;
|
|
*statelist = st;
|
|
if (info.test)
|
|
- alert("TestMessage", st->devname, NULL);
|
|
+ alert(EVENT_TEST_MESSAGE, 0, st->devname, NULL);
|
|
new_found = 1;
|
|
}
|
|
return new_found;
|
|
@@ -1029,7 +1059,7 @@ static void try_spare_migration(struct state *statelist)
|
|
if (devid > 0 &&
|
|
move_spare(from->devname, to->devname,
|
|
devid)) {
|
|
- alert("MoveSpare", to->devname, from->devname);
|
|
+ alert(EVENT_MOVE_SPARE, 0, to->devname, from->devname);
|
|
break;
|
|
}
|
|
}
|
|
--
|
|
2.38.1
|
|
|