aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorнаб <nabijaczleweli@nabijaczleweli.xyz>2021-04-02 15:14:31 +0000
committerBrian Behlendorf <behlendorf1@llnl.gov>2021-04-14 20:19:49 +0000
commitcb97db792e6f8c033fdc848c5e76700adc12a68a (patch)
treee7528678e9eeb728f771ed180dfa9cb6477364d5
parent718ee43362f477e70d3cd7ad8871a2c575e7a792 (diff)
downloadsrc-cb97db792e6f8c033fdc848c5e76700adc12a68a.tar.gz
src-cb97db792e6f8c033fdc848c5e76700adc12a68a.zip
zed: bump zfs_zevent_len_max if we miss any events
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Closes #11834
-rw-r--r--cmd/zed/zed_event.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/cmd/zed/zed_event.c b/cmd/zed/zed_event.c
index 6d746b7b139a..a2753ced0cdc 100644
--- a/cmd/zed/zed_event.c
+++ b/cmd/zed/zed_event.c
@@ -100,6 +100,45 @@ zed_event_fini(struct zed_conf *zcp)
zed_exec_fini();
}
+static void
+_bump_event_queue_length(void)
+{
+ int zzlm = -1, wr;
+ char qlen_buf[12] = {0}; /* parameter is int => max "-2147483647\n" */
+ long int qlen;
+
+ zzlm = open("/sys/module/zfs/parameters/zfs_zevent_len_max", O_RDWR);
+ if (zzlm < 0)
+ goto done;
+
+ if (read(zzlm, qlen_buf, sizeof (qlen_buf)) < 0)
+ goto done;
+ qlen_buf[sizeof (qlen_buf) - 1] = '\0';
+
+ errno = 0;
+ qlen = strtol(qlen_buf, NULL, 10);
+ if (errno == ERANGE)
+ goto done;
+
+ if (qlen <= 0)
+ qlen = 512; /* default zfs_zevent_len_max value */
+ else
+ qlen *= 2;
+
+ if (qlen > INT_MAX)
+ qlen = INT_MAX;
+ wr = snprintf(qlen_buf, sizeof (qlen_buf), "%ld", qlen);
+
+ if (pwrite(zzlm, qlen_buf, wr, 0) < 0)
+ goto done;
+
+ zed_log_msg(LOG_WARNING, "Bumping queue length to %ld", qlen);
+
+done:
+ if (zzlm > -1)
+ (void) close(zzlm);
+}
+
/*
* Seek to the event specified by [saved_eid] and [saved_etime].
* This protects against processing a given event more than once.
@@ -138,10 +177,7 @@ zed_event_seek(struct zed_conf *zcp, uint64_t saved_eid, int64_t saved_etime[])
if (n_dropped > 0) {
zed_log_msg(LOG_WARNING, "Missed %d events", n_dropped);
- /*
- * FIXME: Increase max size of event nvlist in
- * /sys/module/zfs/parameters/zfs_zevent_len_max ?
- */
+ _bump_event_queue_length();
}
if (nvlist_lookup_uint64(nvl, "eid", &eid) != 0) {
zed_log_msg(LOG_WARNING, "Failed to lookup zevent eid");
@@ -914,10 +950,7 @@ zed_event_service(struct zed_conf *zcp)
if (n_dropped > 0) {
zed_log_msg(LOG_WARNING, "Missed %d events", n_dropped);
- /*
- * FIXME: Increase max size of event nvlist in
- * /sys/module/zfs/parameters/zfs_zevent_len_max ?
- */
+ _bump_event_queue_length();
}
if (nvlist_lookup_uint64(nvl, "eid", &eid) != 0) {
zed_log_msg(LOG_WARNING, "Failed to lookup zevent eid");