summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_port.h (follow)
AgeCommit message (Collapse)AuthorFilesLines
2023-05-08NJS: supported loadable modules.Zhidao HONG1-0/+6
2023-03-17Socket: Remove Unix domain listen sockets upon reconfigure.Andrew Clayton1-0/+3
Currently when using Unix domain sockets for requests, if unit is reconfigured then it will fail if it tries to bind(2) again to a Unix domain socket with something like 2023/02/25 19:15:50 [alert] 35274#35274 bind(\"unix:/tmp/unit.sock\") failed (98: Address already in use) When closing such a socket we really need to unlink(2) it. However that presents a problem in that when running as root, while the main process runs as root and creates the socket, it's the router process, that runs as an unprivileged user, e.g nobody, that closes the socket and would thus remove it, but couldn't due to not having permission, even if the socket is mode 0666, you need write permissions on the containing directory to remove a file. There are several options to solve this, all with varying degrees of complexity and utility. 1) Give the user who the router process runs as write permission to the directory containing the listen sockets. These can then be unlink(2)'d from the router process. Simple and would work, but perhaps not the most elegant. 2) Using capabilities(7). The router process could temporarily attain the CAP_DAC_OVERRIDE capability, unlink(7) the socket, then relinquish the capability until required again. These are Linux specific (other systems may have similar mechanisms which would be extra work to support). There is also a, albeit small, window where the router process is running with elevated privileges. 3) Have the main process do the unlink(2), it is after all the process that created the socket. This is what this commit implements. We create a new port IPC message type of NXT_PORT_MSG_SOCKET_UNLINK, that is used by the router process to notify the main process about a Unix domain socket to unlink(2). Upon doing a reconfigure the router process will call nxt_router_listen_socket_release() which will close the socket, we extend this function in the case of non-abstract Unix domain sockets, so that it will send a message to the main process containing a copy of the nxt_sockaddr_t structure that will contain the filename of the socket. In the main process the handler that we have defined, nxt_main_port_socket_unlink_handler(), for this message type will run and allow us to look for the socket in question in the listen_sockets array and remove it and unlink(2) the socket. This then allows the reconfigure to work if it tries to bind(2) again to a socket that previously existed. Link: <https://github.com/nginx/unit/issues/669> Link: <https://github.com/nginx/unit/pull/735> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
2022-08-29Implemented basic statistics API.Valentin Bartenev1-0/+5
2022-06-07Removing unused tracking fields and functions.Max Romanov1-4/+0
The message tracking is unused since 1d84b9e4b459 commit. This fixes the issue found by Coverity (CID 376263).
2021-11-09Introducing application prototype processes.Tiago Natel de Moura1-0/+3
2021-11-09Changed nxt_process_* for reuse.Tiago Natel de Moura1-0/+1
This enables the reuse of process creation functions.
2021-11-09Introduced SCM_CREDENTIALS / SCM_CREDS in the socket control msgs.Tiago Natel de Moura1-1/+18
2021-10-28Moving request limit control to libunit.Max Romanov1-2/+0
Introducting application graceful stop. For now only used when application process reach request limit value. This closes #585 issue on GitHub.
2021-07-29Application restart introduced.Max Romanov1-0/+3
When processing a restart request, the router sends a QUIT message to all existing processes of the application. Then, a new shared application port is created to ensure that new requests won't be handled by the old processes of the application.
2020-10-28Router: introducing the PORT_ACK message.Max Romanov1-0/+3
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-08-11Style fixes for 2 file descriptors transfer over port.Max Romanov1-4/+2
Two consecutive fd and fd2 fields replaced with array.
2020-08-11Introducing application and port shared memory queues.Max Romanov1-5/+20
The goal is to minimize the number of syscalls needed to deliver a message.
2020-08-11Port message extended to transfer 2 file descriptors.Max Romanov1-0/+2
2020-08-11Introducing the shared application port.Max Romanov1-4/+7
This is the port shared between all application processes which use it to pass requests for processing. Using it significantly simplifies the request processing code in the router. The drawback is 2 more file descriptors per each configured application and more complex libunit message wait/read code.
2020-08-11Changing router to application shared memory exchange protocol.Max Romanov1-0/+7
The application process needs to request the shared memory segment from the router instead of the latter pushing the segment before sending a request to the application. This is required to simplify the communication between the router and the application and to prepare the router for using the application shared port and then the queue.
2020-08-11Changing router to application port exchange protocol.Max Romanov1-0/+9
The application process needs to request the port from the router instead of the latter pushing the port before sending a request to the application. This is required to simplify the communication between the router and the application and to prepare the router to use the application shared port and then the queue.
2020-03-09Refactor of process management.Tiago Natel de Moura1-70/+71
The process abstraction has changed to: setup(task, process) start(task, process_data) prefork(task, process, mp) The prefork() occurs in the main process right before fork. The file src/nxt_main_process.c is completely free of process specific logic. The creation of a process now supports a PROCESS_CREATED state. The The setup() function of each process can set its state to either created or ready. If created, a MSG_PROCESS_CREATED is sent to main process, where external setup can be done (required for rootfs under container). The core processes (discovery, controller and router) doesn't need external setup, then they all proceeds to their start() function straight away. In the case of applications, the load of the module happens at the process setup() time and The module's init() function has changed to be the start() of the process. The module API has changed to: setup(task, process, conf) start(task, data) As a direct benefit of the PROCESS_CREATED message, the clone(2) of processes using pid namespaces now doesn't need to create a pipe to make the child block until parent setup uid/gid mappings nor it needs to receive the child pid.
2019-12-24Introducing port messages to notify about out of shared memory.Max Romanov1-0/+9
- OOSM (out of shared memory). Sent by application process to router when application reaches the limit of allocated shared memory and needs more. - SHM_ACK. Sent by router to application when the application's shared memory is released and the OOSM flag is enabled for the segment. This implements blocking mode (the library waits for SHM_ACK in case of out of shared memory condition and retries allocating the required memory amount) and non-blocking mode (the library notifies the application that it's out of shared memory and returns control to the application module that sets up the output queue and puts SHM_ACK in the main message loop).
2019-11-26Refactor of process init.Tiago Natel1-1/+1
Introduces the functions nxt_process_init_create() and nxt_process_init_creds_set().
2019-08-20Introducing websocket support in router and libunit.Max Romanov1-0/+15
2019-08-16Fixing multi-thread port write racing conditions.Max Romanov1-6/+2
2018-09-20Controller: certificates storage interface.Valentin Bartenev1-0/+6
2018-04-11Initial access log support.Valentin Bartenev1-0/+3
2018-04-05Style.Valentin Bartenev1-8/+8
2018-01-29Introducing extended app process management.Max Romanov1-0/+3
- Pre-fork 'processes.spare' application processes; - fork more processes to keep 'processes.spare' idle processes; - fork on-demand up to 'processes.max' count; - scale down idle application processes above 'processes.spare' after 'processes.idle_timeout'; - number of concurrently started application processes also limited by 'processes.spare' (or 1, if spare is 0).
2017-12-27Fixing application timeout.Max Romanov1-0/+6
Application timeout limits maximum time of worker response in processing particular request. Not including the time required to start worker, time in request queue etc.
2017-12-27Changing worker selection precedence.Max Romanov1-1/+1
This patch increase precedence of non-started worker over busy worker. 1. idle worker; 2. start new worker; 3. busy worker, but can accept request in advance;
2017-12-27Implementing the ability to cancel request before worker starts processing it.Max Romanov1-4/+23
2017-11-02Fixing build on Solaris.Max Romanov1-1/+1
2017-10-19Filtering process to keep connection.Max Romanov1-2/+0
- Main process should be connected to all other processes. - Controller should be connected to Router. - Router should be connected to Controller and all Workers. - Workers should be connected to Router worker thread ports only. This filtering helps to avoid unnecessary communication and various errors during massive application workers stop / restart.
2017-10-04Port message fragmentation supported.Max Romanov1-0/+5
- Each sendmsg() transmits no more than port->max_size payload data. - Longer buffers are fragmented and send using multiple sendmsg() calls. - On receive side, buffers are connected in chain. - Number of handler calls is the same as number of nxt_port_socket_write() calls. - nxt_buf_make_plain() function introduced to make single plain buffer from the chain.
2017-10-04Using port 'post' facility to proxy remove pid message to workers.Max Romanov1-1/+5
Remove pid proxying to worker engines implementation was originally overcomplicated. Memory pool and 2 engine posts (there and back again) are optimized out and replaced with band new nxt_port_post() call.
2017-10-04Optimized send message allocations.Max Romanov1-2/+0
For empty write queue cases, it is possible to avoid allocation and enqueue send message structures. Send message initialized on stack and passed to write handler. If immediate write fails, send message allocated from engine pool and enqueued.
2017-10-04Introducing use counters for port and app. Thread safe port write.Max Romanov1-4/+13
Use counter helps to simplify logic around port and application free. Port 'post' function introduced to simplify post execution of particular function to original port engine's thread. Write message queue is protected by mutex which makes port write operation thread safe.
2017-09-15Introducing named port message handlers to avoid misprints.Max Romanov1-29/+73
2017-09-15Introducing application timeout.Max Romanov1-2/+1
2017-09-10Configuration persistence.Valentin Bartenev1-0/+2
Now configuration survives server reloads.
2017-08-17The new module configuration interface.Igor Sysoev1-0/+2
Configuration and building example: ./configure ./configure python ./configure php ./configure go make all or ./configure make nginext ./configure python make python ./configure php make php ./configure go make go Modules configuration options and building examples: ./configure python --module=python2 --config=python2.7-config make python2 ./configure php --module=php7 --config=php7.0-config --lib-path=/usr/local/php7.0 make php7 ./configure go --go=go1.6 --go-path=${HOME}/go1.6 make go1.6
2017-08-11Sync flag introduced for port type.Max Romanov1-1/+3
To avoid transfer mmap_msg before new mmap message.
2017-08-02Listening socket creation and binding operations are passedIgor Sysoev1-0/+2
to the master process.
2017-08-02Added basic port error handler.Max Romanov1-1/+4
2017-08-02Runtime processes protected with mutex.Max Romanov1-2/+0
2017-08-02Using port rpc in router->master start worker request.Max Romanov1-0/+3
2017-08-02Port RPC interface introduced.Max Romanov1-0/+9
Usage: 1. Register handlers in incoming port with nxt_port_rpc_register_handler(). 2. Use return value as a stream identifier for next nxt_port_socket_write().
2017-08-02Added bit flags to type parameter of nxt_port_socket_write().Max Romanov1-8/+24
NXT_PORT_MSG_LAST - mark message as last; NXT_PORT_MSG_CLOSE_FD - close fd right after send; Type constants altered to include last flag for single buffer messages. Last sign is critical for coming port RPC layer. Handlers unregistered on last message. Create sync buffer is not convenient, extra parameter is better.
2017-07-18Removed NXT_PACKED from port structures.Valentin Bartenev1-2/+2
That was added only to silence Valgrind, but it results in unaligned access (which breaks Unit on ARM architecture).
2017-07-18Request-app link introduced to prevent mp destroy for penging requests.Max Romanov1-0/+1
nxt_req_conn_link_t still used for lookup connection by request id. New nxt_req_app_link_t (ra) allocated from conn->mem_pool using mp_retain(). ra stored in app->requests if there is no free worker to process request.
2017-07-18Port allocation and destroy changed. Worker process stop introduced.Max Romanov1-0/+5
2017-07-12New process port exchange changed. READY message type introduced.Max Romanov1-8/+18
Application process start request DATA message from router to master. Master notifies router via NEW_PORT message after worker process become ready.
2017-07-07Process stop notification from master to all other processes.Max Romanov1-4/+5
New port message type introduced NXT_PORT_MSG_REMOVE_PID. Default handler removes process description from nxt_runtime_t with all ports, incoming and outgoing mmaps etc.