libmapper: Retry when receiving ENOBUFS
The dbus daemon can return ENOBUFS if a server has too many outstanding
requests that have not yet been serviced. We've noticed during boot that
the load on the mapper is great enough that we will hit this dbus limit.
Since this condition eventually improves, we want to retry just like
with EBUSY.
Change-Id: Ia21d87fba1793016e7c9dfa835fbe7bac0085f10
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/libmapper/mapper.c b/libmapper/mapper.c
index ff96dc8..399c475 100644
--- a/libmapper/mapper.c
+++ b/libmapper/mapper.c
@@ -182,7 +182,7 @@
if (r == ENOENT)
goto exit;
- if (r == EBUSY && data->retry < mapper_busy_retries)
+ if ((r == EBUSY || r == ENOBUFS) && data->retry < mapper_busy_retries)
{
r = sd_event_now(wait->loop, CLOCK_MONOTONIC, &next_retry);
if (r < 0)
@@ -420,7 +420,7 @@
goto exit;
}
- if (r == EBUSY && subtree->retry < mapper_busy_retries)
+ if ((r == EBUSY || r == ENOBUFS) && subtree->retry < mapper_busy_retries)
{
r = sd_event_now(subtree->loop, CLOCK_MONOTONIC, &next_retry);
if (r < 0)
@@ -581,7 +581,6 @@
int mapper_get_object(sd_bus *conn, const char *obj, sd_bus_message **reply)
{
- sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus_message *request = NULL;
int r, retry = 0;
@@ -600,9 +599,8 @@
while (true)
{
- sd_bus_error_free(&error);
- r = sd_bus_call(conn, request, 0, &error, reply);
- if (r < 0 && sd_bus_error_get_errno(&error) == EBUSY)
+ r = sd_bus_call(conn, request, 0, NULL, reply);
+ if (r == -EBUSY || r == -ENOBUFS)
{
if (retry >= mapper_busy_retries)
break;
@@ -618,7 +616,6 @@
goto exit;
exit:
- sd_bus_error_free(&error);
sd_bus_message_unref(request);
return r;