# DRb object mutation issues

**URL:** <https://www.ruby-forum.com/t/drb-object-mutation-issues/109138>\
**Category:** Ruby\
**Created:** [July 11, 2007, 8:17pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138 "2007-07-11T20:17:11Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 11, 2007, 8:17pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/1 "2007-07-11T20:17:11Z")

</div>

# file 1

require ‘drb/drb’  
require ‘thread’  
DRb.start\_service(“druby://:1234”, Hash.new.extend(DRbUndumped))  
DRb.thread.join

# EOF

# file 2

require ‘drb/drb’  
d = DRbObject.new\_with\_uri(“druby://:1234”)  
d[0] = ‘zero’  
d[0] #=\> “zero”  
d[0].slice!(0, 1)  
d[0] #=\> “zero”

# file 3

h = Hash.new  
h[0] = ‘zero’  
h[0].slice!(0, 1)  
h[0] #=\> “ero”

# how can I change the state of the distributed hash’s values?

---

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 11, 2007, 9:04pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/2 "2007-07-11T21:04:18Z")

</div>

Nwallins wrote:

> d = DRbObject.new\_with\_uri(“druby://:1234”)
> 
> # how can I change the state of the distributed hash’s values?

Some options:

1. make the values DRbUndumped, too.

2. use non-destructive methods on the values:

3. define a method on your front object that handles everything at  
server side, so the client says this:

---

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 12, 2007, 7:57pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/3 "2007-07-12T19:57:59Z")

</div>

On Jul 11, 3:02 pm, Joel VanderWerf [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > d = DRbObject.new\_with\_uri(“druby://:1234”)
> 
> 1. define a method on your front object that handles everything at  
> server side, so the client says this:
> 
> –  
> vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Joel,

thanks for the response.

(1) is not viable, as you cannot make objects or classes undumpable  
from the client  
(2) does not address the issue – to mutate the value  
(3) is interesting, but violates the architecture that my simplified  
example is distilled from

I’m still wondering if the demonstrated behavior is a bug or a  
feature. I’m leaning towards the former 😉

- Rick

---

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 12, 2007, 8:04pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/4 "2007-07-12T20:04:01Z")

</div>

On Jul 12, 1:50 pm, Nwallins [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > > DRb.start\_service(“druby://:1234”, Hash.new.extend(DRbUndumped))
> 
> > > 1. make the values DRbUndumped, too.
> 
> > (3) is interesting, but violates the architecture that my simplified  
> > require ‘drb/drb’  
> > d = DRbObject.new\_with\_uri(“druby://:1234”)  
> > d[0] = ‘zero’.extend(DRbUndumped)
> 
> # DRb::DRbConnError: DRb::DRbServerNotFound
> 
> # from /usr/lib/ruby/1.8/drb/drb.rb:1650:in `current\_server’
> 
> - Rick

There is also this approach, but it still fails:

> > d[0].extend(DRbUndumped)  
> > =\> “zero”  
> > d[0].slice!(0,1)  
> > =\> “z”  
> > d[0]  
> > =\> “zero”

- Rick

---

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 12, 2007, 8:03pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/5 "2007-07-12T20:03:01Z")

</div>

On Jul 12, 1:46 pm, Nwallins [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > # EOF
> > > 
> > > h = Hash.new
> > 
> > 1. use non-destructive methods on the values:  
> > vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
> 
> I’m still wondering if the demonstrated behavior is a bug or a  
> feature. I’m leaning towards the former 😉
> 
> - Rick

Regarding my comment for (1), I presume you mean something like this:

# file 2

require ‘drb/drb’  
d = DRbObject.new\_with\_uri(“druby://:1234”)  
d[0] = ‘zero’.extend(DRbUndumped)

# DRb::DRbConnError: DRb::DRbServerNotFound

# from /usr/lib/ruby/1.8/drb/drb.rb:1650:in `current\_server’

- Rick

---

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 12, 2007, 8:46pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/6 "2007-07-12T20:46:07Z")

</div>

Nwallins wrote:

> > 1. make the values DRbUndumped, too.  
> > …  
> > (1) is not viable, as you cannot make objects or classes undumpable  
> > from the client

What about extend-ing the hash to make its values undumped as soon as  
they are assigned? (Or subclass Hash to do this.)

---

<div class="post-metadata">

**Author:** ![Nwallins](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e0b2c6/32.png) [@Nwallins](https://www.ruby-forum.com/u/Nwallins)\
**Post date:** [July 12, 2007, 10:14pm UTC](https://www.ruby-forum.com/t/drb-object-mutation-issues/109138/7 "2007-07-12T22:14:17Z")

</div>

On Jul 11, 2007, at 12:15 PM, Nwallins wrote:

> d = DRbObject.new\_with\_uri(“druby://:1234”)
> 
> # how can I change the state of the distributed hash’s values?

cfp:~ \> ruby a.rb server &  
[1] 2778

cfp:~ \> ruby a.rb client  
316250  
“druby://8-159.boulder.noaa.gov:1234”  
zero  
#DRb::DRbObject:0x986ac  
ero  
#DRb::DRbObject:0x96014

cfp:~ \> cat a.rb  
#! /usr/bin/env ruby  
require ‘drb/drb’  
require ‘thread’

class Table  
def initialize  
extend DRbUndumped  
@table = {}  
end  
def [] k  
@table[k.to\_s]  
end  
def []= k, v  
v.extend DRbUndumped  
@table[k.to\_s] = v  
end  
class ::Object  
def Table(\*a, &b) Table.new(\*a, &b) end  
end  
end

mode = ARGV.shift || ‘server’  
case mode  
when ‘server’  
DRb.start\_service “druby://:1234”, Table()  
DRb.thread.join

when ‘client’  
d = DRbObject.new\_with\_uri “druby://:1234”

```
 # this marshals data across the wire to server, never to come

```

back as  
# anything other that a remote object  
d[0] = ‘zero’

```
 # the repercusions are that you can only call remote methods on the
 # object, including to_s, inspect, etc which all act as a drb

```

object  
p d[0].\_\_drbref  
p d[0].\_\_drburi  
puts d[0].downcase  
puts d[0]

```
 # on the other hand the client may detruct object on the server
 d[0].slice!(0, 1)
 puts d[0].downcase
 puts d[0]

```

end

-a
