Abel Muiño

home

Ruby se muere

01 Feb 2010

Al menos, se muere cuando le pido que trabaje duro para mi...

/Users/amuino/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:1650: [BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [universal-darwin9.0]

Abort trap

Lo mejor es que es un error semi-aleatorio: no ocurre siempre en la misma lí­nea ni fichero ni gema... pero ocurre siempre en algún momento de un proceso batch de varias horas.

Es muy posible que no sea culpa de ruby (he probado tanto con la versión instalada por Apple como con Darwin Ports) si  no del adaptador de MySQL... no lo sé.

En cualquier caso... yo ya me habí­a olvidado de todos estos bus error y segmentation fault hace muchos años, al usar Java (aunque sí­, también he visto alguna JVM morirse...).

Así­ que mi siguiente intento ha sido usar JRuby. Instalo el adaptador activerecord jdbc para mysql, un nuevo entorno y a volar. Sencillo ¿no?

Lamentablemente, tengo una dependencia que utiliza la gema libxml-ruby, que necesita una extensión nativa (¿extensiones nativas? ¿aplicaciones interpretadas no portables? ¿no hemos dado un paso atrás?)... algo que jruby no permite.

Por suerte, el proceso batch no usa libxml y puedo desactivarlo al usar jruby:

config.gem 'libxml-ruby', :lib=>"xml/libxml", :version => '1.1.3' unless RUBY_PLATFORM =~ /java/

Sólo queda configurar el acceso a mysql mediante jdbc. Es importante instalar la gema desde linea de comandos.

jruby -S gem install activerecord-jdbcmysql-adapter

Algo que me ha confundido durante horas han sido los errores del tipo:

Missing these required gems:   activerecord-jdbcmysql-adapter  = 0.9.2

... que son causados por declarar la dependencia en environment.rb. No lo hagas :-)

Y el toque final es añadir la compatibilidad del adaptador jdbc con la configuración mysql "de toda la vida" para no tener que tocar el database.yml ni crear un nuevo environment.

jruby script/generate jdbc

(Esto sólo activa el adaptador jdbc cuando se ejecuta sobre jruby).

Han sido unas cuantas horas de experimentos, búsquedas en google y frustración... ¡que espero que le ahorren tiempo a alguien!