Commit Graph
100 Commits
Author SHA1 Message Date
Max Romanov efbcd517fc Checking sendfile() availability in configure.
Removing SF_NODISKIO flag for FreeBSD sendfile() check because it
is not used yet and to support DragonFlyBSD.

This closes #414 issue on GitHub.
2020-03-17 14:44:06 +03:00
Max Romanov 5296be0b82 Using disk file to store large request body.
This closes #386 on GitHub.
2020-03-12 17:54:29 +03:00
Max Romanov 08b65721e2 Moving request memory pool retain call after RPC data allocation.
If the call is done only after a successful RPC data allocation, its
corresponding release call is not missed, which avoids a potential leak.
2020-03-12 17:54:24 +03:00
Max Romanov 0b5aabfc3f Checking Content-Length value right after header parse.
The check was moved from the request body read stage.
2020-03-12 17:54:19 +03:00
Max Romanov f3e6726098 Tests: added Python input readline and iterator tests. 2020-03-12 17:54:15 +03:00
Max Romanov 7c4db34b88 Python: implementing input readline and line iterator. 2020-03-12 17:54:11 +03:00
Max Romanov 2454dfe876 Introducing readline function in libunit.
Ruby and Java modules now use this function instead of own
implementations.
2020-03-12 17:54:05 +03:00
Max Romanov 9e295fa314 Fixing request_app_link reference counting for delayed requests.
Router built with debug may stop with assertion during stalled requests
re-schedule.  This was caused by missing reference counting increment
before nxt_router_port_select() call.
2020-03-03 18:28:26 +03:00
Max Romanov c74f3a6c56 Java: fixing Spring applications start.
This closes #403 issue on GitHub.
2020-03-03 18:28:20 +03:00
Max Romanov 004ab48a9e Node.js: fixing x86 warning about the signed/unsigned comparison. 2020-03-03 18:28:16 +03:00
Max Romanov 81b39d0b35 Tests: fixing Python 3.8.1 errors on Mac.
- "Can't pickle local object ..."
- "if __name__ == '__main__':" pattern required for multiprocessing
2020-02-04 11:39:34 +03:00
Max Romanov 7c38650cd1 Removing duplicate macro definitions.
This issue was introduced in 2c7f79bf0a1f.
2020-02-04 11:39:16 +03:00
Max Romanov 8eba2e5c3d Initializing local buffer ctx_impl field for correct release.
Uninitialized ctx_impl field may cause crash in application process.

To reproduce the issue, need to trigger shared memory buffer send error on
application side.  In our case, send error caused by router process crash.

This issue was introduced in 2c7f79bf0a1f.
2020-02-03 11:21:21 +03:00
Max Romanov 7ea9ebc55a Fixed req_app_link reference counting on cancellation.
Re-scheduled req_app_link structures should have use_count exactly equal
to the number of references from the application and port list.  However,
there's one extra usage decrement that occurs after the req_app_link is
created because the use_count is initialised as 1.

This patch removes all excess instances of the usage decrement that caused
preliminary req_app_link release and router process crash.

To reproduce the issue need to cause request rescheduling between 2 app
processes.

This issue was introduced in 61e9f23a566d.
2020-02-03 11:20:59 +03:00
Max Romanov 8c0f2cebf5 Storing pointer to next buffer in chain before free the buffer.
This is required to avoid dereference of freed memory.

Found by Coverity (CID 353372).
2020-02-03 11:14:14 +03:00
Max Romanov 51120e06e3 Added missing stream argument to error message.
Found by Coverity (CID 353386).
2020-02-03 11:14:06 +03:00
Max Romanov 224549a578 Freeing memory allocated for engine structure in case of error.
Found by Coverity (CID 353389).
2020-02-03 11:13:55 +03:00
Max Romanov 4024b18bcc Go: adding main configure CFLAGS and LDFLAGS to module build flags.
This makes ASAN buildbot workers to work out-of-the-box.
2020-01-28 19:20:46 +03:00
Max Romanov 1451090d85 Node.js: suppress compilation warning. 2020-01-28 17:06:57 +03:00
Max Romanov 4e0a2002fe Java: fixing configure errors reporting. 2020-01-28 17:03:19 +03:00
Max Romanov 1949be644c Java: introducing SHA512 sum validation for external JARs. 2020-01-28 17:02:51 +03:00
Max Romanov 04bf6457c6 Java: fixing maven repository URL.
It is required to use https scheme and different host to download
packages from maven repository.
2020-01-28 17:01:21 +03:00
Max Romanov a58ca623cd Packages: added curl dependency to fetch Java archives. 2020-01-28 17:00:28 +03:00
Max Romanov 2f8b243fa4 Ruby: changing callback functions prototype for v2.7.
This closes #371 issue on GitHub.
2020-01-28 16:59:12 +03:00
Max Romanov 693a458b4e Go: changing import name for "unit.nginx.org/go".
This patch includes packaging changes - update unit-go installation
directory.
2019-12-25 20:00:32 +03:00
Max Romanov 26ee4cb6c8 Go: introducing SHM_ACK observer.
Each request processed in a separate goroutine.  In case of OOSM state,
during response write, request goroutine blocks on channel which waits
event from main thread about SHM_ACK message from router.
2019-12-24 18:04:21 +03:00
Max Romanov 763bdff401 Node.js: implementing output message drain using SHM_ACK feature.
ServerResponse.write() method tries to write data buffer using libunit
and stores buffers to write in a Server-wide output queue, which is
processed in response to SHM_ACK message from router.

As a side effect 'drain' event implemented and socket.writable flag
reflect current state.
2019-12-24 18:04:17 +03:00
Max Romanov df7caf4650 Introducing port messages to notify about out of shared memory.
- 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-12-24 18:04:13 +03:00
Max Romanov 64f649f990 Adding "limits/shm" configuration validation and parsing. 2019-12-24 18:04:09 +03:00
Max Romanov 429c5a1c54 Renaming nxt_unit_mmap_buf_remove to nxt_unit_mmap_buf_unlink.
The function unchains the buffer from the buffer's linked list.
2019-12-24 18:04:05 +03:00
Max Romanov 806b3945fe Introducing write tail reference to avoid buffer chain iteration. 2019-12-24 18:04:00 +03:00
Max Romanov faeb73a65e Using non-shared memory buffers for small messages.
Current shared memory buffer implementation uses fixed-size memory blocks,
allocating at least 16384 bytes.  When application sends data in a large
number of small chunks, it makes sense to buffer them or use plain
memory buffers to improve performance and reduce memory footprint.

This patch introduces minimum size limit (1024 bytes) for shared
memory buffers.
2019-12-24 18:03:56 +03:00
Max Romanov f5a2984acf Go: moving source files to the root of the project.
This patch includes packaging changes related to files move.
2019-12-24 17:59:52 +03:00
Max Romanov a427ecd4c5 Go: installing go module for tests into build directory. 2019-12-24 17:59:48 +03:00
Max Romanov 3d712a7078 Packages: making unit-go architecture independent.
To support Go modules, the unit-go module should be platform independent.
All platform-dependent logic is moved to libunit, so the unit-dev package
should be installed before building unit-go.
2019-12-24 17:59:44 +03:00
Max Romanov 823f658c77 Go: linking against libunit. 2019-12-24 17:59:37 +03:00
Max Romanov 55a368e505 Java: fixing racing condition in external JAR download.
Temporary file name with configure process PID used to download
JAR from external repository.  Then file renamed using command 'mv'.

The issue reproduced in clean environment when 2 or more concurrent builds
started.
2019-12-09 18:17:16 +03:00
Max Romanov 4eecf1cb6a Refactoring reference counting of req_app_link.
The reason for the change is that the req_app_link reference count
was incorrect if the application crashed at start; in this case,
the nxt_request_app_link_update_peer() function was never called.

This closes #332 issue on GitHub.
2019-11-26 17:14:53 +03:00
Max Romanov bdd96bc9ed Ruby: fixing initialization sequence.
There was a change (ruby/ruby@6c70fed) in Ruby 2.6 that moved
RUBY_DESCRIPTION global constant definition out of Init_version().
Unit initialized Ruby incorrectly, so the constant was not defined.

This closes #330 issue on GitHub.
2019-11-13 15:53:49 +03:00
Max Romanov f2610d2160 Fixing libunit 'off by 2' issue in library.
Name and value in each header are 0-terminated, so additional 2 bytes
should be allocated for them.  There were several attempts to add these
2 bytes to headers in language modules, but some modules weren't updated.
Also, adding these 2 bytes is specific to the implementation which may be
changed later, so extending this mechanics to modules may cause errors.
2019-11-11 18:04:17 +03:00
Max Romanov 65b03a14a7 Allocating process init struct from runtime memory pool.
This avoids memory leak reports from the address sanitizer.
2019-10-29 15:33:45 +03:00
Max Romanov ad518ae6c4 Python: fixing Python 3.8 build with clang.
Python 3.8 has 'tp_print' field in PyTypeObject struct.  This field is
attributed as deprecated.  So, clang generates warning (which is turned to
error) as a result of initializing this field.  From the other hand, it is
impossible to omit this field in positional initialization.  The solution
is to use designated initializer.

Silencing usage message during configure python.

This is related to #331 issue on GitHub.
2019-10-23 14:04:29 +03:00
Max Romanov 2dbfd7c35e Fixing process crash in case of module load error.
This is related to #330 issue on GitHub.
2019-10-22 16:14:02 +03:00
Max Romanov 8df4468014 Fixing idle connection close function.
There was a typo: nxt_queue_head() used instead of nxt_queue_first() in
connection iteration loop.  This prevents idle connection close on quit.

This closes #334 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-10-22 16:04:56 +03:00
Max Romanov e54f5f3dc8 Python: fixing build for Python 3.8.
Thanks to tonyafanasyev.
This is related to #331 issue on GitHub.
2019-10-22 16:04:30 +03:00
Max Romanov 9b4e45cafc Fixed "make tests" build without preceding "make".
Currently almost all Unit object files depends on generated nxt_version.h.
This patch adds missing dependence and fixes running make with multiple
jobs.

This closes #318 issue on GitHub.
2019-10-02 19:11:10 +03:00
Max Romanov 2eb6f35ef5 Go: fixing header buffer size calculation.
Header names and values are stored 0-terminated for ease of use in different
languages, so magic number 2 should be added to each name-value pair size.
2019-10-01 19:53:18 +03:00
Max Romanov f2b280aa0c Fixed exiting if a signal arrives during discovery.
When Unit starts, the main process waits for module discovery message for a
while.  If a QUIT signal arrives at this time, the router and controller
processes created by main and Unit stay running.  Also, the main process
doesn't stop them after the second QUIT signal is received in this case.
2019-09-30 16:39:08 +03:00
Max Romanov 6346e641ee Releasing WebSocket frame in case of buffer allocation failure.
Found by Coverity (CID 349456).
2019-09-19 16:28:03 +03:00
Max Romanov 1fac43eebe Fixing master process crash after failed fork.
This closes #312 issue on GitHub.
2019-09-18 22:45:30 +03:00
Max Romanov ab40ce3757 Go: removing nxt_main.h usage.
One small step to Go modules support.
2019-09-18 18:31:29 +03:00
Max Romanov a216b15e99 Fixing request release order to avoid crashes on exit.
Each request references the router process structure that owns all memory
maps.  The process structure has a reference counter; each request increases
the counter to lock the structure in memory until request processing ends.
Incoming and outgoing buffers reference memory maps that the process owns,
so the process structure should be released only when all buffers are
released to avoid invalid memory access and a crash.

This describes the libunit library mechanism used for application processes.

The background of this issue is as follows:

The issue was found on buildbot when the router crashed during Java
websocket tests.  The Java application receives a notification from the
master process; when the notification is processed, libunit deletes the
process structure from its process hash and decrements the use counter;
however, active websocket connections maintain their use counts on the
process structure.  After that, when the master process is stopping the
application, libunit releases active websocket connections.  At this point,
it's important to release the connections' memory buffers before the
corresponding process structure and all shared memory segments are released.
2019-09-18 18:31:22 +03:00
Max Romanov 84e4a6437f Go: do not store pointer to Go object.
To pass Go object references to C and back we use hack with casting to
unsafe and then to uintptr.  However, we should not store such references
because Go not guaratnee it will be available by the same address.
Introducing map with integer key helps to avoid dereference stored address.

This closes #253 and #309 issues on GitHub.
2019-09-18 18:31:14 +03:00
Max Romanov 4ea9ed309e Reducing number of warning messages.
One alert per failed allocation is enough.
2019-09-18 18:31:06 +03:00
Max Romanov 9bacd21405 Protecting context structures with mutex.
By design, Unit context is created for the thread which reads messages from
the router.  However, Go request handlers are called in a separate goroutine
that may be executed in a different thread.  To avoid a racing condition,
access to lists of free structures in the context should be serialized.  This
patch should fix random crashes in Go applications under high load.

This is related to #253 and #309 issues on GitHub.
2019-09-18 18:30:58 +03:00
Max Romanov 2a6af1d214 Added "extern" to nxt_http_fields_hash_proto to avoid link issues. 2019-09-09 17:39:24 +03:00
Max Romanov 2b8cab1e24 Java: introducing websocket support. 2019-09-05 15:27:32 +03:00
Max Romanov daadc2e00b Making request state handler calls more consistent. 2019-09-02 18:27:08 +03:00
Max Romanov 7053a35a60 Fixed WebSocket implementation that was broken on some systems.
The "nxt_http_websocket" request state, defined in "nxt_http_websocket.c",
is used in "nxt_router.c" and must be linked with external symbol declared
in "nxt_router.c".

Due to the missing "extern" keyword, building Unit with some linkers
(notably gold and LLD) caused WebSocket connections to get stuck or even
crash the router process.
2019-08-30 00:07:54 +03:00
Max Romanov 5d4426ed65 Installing libunit files for websocket support. 2019-08-23 01:19:57 +03:00
Max Romanov e291841b33 Node.js: introducing websocket support. 2019-08-20 16:32:05 +03:00
Max Romanov e501c74ddc Introducing websocket support in router and libunit. 2019-08-20 16:31:53 +03:00
Max Romanov 686f5b1436 Changing the sequence of body send execution.
Request state ready_handler required for further websocket events processing.
It is not required for regular response transferring.
2019-08-16 14:55:18 +03:00
Max Romanov 29911538ea Improving response header fields processing.
Fields are filtered one by one before being added to fields list.
This avoids adding and then skipping connection-specific fields.
2019-08-16 00:56:38 +03:00
Max Romanov caea9d3c07 Fixing multi-thread port write racing conditions. 2019-08-16 00:48:11 +03:00
Max Romanov 1b095ff417 Renaming supplemental request structures in router.
- nxt_req_app_link_t  -> nxt_request_app_link_t
- nxt_req_conn_link_t -> nxt_request_rpc_data_t

Corresponding abbreviated field names also changed:
- ra -> req_app_link
- rc -> req_rpc_data
2019-08-14 23:59:46 +03:00
Max Romanov 4bef4256c0 Java: implementing multipart message support.
This closes #265 issue on GitHub.
2019-08-14 15:24:41 +03:00
Max Romanov dcf46a63eb Exiting application process in case of pre_init stage error. 2019-07-17 16:57:43 +03:00
Max Romanov aab235c4dc Java: fixing realpath error message. 2019-07-17 10:52:48 +03:00
Max Romanov cc578b2e63 PHP: added PATH_INFO support. 2019-07-05 21:10:01 +03:00
Max Romanov b1ee073707 PHP: removing excessive debug message. 2019-06-28 12:20:00 +03:00
Max Romanov ce17fef73d Fixed application crash handling in router.
Before this fix, request in router may hang until timeout expired if
application crashed during request processing.
2019-06-28 12:19:54 +03:00
Max Romanov 9ea4be7e4e Fixing allocation alignment for port fragments.
All allocated blocks for lvlhash required to be aligned because lower
address bits used for various extra information.  Using unaligned blocks
may cause invalid memory aceess.

This was issue found on buildbot running large configuration tests.
2019-06-28 12:19:48 +03:00
Max Romanov 3ceec5f4d2 Java: adding Content-Type response header for static files. 2019-06-28 12:19:40 +03:00
Max Romanov 24400b3a5d Node.js: packaging new nxt_napi.h.
File nxt_napi.h (introduced in 53533ba0097c) added into packaged files
list.

This closes #261 issue on GitHub.
2019-06-17 18:16:06 +03:00
Max Romanov 6eba5ddd42 Java: added java module in configure help. 2019-05-30 15:02:10 +03:00
Max Romanov 8241539734 Java: fixing typo in context initialization. 2019-05-30 15:02:09 +03:00
Max Romanov 6a2928b4bf Java: fixing request scheme using 'tls' flag. 2019-05-30 15:02:07 +03:00
Max Romanov c6e96647a1 Node.js: using low-case header names as key in req.headers.
Node.js modules (body-parser, row-body) search low-cased names
('content-length', 'content-type' etc.) to properly assemble request body.

This closes #246 issue on GitHub.
2019-04-17 19:15:41 +03:00
Max Romanov 6241099db2 Removing unused variables and assignments.
Warnings introduced in 53533ba0097c commit.
2019-04-02 16:07:49 +03:00
Max Romanov 56101e47ee Adding 'connection' to request as an alias to 'socket'.
Adding actual 'remoteAddress' and 'localAddress' into socket object.

This closes #232 issue on GitHub.
2019-04-01 16:40:49 +03:00
Max Romanov 8557cb3660 Introducing close event to notify about server stop.
This closes #236 on GitHub.
Thanks to 0xcdcdcdcd.
2019-04-01 16:40:40 +03:00
Max Romanov aca42de18a Adding syntax sugar.
With exceptions and overloads.
2019-04-01 16:40:33 +03:00
Max Romanov b96e5fd848 Turning off port read event state after main process fork.
Master port stores two file descriptors and works as a read port on the master
process side.  After a fork, the port switches into write mode and the read
socket closes, but the same event structure is used for the write socket.
However, the inherited structure remained in read state, telling the epoll
engine to use MOD operation instead of ADD.  The patch resets read event
state, so the engine may write using proper ADD operation.
2019-03-25 14:49:28 +03:00
Max Romanov 6c694d4b47 Ignoring EPERM error when changing application process uid/gid.
This closes #228 issue on GitHub.
2019-03-22 15:32:58 +03:00
Max Romanov 1b7514dca3 Destroying pool in case of error.
This closes #233 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-03-22 15:32:40 +03:00
Max Romanov 687f83fbd0 Style fixing.
This closes #233 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-03-22 15:32:35 +03:00
Max Romanov 452ce0789e Adjusting request schema value according to connection tls state.
This closes #223 issue on GitHub.
2019-03-21 13:55:57 +03:00
Max Romanov 39e147a858 Removing unused local variable. 2019-03-18 19:55:39 +03:00
Max Romanov f49379215a Setting request error flag in error handler.
Absence of this flag is the reason of memory leak in case when client
disconnected before receiving all response data.
2019-03-18 19:55:34 +03:00
Max Romanov e1c4568680 Introducing one more large config test, but without sockets. 2019-03-05 15:38:52 +03:00
Max Romanov ddd2e8cc36 Improving port message fragment recognition.
This is required to assemble fragmented messages correctly.  Stream
identifier is unique only for messages generated within a process, but
the (stream, pid) pair should be enough to avoid collisions.  Adding
reply_port seems redundant because it's enough to add stream to a pid.

This closes #199 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-03-05 15:38:51 +03:00
Max Romanov 42b66ec654 Fixing EAGAIN processing for port message send.
Sending large plain (exceeding port's max_size, not in shared memory) messages
causes message fragmentation.  First message fragment is sent successfully,
but the next fragment may fail with the EAGAIN error.  In this case, the
message has to be pushed back to queue head for additional processing.

Related to #167 issue on GitHub.
2019-03-05 15:38:50 +03:00
Max Romanov 0ab83370cb Handling ENOBUFS error same was as EAGAIN.
Unlike EAGAIN, ENOBUFS returned on OSX when trying to send many relatively
small (64 bytes) fragments.

Found during investigation of #167 issue on GitHub.
2019-03-05 15:38:49 +03:00
Max Romanov aedb999fe1 Including port message header into message size limit.
Before this fix, large plain message (i.e. configuration) send may fail
with the 'Message too big' error, because internal fragmentation
implementation does not account for 16 byte message header.

This closes #167 issue on GitHub.
2019-03-05 15:38:48 +03:00
Max Romanov afda14d1f2 Preserving message 'share' field when pushing to queue.
As far as I understand, this field is important to control the number of
buffers send in a single write attempt.  Furthermore, having uninitialized
field is always bad.

This closes #204 issue on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-02-28 18:03:21 +03:00
Max Romanov ec7319d32c Various libunit fixes.
This patch contains various logging improvements and bugfixes found
during Java module development.
2019-02-28 15:52:36 +03:00
Max Romanov b92dc6036c Removing app data debug message.
This message produces too many noise in log and complicates analysis.
2019-02-28 14:37:39 +03:00
Max Romanov 0c917b4d34 Reusing fragmented message buffers.
Fragmented message non-mmap buffer chain not freed nor reused before
this fix.

This closes #206 on GitHub.
Thanks to 洪志道 (Hong Zhi Dao).
2019-02-28 13:39:31 +03:00
Max Romanov bd1eb7b502 RPC error message size fixed.
In case of RPC error, special error message passed to handler.
Field 'size' expected to be 0 in this case because in contains fake
empty buffer.
2019-02-25 18:09:37 +03:00