From 7b669ed866896afbf26ab6bc0737fe7c8f9c2ec5 Mon Sep 17 00:00:00 2001 From: Max Romanov Date: Fri, 18 Dec 2020 00:25:28 +0300 Subject: 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. --- docs/changes.xml | 7 +++++++ src/nxt_unit.c | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/changes.xml b/docs/changes.xml index f157e9bf..6bd30cab 100644 --- a/docs/changes.xml +++ b/docs/changes.xml @@ -48,6 +48,13 @@ appeared in 1.19.0. + + +application processes could terminate unexpectedly under high load; the bug +had appeared in 1.19.0. + + + 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); -- cgit