summaryrefslogtreecommitdiffstats
path: root/sbin/devd/devd.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/devd/devd.cc')
-rw-r--r--sbin/devd/devd.cc25
1 files changed, 22 insertions, 3 deletions
diff --git a/sbin/devd/devd.cc b/sbin/devd/devd.cc
index 447ab87..cdeadf9 100644
--- a/sbin/devd/devd.cc
+++ b/sbin/devd/devd.cc
@@ -104,6 +104,19 @@ __FBSDID("$FreeBSD$");
#define CF "/etc/devd.conf"
#define SYSCTL "hw.bus.devctl_disable"
+/*
+ * Since the client socket is nonblocking, we must increase its send buffer to
+ * handle brief event storms. On FreeBSD, AF_UNIX sockets don't have a receive
+ * buffer, so the client can't increate the buffersize by itself.
+ *
+ * For example, when creating a ZFS pool, devd emits one 165 character
+ * resource.fs.zfs.statechange message for each vdev in the pool. A 64k
+ * buffer has enough space for almost 400 drives, which would be very large but
+ * not impossibly large pool. A 128k buffer has enough space for 794 drives,
+ * which is more than can fit in a rack with modern technology.
+ */
+#define CLIENT_BUFSIZE 131072
+
using namespace std;
extern FILE *yyin;
@@ -759,7 +772,7 @@ process_event(char *buffer)
char *sp;
sp = buffer + 1;
- devdlog(LOG_DEBUG, "Processing event '%s'\n", buffer);
+ devdlog(LOG_INFO, "Processing event '%s'\n", buffer);
type = *buffer++;
cfg.push_var_table();
// No match doesn't have a device, and the format is a little
@@ -892,6 +905,7 @@ void
new_client(int fd)
{
int s;
+ int sndbuf_size;
/*
* First go reap any zombie clients, then accept the connection, and
@@ -901,10 +915,15 @@ new_client(int fd)
check_clients();
s = accept(fd, NULL, NULL);
if (s != -1) {
+ sndbuf_size = CLIENT_BUFSIZE;
+ if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf_size,
+ sizeof(sndbuf_size)))
+ err(1, "setsockopt");
shutdown(s, SHUT_RD);
clients.push_back(s);
++num_clients;
- }
+ } else
+ err(1, "accept");
}
static void
@@ -970,7 +989,7 @@ event_loop(void)
}
rv = select(max_fd, &fds, NULL, NULL, &tv);
if (got_siginfo) {
- devdlog(LOG_INFO, "Events received so far=%u\n",
+ devdlog(LOG_NOTICE, "Events received so far=%u\n",
total_events);
got_siginfo = 0;
}
OpenPOWER on IntegriCloud