Commit Graph

475 Commits

Author SHA1 Message Date
Valentin Bartenev
95a9cb94d5 HTTP parser: fixed memory overflow in the collisions test.
The level hash uses the NULL value as the indicator of a free entry in a bucket.
So, inserting a NULL value breaks the hash and can lead to a bucket overflow.

In case of the collision counter, the value wasn't initialized, since it's not
needed for the purpose of checking collisions.  As a result, it might contain
any garbage from the stack and in some rare cases the value was NULL.

Now the value is initilized.
2017-12-26 17:18:57 +03:00
Valentin Bartenev
8830d73261 HTTP parser: reworked header fields handling. 2017-12-25 17:04:22 +03:00
Max Romanov
392abd03e5 Restoring apps in case of reconfiguration error. 2017-12-25 16:24:54 +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
Valentin Bartenev
67d72d46f7 HTTP parser: improved detection of corrupted request line. 2017-12-08 19:18:00 +03:00
Valentin Bartenev
20d720dfc5 HTTP parser: slightly improved readability of code.
As suggested by Igor Sysoev.
2017-12-08 19:18:00 +03:00
Valentin Bartenev
4be9774540 Fixed protocol version string handling in router. 2017-12-07 17:02:05 +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
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
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
Igor Sysoev
eb5c49ead9 Timer should be marked as it is not in tree after deletion.
This closes #64 issue on GitHub.
2017-11-27 18:50:31 +03:00
Igor Sysoev
40160621a9 Removed uncontext.h.
This removal was missed the changeset 2aad6a5fac13.
2017-11-27 18:50:18 +03:00
Igor Sysoev
80e8ce8322 A number of engine connections is decreased on connection close. 2017-11-27 17:52:28 +03:00
Andrey Zelenkov
78a77c3e38 Tests: move existing tests to "src" folder. 2017-11-21 18:55:28 +03:00
Valentin Bartenev
89a1c66dd0 Fixed crash on invalid JSON number. 2017-11-21 18:41:43 +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
Valentin Bartenev
5ed4d7b9dc Avoiding compilation on systems with no working shared memory. 2017-10-25 14:57:18 +03:00
Igor Sysoev
2837d520bb Version bump. 2017-10-20 17:48:38 +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
Valentin Bartenev
e7d81186b5 Fixed controller restarting.
Previously, stored configuration wasn't reread on controller
process restart, which resulted in segmentation fault.
2017-10-19 17:43:54 +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
Valentin Bartenev
39fd38a948 Fixed matching of empty version. 2017-10-19 17:26:56 +03:00
Igor Sysoev
0833074f30 Fixed the bug introduced in the previous changeset. 2017-10-19 17:22:33 +03:00
Igor Sysoev
3c6edead25 Added the debug option to module compatibility vector. 2017-10-18 18:05:51 +03:00
Igor Sysoev
67c066b026 Router: fixed segfault after configuration change. 2017-10-18 18:05:47 +03:00
Igor Sysoev
09ef66d39c Storing memory cache slot hint inside nxt_sockaddr_t. 2017-10-17 16:22:38 +03:00
Valentin Bartenev
1c6d4d8cff Basic validation errors. 2017-10-10 19:46:58 +03:00
Valentin Bartenev
e4bea2c75c Optimized application type handling. 2017-10-10 19:15:08 +03:00
Valentin Bartenev
93438a0d9e Fixed building with old GCC after the previous change. 2017-10-05 17:31:41 +03:00
Valentin Bartenev
096562c0b1 Improved applications versions handling. 2017-10-05 16:46:18 +03:00
Igor Sysoev
653e985463 Added Linux 4.5 EPOLLEXCLUSIVE support. 2017-10-04 15:13:22 +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