diff options
author | Max Romanov <max.romanov@nginx.com> | 2020-12-18 00:25:28 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2020-12-18 00:25:28 +0300 |
commit | 7b669ed866896afbf26ab6bc0737fe7c8f9c2ec5 (patch) | |
tree | 5863a2462b8b9251bde0efc51d9cd3a7c1872926 /src/nxt_unit.c | |
parent | 7389a50835696fe256c5decf31bec129f1d59bbf (diff) | |
download | unit-7b669ed866896afbf26ab6bc0737fe7c8f9c2ec5.tar.gz unit-7b669ed866896afbf26ab6bc0737fe7c8f9c2ec5.tar.bz2 |
Libunit: fixed shared memory waiting.
The nxt_unit_ctx_port_recv() function may return the NXT_UNIT_AGAIN code, in
which case an attempt to reread the message should be made.
The issue was reproduced in load testing with response sizes 16k and up.
In the rare case of a NXT_UNIT_AGAIN result, a buffer of size -1 was processed,
which triggered a 'message too small' alert; after that, the app process was
terminated.
Diffstat (limited to '')
-rw-r--r-- | src/nxt_unit.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/nxt_unit.c b/src/nxt_unit.c index 2cdc75f8..39e7f076 100644 --- a/src/nxt_unit.c +++ b/src/nxt_unit.c @@ -3606,7 +3606,10 @@ nxt_unit_wait_shm_ack(nxt_unit_ctx_t *ctx) return NXT_UNIT_ERROR; } - res = nxt_unit_ctx_port_recv(ctx, ctx_impl->read_port, rbuf); + do { + res = nxt_unit_ctx_port_recv(ctx, ctx_impl->read_port, rbuf); + } while (res == NXT_UNIT_AGAIN); + if (res == NXT_UNIT_ERROR) { nxt_unit_read_buf_release(ctx, rbuf); |