Date | Commit message (Collapse) |
|
Currently, all memory used by Raindrops is mapped as MAP_ANONYMOUS. This
means that although Raindrops counters can be shared between processes
that have forked from each other, it is not possible to share the
counter values with another, unrelated process.
This patch adds support for backing the Raindrops mapping with a file
descriptor obtained from an IO object. The #initialize API has been
enhanced with two new keyword options:
Raindrops.new(size, io: nil, zero: false)
If an instance of IO is provided, then the underlying file descriptor
for that IO will be used to back the memory mapping Raindrops creates.
An unrelated process can then open the same file, and read the counters;
either by mmap'ing the file itself (or using Raindrops to do so), or by
making ordinary seek()/read() calls if performance is not a concern.
Note that the provided IO object _must_ implement #truncate; this is
used to set the size of the file to be right-sized for the memory
mapping that is created.
If the zero argument is passed as true, then the mapping will be zero'd
by Raindrops as part of its initialization. If it's false, then the
Raindrops counters existing in the file will be preserved. This allows
counter values to be persisted (although note that Raindrops makes no
attempt to msync the values, so they are not durable to e.g. system
crashes).
Counter values can easily be shared between processes
in-memory only without touching the disk by passing in a File on a
tmpfs as the io object.
|
|
With GC.compact in Ruby 3.x, Ruby-defined constants need to be
explicitly marked to prevent movement.
Link: https://yhbt.net/kgio-public/CAAvYYt5Z5f2rMuXO5DMpR1-6uRvu_gXKDvqcyoZ+oNcLiTH39g@mail.gmail.com/T/
|
|
The expiration for bogomips.org is coming up and I'm not
keen on paying or supporting extortionists.
Not wanting to be beholden to ICANN or any powerful
organizations, .onion sites are available to Tor users:
http://raindrops.ou63pmih66umazou.onion/
http://ou63pmih66umazou.onion/raindrops.git/
http://ou63pmih66umazou.onion/raindrops-public/
(the demo is not yet available via .onion, yet, could be a bit)
|
|
Oops, but I guess nobody uses i386 anymore...
|
|
ruby.h already pulls in extconf.h and has done so since Ruby 1.8.
|
|
Drop vestigial Ruby 1.8 bits, and start using
rb_thread_call_without_gvl on modern Rubies.
|
|
This is part of the stable API, so we shall document it for
others to use.
|
|
* origin/freebsd:
define Raindrops::TCP hash for TCP states
tcp_info: support this struct under FreeBSD
|
|
errno is in the thread-specific section and it is slightly
cheaper to read it once rather than twice. Recent versions
of mainline Ruby itself follows the same pattern.
|
|
getnameinfo is overkill for NI_NUMERICHOST + NI_NUMERICSERV usage,
and has a more complex and error-prone API than using inet_ntop
and snprintf.
|
|
FreeBSD not only uses different values than Linux for TCP
states, but different names, too. To ease writing portable code
between the OSes, do more CPP metaprogramming via extconf.rb
and define a common hash supported on both OSes.
Putting all this in a hash allows for easy dumping and mapping
in an OS-neutral way, since the actual TCP states are
OS-independent.
|
|
Of course these fields are not portable between Linux and FreeBSD,
but they should remain ABI-compatible for future versions of each OS.
Tested on FreeBSD 10.3-RELEASE i386
TCP state names will be another problem...
|
|
This provides some extra type safety if combined with other
C extensions, as well as allowing us to account for memory usage of
the HTTP parser in ObjectSpace.
This requires Ruby 1.9.3+ and has remained a stable API since
then. This will become officially supported when Ruby 2.3.0 is
released later this month.
This API has only been documented in doc/extension.rdoc (formerly
README.EXT) in the Ruby source tree since April 2015, r50318
|
|
While #get! is the same as the #initialize method,
the former is public and called explicitly by folks
wishing to reduce allocation overhead.
|
|
Defining the "Raindrops" class explicitly helps RDoc find
subclasses for documentation, and ought to reduce the binary
size slightly due to the removal of rb_intern calls.
Furthermore, use "Socket" to ensure the base class for
Raindrops::InetDiagSocket is documented properly in RDoc.
|
|
While raindrops.bogomips.org exists, having extra subjectAltName
entries is bloating the certificate. This will make it easier
to mirror the homepage on Tor hidden services.
|
|
This helps the compiler detect bugs and
quiets down a -Wsuggest-attribute=format warning
|
|
With invalid addresses specified which give no currently-bound
address, we must avoid leaving placeholders ('true' objects)
in our results.
Clean up some shadowing "cur" while we're at it.
|
|
Neither the GCC nor libatomic_ops URLs are valid, anymore.
Update them to the latest versions and ensure the URLs themselves
are visible in documentation as links to external sites.
Additionally, the current cgit installation on bogomips.org will
soon be replaced by a CSS-free web-based viewer.
Also, correct the reference to "LGPL-2.1+" while we're at it
and add references to the nntp:// mail archives.
|
|
The linux/tcp.h header may not exist on alternative libc
implementations such as musl.
Noticed-by: Doug Forster <doug.forster@gmail.com>
|
|
POSIX and glibc 2.2+ declare the hostlen and servlen
args of getnameinfo(3) to be socklen_t, not size_t,
so favor socklen_t for those calculations.
While we're at it, nlmsg_len is u32, too, so cast it
as such to avoid the warning.
Tested on clang version 3.5-1ubuntu1 on x86-64
|
|
A reviewer may wonder why fprintf is chosen instead of rb_warn,
so make it clear we're outside of the GVL when spewing the
warning message and cannot use most rb_* functions.
|
|
Existing subscribers on librelist will need to resubscribe since
there's no published subscriber lists anywhere.
The public-inbox + mlmmj setup on bogomips.org allows posting
without subscription and offers downloadable archives via git.
The lack of rsyncable archives on librelist nowadays and
subscription-required nature of librelist are points against it.
Repliers should Cc: all recipients (using the reply-all
function of their mail client) since many readers are not
subscribed.
This project has never accepted or encouraged HTML email, but
librelist accepted it. The bogomips.org mail server is
configured to treat HTML mail as spam, so do not send HTML mail
if you expect a response.
Users who wish to subscribe may send a message to:
raindrops-public+subscribe@bogomips.org
Similarly, they may unsubscribe via:
raindrops-public+unsubscribe@bogomips.org
HTTP archives are available via:
http://bogomips.org/raindrops-public/
ssoma users may also use: git://bogomips.org/raindrops-public
(see README change)
Old messages to the librelist addresses will continue to
get routed to the new mailing list.
ref: http://public-inbox.org/
|
|
Clarify the code so memory leak alarms in reviewers eyes do not go off.
|
|
Do not define or use rb_thread_blocking_region if
rb_thread_io_blocking_region is available.
rb_thread_blocking_region is gone entirely in Ruby trunk.
|
|
Scoped ipv6 addresses are defined in rfc4007.
Ruby doesn't support them yet and it's unknown whether it will
(see http://bugs.ruby-lang.org/issues/8464).
So we just remove scope ids.
Tested with MRI and Rubinius.
|
|
RARRAY_PTR is expensive with GCs in Ruby 2.1.0dev and Rubinius, so
use rb_ary_entry for non-performance critical paths. Eventually,
RARRAY_AREF/RARRAY_ASET may be common, but for now, using
rb_ary_entry should require the least cognitive overhead for a
developer.
|
|
__sync_lock_test_and_set might not be the correct check after all,
but __sync_val_compare_and_swap probably is. At least this is
what Ruby 2.0.0 uses to check and attempt -march=i486 on.
|
|
Using an extra 4 bytes for the listener_stats should not
significantly increase space usage, and it has the side benefit
of making our code slightly smaller.
$ ~/linux/scripts/bloat-o-meter before.so after.so
add/remove: 0/0 grow/shrink: 1/2 up/down: 14/-32 (-18)
function old new delta
tcp_stats 392 406 +14
st_to_hash 195 187 -8
diag 763 739 -24
|
|
This initialization was unnecessary and avoids the following
warning with -Wmissing-braces on gcc 4.7.2-5 on Debian testing:
linux_inet_diag.c: In function ‘stats_for’:
linux_inet_diag.c:192:8: warning: missing braces around initializer [-Wmissing-braces]
linux_inet_diag.c:192:8: warning: (near initialization for ‘sa.ss’) [-Wmissing-braces]
|
|
This allows reusing existing Linux::TCP_Info objects to avoid
generating garbage.
|
|
The runnable CPUs of a process may change over the lifetime of
the process. So favor the count of configured processor count
since that is more likely to be stable.
We do not currently do not have special handling for
hot-plugging/removal of CPUs on systems that may load raindrops
in a single CPU state.
|
|
This is exported (visibly) under Ruby 1.9.3 but not
in headers, so it was causing warnings.
|
|
Attempting to test for CMPXCHG on x86 should allow this check to
fail on i386 systems. We also won't need try_run as a result,
enabling cross-compilation. The configure.in check in Ruby
1.9.3 does something similar and that's far more widely used
than raindrops is.
|
|
A non-profit TLD makes more sense for a Free Software project.
|
|
This appears to cause __BSD_VISIBLE to not be defined,
which is required for MAP_ANON to be visible in
sys/mman.h
Thanks for Aleksandar Simic for the hint and Troex Nevelin
for the bug report!
|
|
No need to cast when C has handy unions. Maybe the compiler
will be able to make better optimization choices here, but
at least it'll be less noisy.
|
|
We can't even pull in linux/*.h headers to check
for TCP_INFO.
|
|
dir_config may be used to build for libatomic_ops. The
previous use of dir_config was from back when I didn't
understand mkmf.
This means you can now use:
gem install raindrops -- --with-atomic_ops-dir=/usr/local
If you libatomic_ops library was installed in /usr/local
instead of /usr
|
|
Seems to breaks under newer libc headers (on Debian sid).
|
|
We no longer use it.
|
|
|
|
Very few programs can take advantage of inheriting FDs
across exec() boundaries, and inet_diag sockets have no
reason to be used in this way.
|
|
It can detect cross-thread close() calls
|
|
Oops :x This was totally broken with the all-listener
filter.
|
|
|
|
getaddrinfo() needs to get a list of available interfaces
from the kernel with every single call (since ipv6 could've
been modprobed), so it's a waste of syscalls.
|
|
No need to waste resources on creating/destroying
a socket.
|
|
I thought my compiler would be smarter :<
|
|
The way we dump, we dump it all, it seems.
|