Commit Graph
100 Commits
Author SHA1 Message Date
Max Romanov 38e40fa857 PHP: using generated dependencies in makefile. 2018-05-30 18:19:39 +03:00
Max Romanov 07204789bc Eliminating possible NULL pointer dereference.
Found by Coverity (CID 276138).
2018-04-27 20:32:50 +03:00
Max Romanov 179819dbee Controller waits READY message from router.
This required to avoid racing condition when controller receive router
port before router receives controller port.
2018-04-26 16:44:20 +03:00
Max Romanov ad36c8ca8d Go: fixed request.Read() behaviour for EOF.
This closes #108 issue on GitHub.
2018-04-20 17:23:43 +03:00
Max Romanov 8934afee24 Go: Forced WriteHeader after application request processing.
Application should create response for every request.
If not, Unit package will do it.
2018-04-06 16:27:46 +03:00
Max Romanov 2f3b9d4583 Handling error return from application 'run()' function.
Server error response generated or connection closed.
2018-04-05 17:20:26 +03:00
Max Romanov d748f74f2b Stopping timed out application process. 2018-04-05 17:19:25 +03:00
Max Romanov 778a90c319 Triggering RPC error for all handlers on port close.
This is required to avoid crashes and memory leaks on Unit exit.
2018-03-21 16:55:09 +03:00
Max Romanov b865db1bb7 Registered RPC handlers affects port use counters.
Service process port gets closed and released by runtime on process exit,
but there can be active RPC handlers, which uses port structure.
2018-03-21 16:55:02 +03:00
Max Romanov 6da1207d95 Skipping idle state when port already closed. 2018-03-15 17:08:39 +03:00
Max Romanov 7958a22de0 Ignoring response for already terminated request.
Request can be terminated because of invalid response headers and content
should be ignored in this case.
2018-03-14 12:03:47 +03:00
Max Romanov 1ac9db4750 Releasing application on configuration failure. 2018-03-13 15:32:06 +03:00
Max Romanov ee092b64eb Socket configuration should retain application.
This retains application during reconfiguration if an incoming connection
was already established before the reconfiguration, but no request was yet
created for the connection and thus no application was yet assigned to
the request.
2018-03-07 19:42:06 +03:00
Max Romanov babf67712e Removed unwanted assertions. 2018-02-20 19:00:30 +03:00
Max Romanov 18c66cb07d Improving configuration field mapping names.
Avoiding word 'common' as too common.
Couple of assertions reduced to error messages.
2018-02-13 21:28:21 +03:00
Max Romanov d2c85a2d9e Fixed processing of application response in router.
If the first buffer contained only header and there were other buffers in chain,
those buffers were not processed.  In particular, this broke Perl application
responses with empty body.
2018-02-07 13:47:04 +03:00
Max Romanov f7195e7016 Fixed typo in assertion statement introduced in 4979fe09d9cd.
Found by Coverity (CID 260375).
2018-02-02 14:08:18 +03:00
Max Romanov 9cd4fdbdb7 Introducing extended app process management.
- 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).
2018-01-29 16:17:36 +03:00
Max Romanov 2db8e586e5 Reduced duplication of validated app config options.
Common options moved to separate array.  Application-specific arrays refers
to common options.
2018-01-18 09:08:25 +03:00
Max Romanov c2918a0014 Introducing pretty NXT_CONF_VLDT_END macro. 2018-01-18 09:08:16 +03:00
Max Romanov fa49d042a8 PHP: Terminating names with zero.
Fixing issue introduced in changeset 462:17a2c9b27b57 .
2018-01-12 16:37:42 +03:00
Max Romanov aad4229cbc Initializing script_name.start before using.
This makes gcc 4.4.6 happy.
2018-01-12 11:19:00 +03:00
Max Romanov 349717fb90 Changing relative php scripts paths to real ones.
This is required to run phpMyAdmin.
2018-01-11 22:14:20 +03:00
Max Romanov b59535b22c Removed unused variable assignment.
Found by Coverity (CID 215301).
2017-12-28 15:58:01 +03:00
Max Romanov 47bc1c53d6 Implementing worker stop after limits.requests. 2017-12-27 17:48:53 +03:00
Max Romanov 5196cf4d50 Rescheduling of pending request after configured timeout.
New optional configuration parameter introduced: limits.reschedule_timeout.
Default value 1 second.  In the case when request is written to the port
socket 'in advance', it is called 'pending'.

On every completed request, the head of pending request is checked against
reschedule timeout.  If this request waiting for execution longer than
timeout, it is cancelled, new port selected for this request.
2017-12-27 17:48:04 +03:00
Max Romanov baa8c9387b Fixing code style. 2017-12-27 17:47:42 +03:00
Max Romanov bef2ec483e Fixing application timeout.
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-27 17:47:18 +03:00
Max Romanov ab138c9166 Changing worker selection precedence.
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-27 17:46:39 +03:00
Max Romanov 89c0f7c5db Implementing the ability to cancel request before worker starts processing it. 2017-12-27 17:46:17 +03:00
Max Romanov be36cf52c8 Introducing application 'atexit' hook.
Finalizing Python interpreter.

This closes #65 issue on GitHub.
2017-12-27 14:02:11 +03:00
Max Romanov 392abd03e5 Restoring apps in case of reconfiguration error. 2017-12-25 16:24:54 +03:00
Max Romanov 4e403c17da Introducing --lib-path options for Python module linkage.
This option is useful when python-config does not setup path to libpython,
which is non standard.
2017-12-15 14:06:15 +03:00
Max Romanov 799cff5f3e Introducing Unit version check in Go package.
To communicate with the Go program, Unit setup environment variable
named NXT_GO_PORTS with value contains Unit version, stream id to confirm
application is started, and Unit ports information.  Go Unit package parses
this string and compares runtime version with compile time version.  In case
of parse error or version mismatch, ListenAndServe() returns with the error.
2017-12-13 18:12:13 +03:00
Max Romanov d14c0774c7 Go: removing request registry.
Passing unsafe.Pointers (void *) from Go to C is complicated by an attempt
to make such pointers less unsafe.

A straightforward optimization is to replace 'unsafe.Pointer' with 'uintptr'
(thanks to Xin Huang for the idea: https://stackoverflow.com/a/44826533 ).

As a result, request registry with mutex is gone.
2017-12-06 12:16:02 +03:00
Max Romanov 0db4d25316 Fixing Go package build in NetBSD.
Bug introduced in 585c8068a6d7.
2017-12-05 17:06:37 +03:00
Max Romanov cdf900cf2c Packaging changes for updated Go package.
- package name changed to 'nginx/unit';
- source files installed in /usr/share/gocode;
- rpm and deb go packages made noarch.
2017-12-01 16:59:41 +03:00
Max Romanov 40eb1f8b9b Making Go package source distributable and renaming to 'nginx/unit'.
All header files are copied to Go package sources.  As the result,
package can be (re-)build when required.

This closes #23 issue on GitHub.
2017-12-01 16:57:30 +03:00
Max Romanov ffb1c68609 Initializing port_msg fields with zeroes in Go package. 2017-12-01 16:51:30 +03:00
Max Romanov 630ec3f1ec Using compiler capability to generate dependencies.
This closes #58 issue on GitHub.
2017-12-01 16:28:06 +03:00
Max Romanov 1add36a7ee Using --ld-opt when linking modules. 2017-11-29 18:49:08 +03:00
Max Romanov 3781950bad Introducing python virtualenv configuration.
New parameter 'home' for python application allows to configure
application-specific virtualenv path.

This closes #15 issue on GitHub.
2017-11-29 18:48:55 +03:00
Max Romanov ec411569e7 Fixing build on Solaris. 2017-11-02 15:32:46 +03:00
Max Romanov 6bbed85899 Fixing Coverity warnings.
CID 200496
CID 200494
CID 200490
CID 200489
CID 200483
CID 200482
CID 200472
CID 200465
2017-11-20 17:08:29 +03:00
Max Romanov fa76ea700f Fixing racing condition in request.msgs usage. 2017-10-27 11:05:37 +03:00
Max Romanov 1d11f8cfbb Fixing Go program crash.
Go request registration should be removed before C request memory freed.

C request address used as a key in Go map.  Freed memory can be instantly
reused for other request and older request registration should removed at this
point to avoid collisions.
2017-10-27 11:05:22 +03:00
Max Romanov 51396fea83 Checking the result of shared memory buffer allocation.
This closes #57 issue on GitHub.
2017-10-25 15:09:07 +03:00
Max Romanov c8a8a7c212 Fixing Go package build.
Go package build was broken by change 365:28b2a468be43.
2017-10-19 18:20:08 +03:00
Max Romanov fc6520d722 Keep application worker until response for all requests received. 2017-10-19 17:37:26 +03:00
Max Romanov b3aab8c66f Filtering process to keep connection.
- 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-19 17:37:19 +03:00
Max Romanov 6031c63225 Introducing mmap_handler to count references to shared memory.
"All problems in computer science can be
                           solved by another level of indirection"

                                                   Butler Lampson

Completion handlers for application response buffers executed after
sending the data to client.  Application worker can be stopped right
after send response buffers to router.  Worker stop causes removal
of all data structures for the worker.

To prevent shared memory segment unmap, need to count the number of
buffers which uses it.  So instead of direct reference to shared
memory, need to reference to intermediate 'handler' structure with
use counter and pointer to shared memory.
2017-10-19 17:37:02 +03:00
Max Romanov 6532e46465 Supporting concurrent shared memory fd receive in router.
Two different router threads may send different requests to single
application worker.  In this case shared memory fds from worker
to router will be send over 2 different router ports.  These fds
will be received and processed by different threads in any order.

This patch made possible to add incoming shared memory segments in
arbitrary order.  Additionally, array and memory pool are no longer
used to store segments because of pool's single threaded nature.

Custom array-like structure nxt_port_mmaps_t introduced.
2017-10-19 17:36:56 +03:00
Max Romanov 6fd465f9d2 Introducing src_pid for mmap header for accurate buf completion.
This allows to use shared memory to communicate with main process.

This patch changes shared memory segment format and breaks compatibility
with older modules.
2017-10-19 17:36:45 +03:00
Max Romanov 00ecf713e3 Port message fragmentation supported.
- 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-04 15:03:45 +03:00
Max Romanov 0faecee609 Optimized request<->app link allocation.
Only purpose of request<->app link instance is to be enqueued in application
requests queue.

It is possible to avoid request<->app link allocation from memory pool in
case when spare application port is available.  Instance from local stack
can be used to prepare and send message to application.
2017-10-04 15:03:03 +03:00
Max Romanov 439bf7df11 Breaking read loop by nxt_port_read_close().
Port message handler may perform fork() and then close port read file
descriptor and enable write on same event fd.  Next read attempt in this case
may cause different errors in log file.
2017-10-04 15:02:32 +03:00
Max Romanov e44401a0bb Introducing process use counter.
This helps to decouple process removal from port memory pool cleanups.
2017-10-04 15:02:11 +03:00
Max Romanov f869bf1b02 Return error codes for port_hash operations. 2017-10-04 15:02:00 +03:00
Max Romanov 85e485776b Using port 'post' facility to proxy remove pid message to workers.
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-04 15:01:15 +03:00
Max Romanov 730f5a9dd9 Using request mem pool for req<->app link.
Request <-> application link structure (nxt_req_app_link_t) used to register
the request in application request queue (nxt_app_t.requests) and generate
application-specific port message.

Now it is allocated from request pool.  This pool created for request parsing
and used to allocate and store information specific to this request.
2017-10-04 15:00:35 +03:00
Max Romanov a4b5b5d45d Fixed error generation during request processing.
Request can be processed in thread different from the thread where the
connection originally handled.

Because of possible racing conditions, using original connection structures
is unsafe.  To solve this, error condition is registered in 'ra' (request <->
application link) and traversed back to original connection thread where
the error message can be generated and send back to client.
2017-10-04 15:00:05 +03:00
Max Romanov ebbe89bd5c Optimized send message allocations.
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-04 14:59:35 +03:00
Max Romanov 6a64533fa3 Introducing use counters for port and app. Thread safe port write.
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-10-04 14:58:47 +03:00
Max Romanov 414d508e04 Using engine memiory pool for port write allocations.
To allow use port from different threads, the first step is to avoid using
port's memory pool for temporary allocations required to send data through
the port.  Including but not limited by:
  - buffers for data;
  - send message structures;
  - new mmap fd notifications;

It is still safe to use port memory pool for incoming buffers allocations
because recieve operation bound to single thread.
2017-10-04 14:58:13 +03:00
Max Romanov ba31199786 Removing mem_pool from port_hash interface.
Memory pool is not used by port_hash and it was a mistake to pass it into
'add' and 'remove' functions.  port_hash enrties are allocated from heap.
2017-10-04 14:57:56 +03:00
Max Romanov 4ae76249ed Fixing memory leak when handling remove pid message.
Worker threads ports need to receive 'remove pid' message to properly handle
application process exit case and finish requests processed by particular
application worker.  Main process send 'remove pid' notification to service
thread port only and this message must be 'proxied' to other running engines.

Separate memory pool created for this message.  For each engine structure
required to post message to engine allocate from the pool using 'retain'
allocation method.  After successfull post structure will be freed using
'release' method.  To completely destroy poll one more 'release' should be
called to release initial reference count.

I'm afraid this should be simplified using good old malloc() and free() calls.
2017-10-04 14:57:29 +03:00
Max Romanov 2ae0449262 Checking mallopt() during configure.
mallopt() is absent on Alpine musl.
2017-09-25 17:53:10 +03:00
Max Romanov 4f7e00ef34 Fixing shared memory thread safety issue.
Do not reuse shared memory segment with different port until this segment
successfully received and indexed on other side. However, segment can be used
to transfer data via the port it was sent at any time.
2017-09-18 17:35:24 +03:00
Max Romanov 838d9946ac Introducing named port message handlers to avoid misprints. 2017-09-15 20:30:34 +03:00
Max Romanov 1449e27cb4 Fixing memory leak of request parse context. 2017-09-15 20:30:29 +03:00
Max Romanov 0bec14878e Introducing application timeout. 2017-09-15 20:30:24 +03:00
Max Romanov d87a4fb642 Moving body data before headers for PHP POST.
PHP SAPI tries to read body for POST request before registering
header-specific variables. For other methods, read_post_body() called by SAPI
after variables registration.

This closes #10 issue on GitHub.
2017-09-07 16:39:31 -07:00
Max Romanov 789a101e99 Decalring clean and dist targets as .PHONY. 2017-09-07 16:38:05 -07:00
Max Romanov 999de31e25 Spreading user validation for php and go apps. 2017-09-06 08:59:18 -07:00
Max Romanov 05f93d931b Fixed go package installation instructions. 2017-09-05 22:31:57 -07:00
Max Romanov 76f3d7435f Added software installation instructions for CentOS. 2017-09-05 18:04:46 -07:00
Max Romanov f0723995a7 Fixing request id logging. 2017-09-05 15:56:37 -07:00
Max Romanov 0f9f0ca522 Fixing racing condition on app port release/request.
Application free ports is a queue (double linked list) protected with mutex.
After successfull request parsing, each router thread (1) tries to get port
from this list. If this list is empty, (2) start worker request posted to main
router thread. Another thread may release port between (1) and (2).

This fix adds an attempt to get port from free ports list at the beginning of
start worker action in main thread.
2017-09-05 15:56:35 -07:00
Max Romanov c937b8434a Double connection close attempt fix. 2017-09-05 10:22:46 -07:00
Max Romanov 1429cacd17 Using CSTRZ mapping type for go executable. 2017-09-05 10:22:45 -07:00
Max Romanov f1685e371f Introducing working_directory directive for applications. 2017-09-05 10:22:44 -07:00
Max Romanov ac7218e335 Introducing install & uninstall Makefile targets. 2017-08-31 11:42:13 -07:00
Max Romanov 6eb4a41364 Multiplexing different requests in single app port. 2017-08-31 11:42:12 -07:00
Max Romanov fc687e0508 Default value 1 for number of workers. 2017-08-31 11:42:11 -07:00
Max Romanov e06872e2f2 Avoid nxt_port_mmap_header_t redefinition warning. 2017-08-30 14:34:31 -07:00
Max Romanov d3f19d98ca Avoid nxt_go_process_t redefinition warning. 2017-08-30 12:08:29 -07:00
Max Romanov a33145d614 ListenAndServe changed to be compatible with http.ListenAndServe. 2017-08-30 11:50:33 -07:00
Max Romanov 9537821f3f Send remote address to go application. 2017-08-30 11:50:29 -07:00
Max Romanov 9791b09ce3 Fixed pid_file pattern misprint introduced in 231:6832cdee961e. 2017-08-30 11:50:16 -07:00
Max Romanov 92f3b85298 The process type enum exposed to go module. 2017-08-29 14:18:00 -07:00
Max Romanov 6de7cc8634 Fixed debug message broken in e8da77a2c293. 2017-08-29 14:17:59 -07:00
Max Romanov 5b879f0e2b Using NXT_GO variable instead of explicit go. 2017-08-29 11:37:49 -07:00
Max Romanov 52ae0e69c1 Store and use NXT_LIBRT for go module. 2017-08-29 11:33:35 -07:00
Max Romanov 73dc76b0bf Separation of module prerequisites for 'all' target in Makefile.
To avoid using sed -i.
2017-08-29 11:33:34 -07:00
Max Romanov 39a6a4c973 Request body read state implemented.
With specific timeout and buffer size settings.
2017-08-11 18:04:04 +03:00
Max Romanov e1e808bd94 Sync flag introduced for port type.
To avoid transfer mmap_msg before new mmap message.
2017-08-11 18:04:04 +03:00
Max Romanov 162afe4719 RPC: peer pid special value -1 may be used if pid is unknown. 2017-08-11 18:04:04 +03:00
Max Romanov 1b354421c3 Tiny mmap buffers completion fixed.
Small mmap buffers transferred in 'plain' mode and should be freed by sender.
2017-08-11 18:04:04 +03:00
Max Romanov b150f07e80 Added basic port error handler. 2017-08-02 13:36:29 +03:00
Max Romanov f23f985899 Runtime processes protected with mutex. 2017-08-02 13:22:07 +03:00