oracle / truffleruby

A high performance implementation of the Ruby programming language, built on GraalVM.
https://www.graalvm.org/ruby/
Other
3.02k stars 185 forks source link

Rails: RuntimeError (Digest::Base cannot be directly inherited in Ruby) on request #2677

Closed Tiikara closed 2 years ago

Tiikara commented 2 years ago

OS: Ubuntu 20.04 Arch: amd64 Truffleruby installed with:

rvm install truffleruby-22.1.0

Rails started with:

export RAILS_ENV=production
rails s

Gemfile (installed with 'bundle install' without Gemfile.lock):

source 'http://rubygems.org'

gem 'rails', '~> 7.0.3'
gem 'nokogiri'
gem 'sprockets', '~> 3'
gem 'goldiloader'
gem 'derailed', require: false
gem 'sys-proctable', require: false
gem 'oj'
gem 'pg', '~> 1.0'
gem 'que'
gem 'sidekiq'
gem 'gelf'
gem 'lograge'
gem 'autoprefixer-rails', require: false
gem 'coffee-rails', require: false
gem 'minitest', require: false
gem 'puma', require: false
gem 'sass-rails', require: false
gem 'slim', require: false
gem 'slim-rails', require: false
gem 'uglifier', require: false
gem 'concurrent-ruby', require: 'concurrent'
gem 'concurrent-ruby-ext'
gem 'bootstrap_form', '~> 2.7'
gem 'bootstrap-sass'
gem 'font-awesome-sass', '~> 4'
gem 'composite_primary_keys', github: 'composite-primary-keys/composite_primary_keys', ref: 'bc6850e0b26066701de1d32ec46e55c3bca56928'
gem 'active_model_serializers'
gem 'net-ftp'
gem 'responders'
gem 'ancestry'
gem 'ejs'
gem 'omniauth', '~> 2.1'
gem 'omniauth-rails_csrf_protection'
gem 'figaro'
gem 'omniauth-oauth2'
gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'
gem 'mini_magick'
gem 'webp-ffi'
gem 'bcrypt'
gem 'cancancan'
gem 'devise'
gem 'devise-jwt'
gem 'seven_zip_ruby'
gem 'roo', github: 'roo-rb/roo', ref: '868d4ea419cf393c9d8832838d96c82e47116d2f'
gem 'roo-xls'
gem 'mail'
gem 'rubyzip'
gem 'rufus-scheduler'
gem 'sanitize'
gem 'telegram-bot-ruby'
gem 'builder'
gem 'redis', '~> 4.2.5'
gem 'ru_propisju'
gem 'whenever', require: false
gem 'laximo'
gem 'petrovich', '~> 1.0'
gem 'savon', '~> 2.0'
gem 'wkhtmltopdf-binary'
gem 'dry-configurable', '0.9.0'

First output log on request:

Started GET "/api/v2/get_user_session" for 172.17.0.1 at 2022-06-13 08:05:06 +0000
Processing by SessionsController#open_user_session as */*
[active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (1.76ms)
Completed 200 OK in 61ms (Views: 4.8ms | ActiveRecord: 0.0ms | Allocations: 0)

Exception on request:

RuntimeError (Digest::Base cannot be directly inherited in Ruby):

/usr/share/rvm/rubies/truffleruby-22.1.0/lib/truffle/truffle/cext.rb:1089:in `rb_exc_raise'
exception.c:29:in `rb_exc_raise'
digest (3.1.0) ext/digest/digest.c:555:in `get_digest_base_metadata'
digest (3.1.0) ext/digest/digest.c:620:in `rb_digest_base_alloc'
/usr/share/rvm/rubies/truffleruby-22.1.0/lib/truffle/truffle/cext.rb:1244:in `__allocate__'
rack (2.2.3.1) lib/rack/etag.rb:69:in `block in digest_body'
actionpack (7.0.3) lib/action_dispatch/http/response.rb:146:in `each'
actionpack (7.0.3) lib/action_dispatch/http/response.rb:146:in `each_chunk'
actionpack (7.0.3) lib/action_dispatch/http/response.rb:128:in `each'
actionpack (7.0.3) lib/action_dispatch/http/response.rb:76:in `each'
actionpack (7.0.3) lib/action_dispatch/http/response.rb:481:in `each'
rack (2.2.3.1) lib/rack/body_proxy.rb:41:in `method_missing'
rack (2.2.3.1) lib/rack/etag.rb:67:in `digest_body'
rack (2.2.3.1) lib/rack/etag.rb:31:in `call'
rack (2.2.3.1) lib/rack/conditional_get.rb:27:in `call'
rack (2.2.3.1) lib/rack/head.rb:12:in `call'
actionpack (7.0.3) lib/action_dispatch/http/permissions_policy.rb:38:in `call'
actionpack (7.0.3) lib/action_dispatch/http/content_security_policy.rb:36:in `call'
rack (2.2.3.1) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.3.1) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/cookies.rb:697:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport (7.0.3) lib/active_support/callbacks.rb:99:in `run_callbacks'
actionpack (7.0.3) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/show_exceptions.rb:26:in `call'
railties (7.0.3) lib/rails/rack/logger.rb:40:in `call_app'
railties (7.0.3) lib/rails/rack/logger.rb:25:in `block in call'
activesupport (7.0.3) lib/active_support/tagged_logging.rb:114:in `block in tagged'
activesupport (7.0.3) lib/active_support/tagged_logging.rb:38:in `tagged'
activesupport (7.0.3) lib/active_support/tagged_logging.rb:114:in `tagged'
railties (7.0.3) lib/rails/rack/logger.rb:25:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
request_store (1.5.1) lib/request_store/middleware.rb:19:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/request_id.rb:26:in `call'
rack (2.2.3.1) lib/rack/method_override.rb:24:in `call'
rack (2.2.3.1) lib/rack/runtime.rb:22:in `call'
activesupport (7.0.3) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/static.rb:23:in `call'
rack (2.2.3.1) lib/rack/sendfile.rb:110:in `call'
actionpack (7.0.3) lib/action_dispatch/middleware/host_authorization.rb:131:in `call'
railties (7.0.3) lib/rails/engine.rb:530:in `call'
puma (5.6.4) lib/puma/configuration.rb:252:in `call'
puma (5.6.4) lib/puma/request.rb:77:in `block in handle_request'
puma (5.6.4) lib/puma/thread_pool.rb:340:in `with_force_shutdown'
puma (5.6.4) lib/puma/request.rb:76:in `handle_request'
puma (5.6.4) lib/puma/server.rb:441:in `process_client'
puma (5.6.4) lib/puma/server.rb:415:in `process_client'
puma (5.6.4) lib/puma/thread_pool.rb:147:in `block in spawn_thread'
Tiikara commented 2 years ago

When I add in config/production.rb:

config.middleware.delete Rack::ETag

Issue is gone. But all methods that use Digest::Base generate this error.

For example for cable:

Started GET "/cable/cable" [WebSocket] for 172.17.0.1 at 2022-06-13 10:19:02 +0000
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
WebSocket error occurred: Digest::Base cannot be directly inherited in Ruby
Finished "/cable/cable" [WebSocket] for 172.17.0.1 at 2022-06-13 10:19:02 +0000
eregon commented 2 years ago

The digest C extension should not be loaded on TruffleRuby, the Ruby+Java implementation should be used instead. @bjfish Could you investigate why it gets loaded?

bjfish commented 2 years ago

@eregon This appears to be the same error as the internal issue: GR-38307.

eregon commented 2 years ago

Fixed in https://github.com/oracle/truffleruby/commit/e7feb071b015eaae3b9f71d92d4b8f5c202b09a9, thanks for the report.