From: Rodrigo Rosenfeld Rosas Date: 2014-01-15T17:58:44-02:00 Subject: [ruby-core:59791] About unmarshallable DRb objects life-time This is a multi-part message in MIME format. --------------000301080304040307060804 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit A while ago I created a proof-of-concept that I intended to use in my project for using Java libraries from MRI through the use of JRuby and DRb: http://rosenfeld.herokuapp.com/en/articles/ruby-rails/2013-07-16-running-java-from-mri-ruby-through-drb It worked in my little tests and today I finally decided to use it in the process of migrating a Grails application to a Rails one. I couldn't find any Ruby library to edit an Excel (XLS, not XLSX) template and create a new spreadsheet so I decided to keep up with the implementation using Apache POI, but I needed to access it in the JVM somehow. At the same time I didn't want to convert the whole project to JRuby, as MRI is much faster for me to develop due to the short start-up time of the processes. When I put the concept to work with real data from my application I got tons of random errors in different places. It didn't happen if I selected only a few records to export to Excel, but if I decided to generate the spreadsheet for all (~ 1k) results, it would always fail in random places. The only explanation I could think of, and after analyzing some data I logged from the DRb server, is that that some previously objects created in the DRb server (JRuby application) were being garbage collected even if I still had a reference for them in the MRI side. I could somehow "confirm" my suspicions by implementing another interface in the DRb server where only regular marshallable Ruby data would be transmitted so that I wouldn't take the risk of having my data being garbage collected in the server-side. After this change it worked all the times I tried but I could no longer use the DRb server as a generic platform for accessing the JVM libraries. So, I'd like to confirm my theory by asking you if this is the intended behavior of the DRb protocol. I mean, suppose I get a Java object from a call to the DRb server. It's not marshallable to MRI, of course, so I only get a reference to that object in the MRI side. Then, later I want to use that object, but it no longer exists in the DRb server as it has no references in that side. Is DRb supposed to be called only with marshallable data? Or is there a way for DRb to know that a reference still exists in a DRb client and prevent the object from being GC'ed? I also read about this: http://www.ruby-doc.org/stdlib-2.1.0/libdoc/drb/rdoc/DRb/DRbUndumped.html And if you take a look at the code in my article, you'll find this: result.extend DRb::DRbUndumped if result.respond_to? :java_class But even extending the object with DRb::DRbUndumped doesn't seem to prevent it from being garbage collected by JRuby. And Charles told me he only uses the MRI implementation of DRb, so I'm asking here to try to understand if this is how it works by design. Also, in case this is a bug and DRbUndumped should mark the object as not available for being GC'ed, how would it be freed after the DRb client no longer needs it? Sorry if it got confused but I did my best to try to make it as clear as possible. Thanks in advance, Rodrigo. --------------000301080304040307060804 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit A while ago I created a proof-of-concept that I intended to use in my project for using Java libraries from MRI through the use of JRuby and DRb:

http://rosenfeld.herokuapp.com/en/articles/ruby-rails/2013-07-16-running-java-from-mri-ruby-through-drb

It worked in my little tests and today I finally decided to use it in the process of migrating a Grails application to a Rails one. I couldn't find any Ruby library to edit an Excel (XLS, not XLSX) template and create a new spreadsheet so I decided to keep up with the implementation using Apache POI, but I needed to access it in the JVM somehow.

At the same time I didn't want to convert the whole project to JRuby, as MRI is much faster for me to develop due to the short start-up time of the processes.

When I put the concept to work with real data from my application I got tons of random errors in different places. It didn't happen if I selected only a few records to export to Excel, but if I decided to generate the spreadsheet for all (~ 1k) results, it would always fail in random places.

The only explanation I could think of, and after analyzing some data I logged from the DRb server, is that that some previously objects created in the DRb server (JRuby application) were being garbage collected even if I still had a reference for them in the MRI side.

I could somehow "confirm" my suspicions by implementing another interface in the DRb server where only regular marshallable Ruby data would be transmitted so that I wouldn't take the risk of having my data being garbage collected in the server-side. After this change it worked all the times I tried but I could no longer use the DRb server as a generic platform for accessing the JVM libraries.

So, I'd like to confirm my theory by asking you if this is the intended behavior of the DRb protocol.

I mean, suppose I get a Java object from a call to the DRb server. It's not marshallable to MRI, of course, so I only get a reference to that object in the MRI side. Then, later I want to use that object, but it no longer exists in the DRb server as it has no references in that side.

Is DRb supposed to be called only with marshallable data? Or is there a way for DRb to know that a reference still exists in a DRb client and prevent the object from being GC'ed?

I also read about this:

http://www.ruby-doc.org/stdlib-2.1.0/libdoc/drb/rdoc/DRb/DRbUndumped.html

And if you take a look at the code in my article, you'll find this:

result.extend DRb::DRbUndumped if result.respond_to? :java_class

But even extending the object with DRb::DRbUndumped doesn't seem to prevent it from being garbage collected by JRuby. And Charles told me he only uses the MRI implementation of DRb, so I'm asking here to try to understand if this is how it works by design.

Also, in case this is a bug and DRbUndumped should mark the object as not available for being GC'ed, how would it be freed after the DRb client no longer needs it?

Sorry if it got confused but I did my best to try to make it as clear as possible.

Thanks in advance,
Rodrigo.

--------------000301080304040307060804--