Skip to content

Commit e618abf

Browse files
committed
fixes nanomsg#970 TCP connections through docker-proxy do not reconnect
1 parent 906d5ea commit e618abf

File tree

6 files changed

+47
-15
lines changed

6 files changed

+47
-15
lines changed

Diff for: docs/man/nng_stream_recv.3str.adoc

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ None.
5656
`NNG_ECANCELED`:: The operation was canceled.
5757
`NNG_ECLOSED`:: The connection was closed.
5858
`NNG_ECONNRESET`:: The peer closed the connection.
59+
`NNG_ECONNSHUT`:: Remote peer shutdown after sending data.
5960
`NNG_EINVAL`:: The _aio_ does not contain a valid scatter/gather vector.
6061
`NNG_ENOMEM`:: Insufficient free memory to perform the operation.
6162
`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection.

Diff for: include/nng/nng.h

+8-5
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ NNG_DECL int nng_socket_set_uint64(nng_socket, const char *, uint64_t);
233233
NNG_DECL int nng_socket_set_string(nng_socket, const char *, const char *);
234234
NNG_DECL int nng_socket_set_ptr(nng_socket, const char *, void *);
235235
NNG_DECL int nng_socket_set_ms(nng_socket, const char *, nng_duration);
236-
NNG_DECL int nng_socket_set_addr(nng_socket, const char *, const nng_sockaddr *);
236+
NNG_DECL int nng_socket_set_addr(
237+
nng_socket, const char *, const nng_sockaddr *);
237238

238239
NNG_DECL int nng_socket_get(nng_socket, const char *, void *, size_t *);
239240
NNG_DECL int nng_socket_get_bool(nng_socket, const char *, bool *);
@@ -349,7 +350,8 @@ NNG_DECL int nng_dialer_set_uint64(nng_dialer, const char *, uint64_t);
349350
NNG_DECL int nng_dialer_set_string(nng_dialer, const char *, const char *);
350351
NNG_DECL int nng_dialer_set_ptr(nng_dialer, const char *, void *);
351352
NNG_DECL int nng_dialer_set_ms(nng_dialer, const char *, nng_duration);
352-
NNG_DECL int nng_dialer_set_addr(nng_dialer, const char *, const nng_sockaddr *);
353+
NNG_DECL int nng_dialer_set_addr(
354+
nng_dialer, const char *, const nng_sockaddr *);
353355

354356
NNG_DECL int nng_dialer_get(nng_dialer, const char *, void *, size_t *);
355357
NNG_DECL int nng_dialer_get_bool(nng_dialer, const char *, bool *);
@@ -402,11 +404,11 @@ NNG_DECL int nng_listener_set_bool(nng_listener, const char *, bool);
402404
NNG_DECL int nng_listener_set_int(nng_listener, const char *, int);
403405
NNG_DECL int nng_listener_set_size(nng_listener, const char *, size_t);
404406
NNG_DECL int nng_listener_set_uint64(nng_listener, const char *, uint64_t);
405-
NNG_DECL int nng_listener_set_string(
406-
nng_listener, const char *, const char *);
407+
NNG_DECL int nng_listener_set_string(nng_listener, const char *, const char *);
407408
NNG_DECL int nng_listener_set_ptr(nng_listener, const char *, void *);
408409
NNG_DECL int nng_listener_set_ms(nng_listener, const char *, nng_duration);
409-
NNG_DECL int nng_listener_set_addr(nng_listener, const char *, const nng_sockaddr *);
410+
NNG_DECL int nng_listener_set_addr(
411+
nng_listener, const char *, const nng_sockaddr *);
410412

411413
NNG_DECL int nng_listener_get(nng_listener, const char *, void *, size_t *);
412414
NNG_DECL int nng_listener_get_bool(nng_listener, const char *, bool *);
@@ -1080,6 +1082,7 @@ enum nng_errno_enum {
10801082
NNG_ENOARG = 28,
10811083
NNG_EAMBIGUOUS = 29,
10821084
NNG_EBADTYPE = 30,
1085+
NNG_ECONNSHUT = 31,
10831086
NNG_EINTERNAL = 1000,
10841087
NNG_ESYSERR = 0x10000000,
10851088
NNG_ETRANERR = 0x20000000

Diff for: src/platform/posix/posix_ipcconn.c

+18-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ ipc_doread(ipc_conn *c)
186186
// No bytes indicates a closed descriptor.
187187
// This implicitly completes this (all!) aio.
188188
nni_aio_list_remove(aio);
189-
nni_aio_finish_error(aio, NNG_ECLOSED);
189+
nni_aio_finish_error(aio, NNG_ECONNSHUT);
190190
continue;
191191
}
192192

@@ -201,6 +201,22 @@ ipc_doread(ipc_conn *c)
201201
}
202202
}
203203

204+
static void
205+
ipc_error(void *arg, int err)
206+
{
207+
ipc_conn *c = arg;
208+
nni_aio *aio;
209+
210+
nni_mtx_lock(&c->mtx);
211+
while (((aio = nni_list_first(&c->readq)) != NULL) ||
212+
((aio = nni_list_first(&c->writeq)) != NULL)) {
213+
nni_aio_list_remove(aio);
214+
nni_aio_finish_error(aio, err);
215+
}
216+
nni_posix_pfd_close(c->pfd);
217+
nni_mtx_unlock(&c->mtx);
218+
}
219+
204220
static void
205221
ipc_close(void *arg)
206222
{
@@ -225,7 +241,7 @@ ipc_cb(nni_posix_pfd *pfd, int events, void *arg)
225241
ipc_conn *c = arg;
226242

227243
if (events & (POLLHUP | POLLERR | POLLNVAL)) {
228-
ipc_close(c);
244+
ipc_error(c, NNG_ECONNSHUT);
229245
return;
230246
}
231247
nni_mtx_lock(&c->mtx);

Diff for: src/platform/posix/posix_tcpconn.c

+18-2
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ tcp_doread(nni_tcp_conn *c)
180180
// No bytes indicates a closed descriptor.
181181
// This implicitly completes this (all!) aio.
182182
nni_aio_list_remove(aio);
183-
nni_aio_finish_error(aio, NNG_ECLOSED);
183+
nni_aio_finish_error(aio, NNG_ECONNSHUT);
184184
continue;
185185
}
186186

@@ -195,6 +195,22 @@ tcp_doread(nni_tcp_conn *c)
195195
}
196196
}
197197

198+
static void
199+
tcp_error(void *arg, int err)
200+
{
201+
nni_tcp_conn *c = arg;
202+
nni_aio *aio;
203+
204+
nni_mtx_lock(&c->mtx);
205+
while (((aio = nni_list_first(&c->readq)) != NULL) ||
206+
((aio = nni_list_first(&c->writeq)) != NULL)) {
207+
nni_aio_list_remove(aio);
208+
nni_aio_finish_error(aio, err);
209+
}
210+
nni_posix_pfd_close(c->pfd);
211+
nni_mtx_unlock(&c->mtx);
212+
}
213+
198214
static void
199215
tcp_close(void *arg)
200216
{
@@ -242,7 +258,7 @@ tcp_cb(nni_posix_pfd *pfd, int events, void *arg)
242258
nni_tcp_conn *c = arg;
243259

244260
if (events & (POLLHUP | POLLERR | POLLNVAL)) {
245-
tcp_close(c);
261+
tcp_error(c, NNG_ECONNSHUT);
246262
return;
247263
}
248264
nni_mtx_lock(&c->mtx);

Diff for: src/platform/windows/win_ipcconn.c

+1-5
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ ipc_recv_cb(nni_win_io *io, int rv, size_t num)
116116

117117
if ((rv == 0) && (num == 0)) {
118118
// A zero byte receive is a remote close from the peer.
119-
rv = NNG_ECLOSED;
119+
rv = NNG_ECONNSHUT;
120120
}
121121
nni_aio_finish_synch(aio, rv, num);
122122
}
@@ -240,10 +240,6 @@ ipc_send_cb(nni_win_io *io, int rv, size_t num)
240240
}
241241
nni_mtx_unlock(&c->mtx);
242242

243-
if ((rv == 0) && (num == 0)) {
244-
// A zero byte receive is a remote close from the peer.
245-
rv = NNG_ECLOSED;
246-
}
247243
nni_aio_finish_synch(aio, rv, num);
248244
}
249245

Diff for: src/platform/windows/win_tcpconn.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ tcp_recv_cb(nni_win_io *io, int rv, size_t num)
8989

9090
if ((rv == 0) && (num == 0)) {
9191
// A zero byte receive is a remote close from the peer.
92-
rv = NNG_ECLOSED;
92+
rv = NNG_ECONNSHUT;
9393
}
9494
nni_aio_finish_synch(aio, rv, num);
9595
}

0 commit comments

Comments
 (0)