Date | Commit message (Collapse) |
|
This release is for compatibility with future releases of mainline ruby,
as rb_thread_blocking_region is removed in r44955 of ruby trunk
This also avoids deprecation warnings fo rb_thread_blocking_region
2.0 and 2.1.
|
|
We've finally figured out how to avoid warnings when building on
C Ruby 2.x
|
|
It'll be OK to use rb_thread_call_without_gvl when
rb_thread_blocking_region is not detectable at all.
We still use rb_thread_blocking_region for Ruby 2.0-2.1 because
rb_thread_call_without_gvl was detectable in 1.9.3, but not
usable as an internal symbol.
ref: https://bugs.ruby-lang.org/issues/9502
|
|
Thanks to Christopher Rigor for this release.
Eric Wong (2):
only define and test kgio_syssend on 1.9+
various 1.8.7 fixes
|
|
Some errors in the code reorganization caused some compatibility
code to be dropped :x
|
|
Reported-by: Christopher Rigor <crigor@gmail.com>
|
|
This adds a new kgio_syssend method for Ruby 1.9+ which behaves
like BasicSocket#send, but will not raise exceptions on EAGAIN.
Eric Wong (12):
test_poll: remove race prone test_poll_EINTR_changed test
tryopen: remove RARRAY_PTR usage in init
read_write: remove the rest of RARRAY_PTR usage
my_writev: stylistic fixes
Rakefile: kill raa_update task
avoid downsizing casts
connect: constify RSTRING-related things
set RSTRING_MODIFIED where appropriate for Rubinius
split read_write.c into {read,write,writev}.c
add kgio_syssend method to wrap send(2)
write: correct check for various blocking regions
tryopen: additional debug information for bad Errno values
Hleb Valoshka (1):
Don't use deprecated api
|
|
In case users run into the same problem in the future.
ref: http://mid.gmane.org/20131227074129.GA6381@dcvr.yhbt.net
|
|
This will allow us to support past/future Rubies without
rb_thread_io_blocking_region but still have other ways
of releasing GVL.
|
|
This behaves like kgio_trywrite on GNU/Linux, but allows extra flags
to be specified. The main purpose of this is to support use of the
MSG_MORE flag on GNU/Linux.
|
|
This helps make our code more manageable, as well as isolating
RSTRING_MODIFIED usage to files which actually need it.
writev.c can eventually be fixed to avoid modifying RSTRING
pointers, but write.c can already benefit from const RSTRING_PTR
values right away.
|
|
Not yet tested, but it makes sense to do this.
|
|
This should enforce correctness with our non-use of RSTRING_MODIFIED
in this file, hopefully allowing Rubinius to optimize better.
|
|
It's always safe to cast a 32-bit value to a 64-bit value, but
compilers can warn going the other way (because VALUE is a pointer).
Tested with `ruby -v`
ruby 2.2.0dev (2014-01-19 trunk 44646) [x86_64-linux]
which enables -Wpointer-to-int-cast
|
|
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
RAA is dead
|
|
Rename 'str' to 'ary', as that's the whole point of supporting
writev... Also, long lines need to be wrapped at 80 columns
|
|
I have not benchmarked this, but this should not make a difference
as far as performance goes. This should also allow better
performance of better GCs in Ruby 2.1.0 and Rubinius.
|
|
This is trivially non-performance-critical, and can only
help with advanced GCs in Ruby 2.1.0 and Rubinius
|
|
We haven't figured out a way to reliably test this w/o races, so lets
just remove it for now and trust it works by reading the C code.
ref: <CAAB-KcnpvcG6=OZNsBmvv440OHfCWs6-eDD7L6oD=ziCRXPHLA@mail.gmail.com>
|
|
Improved error reporting for kgio_accept/kgio_tryaccept.
Minor size reduction throughout. There are also several
test case fixes for race conditions.
Thanks to Hleb Valoshka and the Debian project for all the
help with this release!
Eric Wong (7):
check syscall returns against < 0 instead of == -1
accept: more informative exception on unknown family
test_tryopen: skip EACCES test when euid == 0
test/lib_read_write: account for larger-than-normal pipes
test_poll: avoid potentially thread-unsafe test
test_poll: preserve original trap(:USR1) handler
test_poll: be less dependent on signal handler ordering
Hleb Valoshka (4):
Change prefix of temporary sockets to prevent races
Don't dump 20M in case of failure
Create own directory for every unix socket in unit tests
Close tempfile and unlink it immediately.
|
|
When a Tempfile object is garbage collected, or when the Ruby interpreter
exits, its associated temporary file is automatically deleted. This may
lead to race condition when Tempfile is used like in these tests.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
Just spam the thread several times to force the wakeup to happen
and not be as dependent on signal handler execution ordering of
different Ruby VMs.
Tested-by: Hleb Valoshka <375gnu@gmail.com>
|
|
[ew: this avoids a TOCTOU issue for multiple test invocations]
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
The existing SIGUSR1 handler may not always be "DEFAULT",
so restore the original one.
|
|
Modifying pollset in a different pollset is thread-unsafe,
so just do that inside the signal handler as that should
fire before restarting poll().
|
|
Linux pipe buffers may use larger pages and increase the
capacity of pipes. Thus the 10000 write attempt is not
sufficient; just infinite loop until we hit :wait_writable.
|
|
This fails when the test is run as root (which may be the case
of some Ruby installations) or fakeroot (which is the case of
Debian build systems).
|
|
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
Note: this is an incomplete fix and the race can still happen.
A proper fix would involve using a temporary directory for each
test and placing the Unix socket in there.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
This may help us diagnose issues on strange OSes.
|
|
This may help us avoid errors in case of C library bugs,
and also results in smaller code:
$ ~/linux/scripts/bloat-o-meter before.so after.so
add/remove: 0/0 grow/shrink: 0/9 up/down: 0/-66 (-66)
function old new delta
s_trywrite 160 159 -1
kgio_write 160 159 -1
kgio_trywrite 160 159 -1
my_recv 616 610 -6
my_peek 616 610 -6
stream_connect 456 448 -8
my_socket 222 213 -9
my_writev 1703 1687 -16
write_check 427 409 -18
|
|
TCP Fast Open in Linux 3.7 and later is now supported
in the client via Kgio::Socket#kgio_fastopen.
This release also adds the kgio_writev and
kgio_trywritev methods, thanks to funny-falcon
|
|
In the unlikely case the Ruby Socket class implements its
own "fastopen" method, we will avoid conflicting.
|
|
This is prone to race conditions in multiprocess situations
where one process is relying on non-blocking operation while
another (likely newer process) relies on blocking operation.
Since the blocking process can always fall back to calling
rb_io_wait_readable(), use that instead and give up some
scalability for higher reliability.
Those interested in avoiding thundering herds will have to
stop/start their processes using blocking sockets (and tolerate
some downtime).
|
|
Oops :x
|
|
|
|
Server support just requires exposing one constant for
setsockopt: Kgio::TCP_FASTOPEN
Client support implements a new Kgio::Socket#fastopen method.
This new method wraps the the sendto() syscall. With TCP Fast
Open, the sendto() syscall is overloaded for stream sockets to
implement the functionality of both connect() + write()
Since it only makes sense to use _blocking_ I/O for sendto(),
TFO clients are only supported in Ruby implementations with
native threads.
|
|
This allows us to create an unconnected socket, just like
the normal Socket class it inherits from.
|
|
This will be reused for TCP fast open support.
|
|
This makes the retry logic for mismatched libc headers/kernel
versions easier to understand and follow.
|
|
errno.h is not guaranteed to be included in existing headers,
so we need to #include it to ensure errno and friends are
usable.
Thanks to stuart on the kgio mailing list for noticing
ref: <062571308.133355.1353536890665.JavaMail.sas1@172.29.251.236>
|
|
Ruby may not respond well to signals on all platforms, especially not
after fork()-ing in the face of a running pthread (timer thread on
1.9.2). SIGKILL bypasses Ruby (and all userspace) signal handling on
Debian GNU/kFreeBSD.
|
|
On FreeBSD, writing to a loopback TCP socket does not guarantee
immediate readability on the other end.
Tested on Debian GNU/kFreeBSD 6.0
|
|
This cascades test failures on a platform with questionable
signal/fork handling.
Tested on: Debian GNU/kFreeBSD 6.0
|
|
Add methods for using writev(2) syscall for sending array of string in
a single syscall. This is more efficient than concatenating strings on
Ruby side or sending them one by one.
`#kgio_trywritev` returns array of strings which are not sent to the
socket. If there were objects other than string, they could be converted
using `#to_s` method, but this is not strictly applied, cause
`#kgio_*writev` tries to write at most `sysconf(_SC_IOV_MAX)` items
at once (for Linux its value is 1024). First string of returned array
could be part of string from array, so that you should assume it is not
in consistent state.
`#kgio_writev` semantic differs a bit from `#kgio_write` in term of
buffers mutability: currently `#kgio_write` tries to follow string changes
made concurrently, but `#kgio_writev` works with array's lightweight copy.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
Define rb_thread_blocking_region as a macro for MRI 1.8
to prevent confusing output in tools such as valgrind/gdb.
|
|
Use rb_str_subseq for taking string's tail. rb_str_subseq do not allocate
additional memory in this case. And although it prevents from collecting
original string, it seems that tests wins both in performance and in memory
usage.
Use fallback to rb_str_substr on ruby1.8
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
Fix build for platforms lacking both TCP_CORK _and_ TCP_NOPUSH
There are many test case fixes and cleanups, too.
|