1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

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>
This commit is contained in:
Volker Lendecke 2019-02-07 16:15:46 +01:00 committed by Andrew Bartlett
parent 8d8f62c4b9
commit 2543bba036
2 changed files with 16 additions and 1 deletions

View File

@ -1 +0,0 @@
^samba3.smbtorture_s3.LOCAL-MESSAGING-READ3

View File

@ -1419,6 +1419,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;
@ -1426,6 +1427,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;
@ -1435,6 +1437,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;
}