summaryrefslogtreecommitdiffhomepage
path: root/src (follow)
AgeCommit message (Collapse)AuthorFilesLines
2021-01-28Removing unused mutex from nxt_process_t.Max Romanov2-4/+0
2021-01-28Router: fixing crash after WebSocket processing.Max Romanov1-1/+4
After WebSocket processing, the application port was released with incorrect reason ("got request"), unnecessarily decrementing the active request counter. The assertion was triggered only on application removal; a test was added for this case.
2021-01-27Router: fixing error handling in config request.Max Romanov1-19/+42
The controller process awaits the response from the router for every configration change request. This patch adds error reporting for various error conditions which may happen because of file descriptors or memory shortage. Lack of a response lead to the controller awaiting the response, thus being unable to process other client reconfiguration requests that also became stuck.
2021-01-25Router: fixing assertion in shortage of file descriptors.Max Romanov1-0/+2
Each application in router process required fd for a request queue shared memory. When the number of file descripts close to the limit, and port sockets successfully opened, router needs to properly handle the errors. This patch closes port sockets before destroying port structure to avoid file descriptors leakage and assertion in debug build.
2020-12-29Libunit: processing single port message.Max Romanov3-69/+161
This partially reverts the optimisation introduced in 1d84b9e4b459 to avoid an unpredictable block in nxt_unit_process_port_msg(). Under high load, this function may never return control to its caller, and the external event loop (in Node.js and Python asyncio) won't be able to process other scheduled events. To reproduce the issue, two request processing types are needed: 'fast' and 'furious'. The 'fast' one simply returns a small response, while the 'furious' schedules asynchronous calls to external resources. Thus, if Unit is subjected to a large amount of 'fast' requests, the 'furious' request processing freezes until the high load ends. The issue was found by Wu Jian Ping (@wujjpp) during Node.js stream implementation discussion and relates to PR #502 on GitHub.
2020-12-29Node.js: ServerRequest and ServerResponse compliance to Stream API.Max Romanov3-44/+87
ServerRequest now inherit stream Readable object. ServerResponse provides 'writable' property. Thanks to Wu Jian Ping (@wujjpp). This closes #274, closes #317 issues and closes #502 PR on GitHub.
2020-12-23Static: fixing request memory pool leakage in router.Max Romanov1-3/+20
When a static file larger than NXT_HTTP_STATIC_BUF_SIZE (128K) is served, two buffers are allocated and chained; each retains the whole request memory pool. Starting from 41331471eee7, the completion handler was called once for a linked buffer chain, but the second buffer got lost. This patch improves the completion handler's treatment of static buffers to handle all linked buffers.
2020-12-22Python: multiple values in the "path" option.Valentin Bartenev4-36/+118
2020-12-18Libunit: fixed shared memory waiting.Max Romanov1-1/+4
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.
2020-12-18Limiting app queue notifications count in socket.Max Romanov2-7/+18
Under high load, a queue synchonization issue may occur, starting from the steady state when an app queue message is dequeued immediately after it has been enqueued. In this state, the router always puts the first message in the queue and is forced to notify the app about a new message in an empty queue using a socket pair. On the other hand, the application dequeues and processes the message without reading the notification from the socket, so the socket buffer overflows with notifications. The issue was reproduced during Unit load tests. After a socket buffer overflow, the router is unable to notify the app about a new first message. When another message is enqueued, a notification is not required, so the queue grows without being read by the app. As a result, request processing stops. This patch changes the notification algorithm by counting the notifications in the pipe instead of getting the number of messages in the queue.
2020-12-17Router: fixed crash in OOSM processing.Max Romanov1-3/+8
Multithreaded application may create different shared memory segments in different threads. The segments then passed to different router threads. Because of this multithreading, the order of adding incoming segments is not determined and there can be situation when some of the incoming segments are not initialized yet. This patch simply adds check for NULL to skip non-initialized segments. Crash reproduced during load tests with high number of simultaneous connections (1024 and more).
2020-12-14Python: WSGI environment copying moved out of request processing.Valentin Bartenev1-12/+53
The WSGI environment dictionary contains a number of static items, that are pre-initialized on application start. Then it's copied for each request to be filled with request-related data. Now this dictionary copy operation will be done between processing of requests, which should save some CPU cycles during request processing and thus reduce response latency for non-peak load periods.
2020-12-14Isolation: fixed unmounting when mnt namespace is in place.Tiago Natel de Moura1-6/+0
The code had a wrong assumption that "mount namespaces" automatically unmounts process mounts when exits but this happens only with unprivileged mounts.
2020-12-07Ruby: fixed crash on thread start.Max Romanov1-1/+13
Ruby threads need to be created with GVL; otherwise, an attempt to access locked resources may occur, causing a crash. The issue was occasionally reproduced on Ubuntu 18.04 with Ruby 2.5.1 while running test_ruby_application_threads.
2020-12-08PHP: populating PHP_AUTH_* server variables.Valentin Bartenev5-0/+19
This closes #498 issue on GitHub.
2020-12-07HTTP: fixed status line format for unknown status codes.Valentin Bartenev1-17/+20
According to Section #3.1.2 of RFC 7230, after the status code there must be a space even if the reason phrase is empty. Also, only 3 digits allowed. This closes #507 issue on GitHub.
2020-12-07Node.js: avoided use of request struct for debug logging.Max Romanov1-3/+3
This fixes a crash on exit of Node.js application. The crash reproduced on Ubuntu 20.10 with Node.js v15.1.0. Tests 'test_node_websockets_two_clients' and 'test_node_websockets_7_13_1__7_13_2'. The reason of the crash is using request struct which was already freed. The issue was introduced in 5be509fda29e.
2020-11-30Node.js: removing unnecessary warnings.Max Romanov1-18/+6
Warnings changed for debug messages.
2020-11-24Libunit: improved error logging around initialization env variable.Valentin Bartenev1-12/+31
2020-11-17Router: matching regular expressions support.Axel Duch7-18/+463
2020-11-19Libunit: fixing read buffer leakage.Max Romanov1-0/+1
If shared queue is empty, allocated read buffer should be explicitly released. Found by Coverity (CID 363943). The issue was introduced in f5ba5973a0a3.
2020-11-18Python: improving ASGI http send message processing.Max Romanov1-12/+13
2020-11-18Libunit: fixing read buffer allocations on exit.Max Romanov1-5/+5
2020-11-18Libunit: closing active requests on quit.Max Romanov5-11/+96
2020-11-18Libunit: making minor tweaks.Max Romanov1-11/+4
Removing unnecessary context operations from shared queue processing loop. Initializing temporary queues only when required.
2020-11-18Go: removing C proxy functions and re-using goroutines.Max Romanov2-12/+65
2020-11-18Libunit: fixing racing condition in request struct recycling.Max Romanov1-2/+2
The issue occurred under highly concurrent request load in Go applications. Such applications are multi-threaded but use a single libunit context; any thread-safe code in the libunit context is only required for Go applications. As a result of improper request state reset, the recycled request structure was recovered in the released state, so further operations with this request resulted in 'response already sent' warnings. However, the actual response was never delivered to the router and the client.
2020-11-18Libunit: fixing racing condition for port add / state change.Max Romanov1-39/+87
The issue only occurred in Go applications because "port_send" is overloaded only in Go. To reproduce it, send multiple concurrent requests to the application after it has initialised. The warning message "[unit] [go] port NNN:dd not found" is the first visible aspect of the issue; the second and more valuable one is a closed connection, an error response, or a hanging response to some requests. When the application starts, it is unaware of the router's worker thread ports, so it requests the ports from the router after receiving requests from the corresponding router worker threads. When multiple requests are processed simultaneously, the router port may be required by several requests, so request processing starts only after the application receives the required port information. The port should be added to the Go port repository after its 'ready' flag is updated. Otherwise, Unit may start processing some requests and use the port before it is in the repository. The issue was introduced in changeset 78836321a126.
2020-11-18Libunit: improving logging consistency.Max Romanov4-6/+9
Debug logging depends on macros defined in nxt_auto_config.h.
2020-11-17HTTP parser: allowed more characters in header field names.Valentin Bartenev7-37/+100
Previously, all requests that contained in header field names characters other than alphanumeric, or "-", or "_" were rejected with a 400 "Bad Request" error response. Now, the parser allows the same set of characters as specified in RFC 7230, including: "!", "#", "$", "%", "&", "'", "*", "+", ".", "^", "`", "|", and "~". Header field names that contain only these characters are considered valid. Also, there's a new option introduced: "discard_unsafe_fields". It accepts boolean value and it is set to "true" by default. When this option is "true", all header field names that contain characters in valid range, but other than alphanumeric or "-" are skipped during parsing. When the option is "false", these header fields aren't skipped. Requests with non-valid characters in header field names according to RFC 7230 are rejected regardless of "discard_unsafe_fields" setting. This closes #422 issue on GitHub.
2020-11-16Isolation: added option to disable "procfs" mount.Tiago Natel de Moura3-18/+31
Now users can disable the default procfs mount point in the rootfs. { "isolation": { "automount": { "procfs": false } } }
2020-11-13Isolation: added option to disable tmpfs mount.Tiago Natel de Moura3-19/+33
Now users can disable the default tmpfs mount point in the rootfs. { "isolation": { "automount": { "tmpfs": false } } }
2020-11-11PHP: implementation of the fastcgi_finish_request() function.Valentin Bartenev1-2/+76
This closes #219 issue on GitHub.
2020-11-11PHP: prevention of consuming unread request body on finalization.Valentin Bartenev1-0/+15
The php_request_shutdown() function calls sapi_deactivate() that tries to read request body into a dummy buffer. In our case it's just waste of CPU cycles. This change is also required for the following implementation of the fastcgi_finish_request() function, where the request context can be cleared by the time of finalization.
2020-11-10Fixing multi-buffer body send to application.Max Romanov2-6/+20
Application shared queue only capable to pass one shared memory buffer. The rest buffers in chain needs to be send directly to application in response to REQ_HEADERS_AC message. The issue can be reproduced for configurations where 'body_buffer_size' is greater than memory segment size (10 Mb). Requests with body size greater than 10 Mb are just `stuck` e.g. not passed to application awaiting for more data from router. The bug was introduced in 1d84b9e4b459 (v1.19.0).
2020-11-10Python: supporting ASGI legacy protocol.Max Romanov7-27/+184
Introducing manual protocol selection for 'universal' apps and frameworks.
2020-11-06Java: fixing ClassGraph deprecated API call.Max Romanov1-1/+1
The issue (deprecated API warning) introduced by ClassGraph upgrade in ccd5c695b739 commit.
2020-11-05Ruby: error checking during thread creation.Max Romanov1-2/+6
Application terminates in case of thread creation failure.
2020-11-05Perl: request processing in multiple threads.Max Romanov5-148/+374
This closes #486 issue on GitHub.
2020-11-05Ruby: request processing in multiple threads.Max Romanov6-206/+510
This closes #482 issue on GitHub.
2020-11-05Ruby: reusing static constant references to string objects.Max Romanov1-43/+115
This shall save a couple of CPU cycles in request processing.
2020-11-05Java: request processing in multiple threads.Max Romanov4-14/+205
This closes #458 issue on GitHub.
2020-11-05Python: fixing some arguments reference counting.Max Romanov1-33/+130
2020-11-05Python: request processing in multiple threads.Max Romanov13-497/+992
This closes #459 issue on GitHub.
2020-11-05Python: introducting macro to simplify minor version check.Max Romanov1-1/+3
2020-11-01Fixed building test app without debug.Valentin Bartenev1-2/+8
Compilers complained about unused variables after 37e2a3ea1bf1.
2020-10-30Java: supporting jsp-file attribute for servlet.Max Romanov1-0/+66
This closes #487 issue on GitHub.
2020-10-30Isolation: fixed passing custom options to nmount().Valentin Bartenev1-4/+8
The "iov" array was filled incorrectly when custom mounting options were set.
2020-10-29Isolation: mounting of procfs by default when using "rootfs".Tiago Natel de Moura6-108/+185
2020-10-29Isolation: correctly unmount non-dependent paths first.Tiago Natel de Moura1-4/+36
When mount points reside within other mount points, this patch sorts them by path length and then unmounts then in an order reverse to their mounting. This results in independent paths being unmounted first. This fixes an issue in buildbots where dependent paths failed to unmount, leading to the build script removing system-wide language libraries.