diff options
author | Volker Lendecke <vl@samba.org> | 2019-02-07 16:15:46 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2019-03-04 10:37:53 +0000 |
commit | ad3751b5a51097a6f7d695660f9ea11278bbf182 (patch) | |
tree | db962739d852fada7ab2515edf39598a1b0355a3 | |
parent | 9dd1b416654beb2c3771e6924c08c45518a7b3aa (diff) | |
download | samba-ad3751b5a51097a6f7d695660f9ea11278bbf182.tar.gz |
messages_dgm: Properly handle receiver re-initialization
This only properly covers the small-message nonblocking case. Covering
the large-message and the blocking case is a much larger effort assuming
we want to re-send the failed message if parts of the message has gone
through properly. Don't do that for now.
This was found by sanba_dnsupdate constantly recreating its irpc handle to
winbindd in the RODC case.
The messaging_dgm code cached connected datagram sockets based on the
destination pid for 1 second. Which means the IRPC responses from
winbindd are never delivered to samba_dnsupdate,
which will then hit a timeout.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13786
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
(cherry picked from commit 2543bba0364d8054e9ad316f5611621841bc061d)
-rw-r--r-- | selftest/knownfail.d/local-messaging | 1 | ||||
-rw-r--r-- | source3/lib/messages_dgm.c | 16 |
2 files changed, 16 insertions, 1 deletions
diff --git a/selftest/knownfail.d/local-messaging b/selftest/knownfail.d/local-messaging deleted file mode 100644 index 46cf30c7316..00000000000 --- a/selftest/knownfail.d/local-messaging +++ /dev/null @@ -1 +0,0 @@ -^samba3.smbtorture_s3.LOCAL-MESSAGING-READ3 diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c index b7f21ae97c5..90d253d8e26 100644 --- a/source3/lib/messages_dgm.c +++ b/source3/lib/messages_dgm.c @@ -1421,6 +1421,7 @@ int messaging_dgm_send(pid_t pid, struct messaging_dgm_context *ctx = global_dgm_context; struct messaging_dgm_out *out; int ret; + unsigned retries = 0; if (ctx == NULL) { return ENOTCONN; @@ -1428,6 +1429,7 @@ int messaging_dgm_send(pid_t pid, messaging_dgm_validate(ctx); +again: ret = messaging_dgm_out_get(ctx, pid, &out); if (ret != 0) { return ret; @@ -1437,6 +1439,20 @@ int messaging_dgm_send(pid_t pid, ret = messaging_dgm_out_send_fragmented(ctx->ev, out, iov, iovlen, fds, num_fds); + if (ret == ECONNREFUSED) { + /* + * We cache outgoing sockets. If the receiver has + * closed and re-opened the socket since our last + * message, we get connection refused. Retry. + */ + + TALLOC_FREE(out); + + if (retries < 5) { + retries += 1; + goto again; + } + } return ret; } |