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