Project

General

Profile

Actions

Bug #15711

closed

Remove use of _id2ref from DRb

Added by headius (Charles Nutter) about 5 years ago. Updated almost 4 years ago.

Status:
Closed
Target version:
-

Description

This issue relates to https://bugs.ruby-lang.org/issues/15408

DRb uses _idref internally to implement a weak map, and this issue seeks to replace that code with an implementation that does not use _id2ref.

We will be deprecating ObjectSpace._id2ref in the near future since it fails to work like people expect (when implemented as a pointer address) or adds memory and invocation overhead to object_id.

An initial patch for this is provided by JRuby, which implements object_id using a monotonically-increasing value, and only allows _id2ref use with a command line flag.

https://github.com/ruby/ruby/compare/trunk...jruby:jruby-ruby_2_6_0#diff-e979bf2f831d9826629559b8628809e9

This implementation uses the stdlib weakref to implement a simple weak map, and it would be suitable as an implementation for now. However there's some inefficiency here because it has to periodically "clean" the hash of vacated references by scanning all entries.

There are two more efficient implementations that require additional work:

Alternate 1: Use ObjectSpace::WeakMap, which is an opaque VM-supported implementation of a weak Hash. Unfortunately I don't think WeakMap has ever been blessed as a public API, and since we're rapidly moving standard libraries to gems, it would not be appropriate to use an internal API. So, we can either make WeakMap an official part of the public standard API, or do alternate 2.

Alternate 2: Add weak reference queues to the weakref API, so users can implement their own efficient weak maps. Some of this has been discussed (at great length) in https://bugs.ruby-lang.org/issues/4168, and the JRuby team has supported the weaklink gem for many years (which provides a WeakRef+RefQueue implementation for JRuby).

The original patch works well for small numbers of remoted objects.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0