You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
3.5 KiB
72 lines
3.5 KiB
From 4c6c21f92a8204abf031e42bb4949a0ecf039f7a Mon Sep 17 00:00:00 2001 |
|
From: David Herrmann <dh.herrmann@gmail.com> |
|
Date: Wed, 11 Mar 2015 13:53:21 +0100 |
|
Subject: [PATCH] bus-proxy: complain only once about queue overflows |
|
|
|
If the local peer does not dispatch its incoming queue, the bus-proxy will |
|
slowly fill its outgoing queue. Once its full, it will continously |
|
complain that it cannot forward its messages. |
|
|
|
As it turns out, pulseaudio does have an idle background dbus connection |
|
that is not integrated into any mainloop (and given that gdbus and |
|
libdbus1 both support background shared connections, PA is probably not |
|
the only example), therefore, the bus-proxy will loudly complain if it |
|
cannot forward NameOwnerChanged events once the queue is full. |
|
|
|
This commit makes the proxy track queue-state and complain only once the |
|
queue runs full, not if it is already full. |
|
|
|
A PA bug-report (and patch) has been filed, and other applications should |
|
be fixed similarly. Hence, lets keep the error message, instead of |
|
dropping it. It's unused resources we really want to get rid of, so |
|
silencing the message does not really help (which is actually what |
|
dbus-daemon does). |
|
|
|
(cherry picked from commit ec2c7b56599981a7d9e76b15c75af3e1af3e6f81) |
|
--- |
|
src/bus-proxyd/proxy.c | 16 ++++++++++++---- |
|
src/bus-proxyd/proxy.h | 1 + |
|
2 files changed, 13 insertions(+), 4 deletions(-) |
|
|
|
diff --git a/src/bus-proxyd/proxy.c b/src/bus-proxyd/proxy.c |
|
index 3dea908f5..e13cf5e2e 100644 |
|
--- a/src/bus-proxyd/proxy.c |
|
+++ b/src/bus-proxyd/proxy.c |
|
@@ -729,13 +729,21 @@ static int proxy_process_destination_to_local(Proxy *p) { |
|
|
|
/* Return the error to the client, if we can */ |
|
synthetic_reply_method_errnof(m, r, "Failed to forward message we got from destination: %m"); |
|
- log_error_errno(r, |
|
- "Failed to forward message we got from destination: uid=" UID_FMT " gid=" GID_FMT" message=%s destination=%s path=%s interface=%s member=%s: %m", |
|
- p->local_creds.uid, p->local_creds.gid, bus_message_type_to_string(m->header->type), |
|
- strna(m->destination), strna(m->path), strna(m->interface), strna(m->member)); |
|
+ if (r == -ENOBUFS) { |
|
+ /* if local dbus1 peer does not dispatch its queue, warn only once */ |
|
+ if (!p->queue_overflow) |
|
+ log_error("Dropped messages due to queue overflow of local peer (pid: "PID_FMT" uid: "UID_FMT")", p->local_creds.pid, p->local_creds.uid); |
|
+ p->queue_overflow = true; |
|
+ } else |
|
+ log_error_errno(r, |
|
+ "Failed to forward message we got from destination: uid=" UID_FMT " gid=" GID_FMT" message=%s destination=%s path=%s interface=%s member=%s: %m", |
|
+ p->local_creds.uid, p->local_creds.gid, bus_message_type_to_string(m->header->type), |
|
+ strna(m->destination), strna(m->path), strna(m->interface), strna(m->member)); |
|
+ |
|
return 1; |
|
} |
|
|
|
+ p->queue_overflow = false; |
|
return 1; |
|
} |
|
|
|
diff --git a/src/bus-proxyd/proxy.h b/src/bus-proxyd/proxy.h |
|
index 913d47071..782c4e60b 100644 |
|
--- a/src/bus-proxyd/proxy.h |
|
+++ b/src/bus-proxyd/proxy.h |
|
@@ -40,6 +40,7 @@ struct Proxy { |
|
SharedPolicy *policy; |
|
|
|
bool got_hello : 1; |
|
+ bool queue_overflow : 1; |
|
}; |
|
|
|
int proxy_new(Proxy **out, int in_fd, int out_fd, const char *dest);
|
|
|