summaryrefslogtreecommitdiffhomepage
path: root/src (follow)
AgeCommit message (Collapse)AuthorFilesLines
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.
2020-10-28Added threading to the libunit test app.Max Romanov1-22/+108
2020-10-28Preserving the app port write socket.Max Romanov4-10/+17
The socket is required for intercontextual communication in multithreaded apps.
2020-10-28Libunit: waking another context with the RPC_READY message.Max Romanov1-1/+37
2020-10-28Router: introducing the PORT_ACK message.Max Romanov4-5/+39
The PORT_ACK message is the router's response to the application's NEW_PORT message. After receiving PORT_ACK, the application is safe to process requests using this port. This message avoids a racing condition when the application starts processing a request from the shared queue and sends REQ_HEADERS_ACK. The REQ_HEADERS_ACK message contains the application port ID as reply_port, which the router uses to send request data. When the application creates a new port, it immediately sends it to the main router thread. Because the request is processed outside the main thread, a racing condition can occur between the receipt of the new port in the main thread and the receipt of REQ_HEADERS_ACK in the worker router thread where the same port is specified as reply_port.
2020-10-28Libunit: releasing cached read buffers when destroying context.Max Romanov1-0/+8
2020-10-28Libunit: added a function to discern main and worker contexts.Max Romanov2-0/+13
2020-10-28Libunit: gracefully quitting a multicontext application.Max Romanov2-24/+74
2020-10-28Router: broadcasting the SHM_ACK message to all process ports.Max Romanov3-11/+40
2020-10-28Added error response logging.Max Romanov1-4/+10
Every internal server error response should have a clear description in log.
2020-10-28Router: checking a buffer before accessing its memory fields.Max Romanov1-1/+1
This fixes the router's crash on buildbot; the reason was an unexpected 'last' response from the application to the router arriving before the response headers. The last buffer is not a memory buffer, so the result of accessing memory fields is unpredictable. The unexpected 'last' message was caused by an error in libunit; fixed in fee8fd855a00.
2020-10-28Libunit: protecting the new mmap from being used in another thread.Max Romanov1-1/+6
Until the mmap is received by the router, only the creator thread may use this mmap, so the "mmap not found" state in the router is avoided.
2020-10-28Router: closing app worker's ports.Max Romanov1-0/+19
2020-10-26Increased request memory pool size.Valentin Bartenev1-1/+1
Previous value was too small, which reduced efficiency of the pool causing a lot of additional allocations even for simple request and response.
2020-10-14Fixing uninitialized ncpu value on unsupported platforms.Max Romanov1-1/+4
Thanks to @geyslan. This closes #455 issue on GitHub.
2020-10-14Java: response locale methods implemented.Max Romanov1-3/+18
This closes #479 issue on GitHub.
2020-10-13Using union instead of "void *".Igor Sysoev1-102/+110
2020-10-13Using C99 style declaration.Igor Sysoev1-563/+423
2020-10-13Reordering declarations.Igor Sysoev1-296/+317
2020-10-13Fixed building with Python 3.9.Valentin Bartenev2-2/+3
PyUnicode_GET_SIZE() in deprecated since 3.3 and will be removed in 3.12. In version 3.9 it was explicitly marked by deprecation warning causing compilation error with Unit. PyUnicode_GET_LENGTH() must be used instead.
2020-10-06PHP: compatibility with 8.0.0 RC1.Valentin Bartenev1-0/+30
This closes #474 PR on GitHub.
2020-10-07Router: fixed "not empty" pattern matching.Valentin Bartenev1-4/+0
The "!" pattern should be opposite to "", i.e. match only non-empty values. But after 3c00af54b937 it was equal to "!*", which is wrong.
2020-10-06Removing a meaningless warning message.Max Romanov1-4/+0
Data in the queue and the socket are transmitted independently; special READ_QUEUE and READ_SOCKET message types are used for synchronization. The warning was accidentally committed with changeset 1d84b9e4b459.
2020-10-02Fixed comment.Igor Sysoev1-1/+1
Thanks to 洪志道 (Hong Zhi Dao).
2020-10-01Python: ASGI server introduced.Max Romanov10-29/+3723
This closes #461 issue on GitHub.