summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_unit.c
diff options
context:
space:
mode:
authorMax Romanov <max.romanov@nginx.com>2020-12-18 00:25:28 +0300
committerMax Romanov <max.romanov@nginx.com>2020-12-18 00:25:28 +0300
commit7b669ed866896afbf26ab6bc0737fe7c8f9c2ec5 (patch)
tree5863a2462b8b9251bde0efc51d9cd3a7c1872926 /src/nxt_unit.c
parent7389a50835696fe256c5decf31bec129f1d59bbf (diff)
downloadunit-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.c5
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);