bjfish
(Brandon Fish)
28 Abril, 2022 17:06
1
Me gustaría solicitar los siguientes 3 cambios para ayudar a ejecutar Discourse en TruffleRuby:
Cambio Solicitado
Actualizar bin/rails para deshabilitar unicorn cuando fork no es compatible.
Error
internal:core/kernel.rb:764:in `fork': fork is not available (NotImplementedError)
Archivos
bin/rails
#!/usr/bin/env ruby
# frozen_string_literal: true
if !ENV["RAILS_ENV"] && (ARGV[0] == "s" || ARGV[0] == "server")
ENV["UNICORN_PORT"] ||= "3000"
if ARGV[1] == "-p" && (port = ARGV[2].to_i) > 0
ENV["UNICORN_PORT"] = port.to_s
end
ENV["RAILS_LOGS_STDOUT"] ||= "1"
exec File.expand_path("unicorn", __dir__)
end
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'
Por qué
TruffleRuby no soporta forking.
Sugerencia
Deshabilitar unicorn si !Process.respond_to?(:fork)
========================================================
Cambio Solicitado
Deshabilitar mini_profiler para TruffleRuby
Error
internal:core/kernel.rb:236:in `gem_original_require': cannot load such file -- stackprof (LoadError)
Archivos
config/initializers/006-mini_profiler.rb
# frozen_string_literal: true
# If Mini Profiler is included via gem
if Rails.configuration.respond_to?(:load_mini_profiler) && Rails.configuration.load_mini_profiler
require 'rack-mini-profiler'
require 'stackprof'
begin
require 'memory_profiler'
rescue => e
STDERR.put "#{e} failed to require mini profiler"
end
# initialization is skipped so trigger it
Rack::MiniProfilerRails.initialize!(Rails.application)
end
if defined?(Rack::MiniProfiler) && defined?(Rack::MiniProfiler::Config)
# note, we may want to add some extra security here that disables mini profiler in a multi hosted env unless user global admin
# raw_connection means results are not namespaced
This file has been truncated. show original
Por qué
Stackprof no es compatible actualmente en TruffleRuby
Sugerencia
Deshabilitar la carga de mini_profiler cuando RUBY_ENGINE es “TruffleRuby”
========================================================
Cambio Solicitado
Evitar que rbtrace se cargue
Usos similares que ya evitan que rb_trace se cargue:
config.hosts.concat(hosts.split(","))
end
require 'middleware/turbo_dev'
config.middleware.insert 0, Middleware::TurboDev
require 'middleware/missing_avatars'
config.middleware.insert 1, Middleware::MissingAvatars
config.enable_anon_caching = false
if RUBY_ENGINE == "ruby"
require 'rbtrace'
end
if emails = GlobalSetting.developer_emails
config.developer_emails = emails.split(",").map(&:downcase).map(&:strip)
end
if ENV["DISCOURSE_SKIP_CSS_WATCHER"] != "1" && (defined?(Rails::Server) || defined?(Puma) || defined?(Unicorn))
require 'stylesheet/watcher'
STDERR.puts "Starting CSS change watcher"
@watcher = Stylesheet::Watcher.watch
Error
Failure/Error: require ‘rbtrace’
Sugerencia
Utilizar uno de los métodos en los enlaces anteriores para evitar cargar rbtrace
Archivos
spec/rails_helper.rb
SimpleCov.start 'rails' do
add_group 'Libraries', /^\/lib\/(?!tasks).*$/
add_group 'Scripts', 'script'
add_group 'Serializers', 'app/serializers'
add_group 'Services', 'app/services'
add_group 'Tasks', 'lib/tasks'
end
end
require 'rubygems'
require 'rbtrace'
require 'pry'
require 'pry-byebug'
require 'pry-rails'
require 'fabrication'
require 'mocha/api'
require 'certified'
require 'webmock/rspec'
class RspecErrorTracker
def self.last_exception=(ex)
2 Me gusta
gerhard
(Gerhard Schlager)
29 Abril, 2022 12:12
5
Esas parecen solicitudes razonables.
Por cierto: ¿Ha cambiado algo sobre que mini_racer no sea compatible con TruffleRuby? Ese es un bloqueo importante.
Sure I just too care of this there are a few others I left which I am unsure about, what should I do with them? (byebug, ruby-prof, better_errors, rbtrace, gc_tracer, stackprof, memory_profiler)
That said we are totally blocked on truffle till we get mini_racer working per:
https://github.com/oracle/truffleruby/issues/1827
Discourse is not really properly functional if you can not cook Markdown to HTML on the server.
4 Me gusta
bjfish
(Brandon Fish)
29 Abril, 2022 18:55
6
Por cierto: ¿Ha cambiado algo sobre mini_racer no ser compatible con TruffleRuby? Ese es un bloqueo importante.
Tengo una rama con la mayor parte de la funcionalidad de mini_racer pasando la suite de pruebas usando GraalJS para TruffleRuby. Creo que maneja toda la funcionalidad necesaria para Discourse. Solo necesita ser revisada y luego intentaré que se fusione. Así es como lo he estado ejecutando localmente: https://twitter.com/brandonfish/status/1486755128577253376
6 Me gusta
bjfish
(Brandon Fish)
2 Mayo, 2022 15:44
7
Corrección:
Deshabilitar la carga de mini_profiler cuando RUBY_ENGINE es “truffleruby”
2 Me gusta
sam
(Sam Saffron)
3 Mayo, 2022 05:04
8
mini_profiler debería seguir funcionando bien, recomendaría que simplemente no carguemos rbtrace / stackprof, etc. Hay dependencias sueltas.
mini_profiler aún puede aportar mucho valor en el mundo de truffle, nada específico de MRI al respecto.
4 Me gusta
gerhard
(Gerhard Schlager)
4 Mayo, 2022 20:10
9
Aquí tienes una PR con los cambios solicitados.
main ← truffleruby
opened 08:10PM - 04 May 22 UTC
Todavía no he conseguido que funcione correctamente, hubo un java.lang.NullPointerException, pero eso podría ser solo que deshabilité burdamente mini_racer. Tengo muchas ganas de ver un Discourse totalmente funcional ejecutándose en TruffleRuby.
No investigué más a fondo, pero noté un error cuando solo deshabilité la carga de stackprof y memory_profiler. Así que deshabilité completamente mini_profiler por ahora.
2022-05-04 21:48:13 +0200 Rack app ("POST /mini-profiler-resources/results" - (127.0.0.1)): #<SystemStackError: stack level too deep
from StackOverflowCheckImpl.java:328:in `com.oracle.svm.core.graal.snippets.StackOverflowCheckImpl.newStackOverflowError0'>
Podría haber sido un efecto secundario de otros problemas. Supongo que podríamos investigar cuando se resuelvan otros problemas.
6 Me gusta