Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NoMethodError: undefined method `visit_Arel_Nodes_Casted' for #<Arel::Visitors::DepthFirst:> #739

Closed
lephyrius opened this issue Aug 15, 2016 · 4 comments
Milestone

Comments

@lephyrius
Copy link

lephyrius commented Aug 15, 2016

I get this error when I try to run:

Game.where.not(score: [0,nil]).size
This is the stacktrace:

/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:63 in binary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:62 in binary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:57 in block in nary
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:57 in nary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in block in visit_Array
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in visit_Array
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:146 in visit_Arel_Nodes_SelectCore
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in block in visit_Array
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in visit_Array
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:153 in visit_Arel_Nodes_SelectStatement
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:9 in accept
/gems/arel-6.0.3/lib/arel/nodes/node.rb:56 in each
org/jruby/RubyEnumerable.java:568 in grep
org/jruby/RubyEnumerable.java:542 in grep
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:216 in perform_calculation
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:133 in calculate
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/active_record_helper.rb:70 in block in calculate
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/transaction.rb:849 in with_database_metric_name
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent.rb:569 in with_database_metric_name
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/active_record_helper.rb:69 in calculate
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:48 in count
/gems/activerecord-4.2.7.1/lib/active_record/relation.rb:258 in size
/app/app/decorators/game_page.rb:925 in encode_game_page
/app/app/decorators/game_page.rb:629 in fetch
/app/app/workers/invalidate_game_job.rb:10 in perform
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:152 in execute_job
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:134 in block in process
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:128 in block in invoke
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/sidekiq.rb:33 in block in call
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/controller_instrumentation.rb:363 in perform_action_with_newrelic_trace
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/sidekiq.rb:29 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/active_record.rb:6 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/retry_jobs.rb:74 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/logging.rb:11 in block in call
/gems/sidekiq-4.1.4/lib/sidekiq/logging.rb:32 in with_context
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/logging.rb:7 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:133 in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:129 in block in process
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:168 in stats
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:128 in process
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:81 in process_one
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:68 in run
/gems/sidekiq-4.1.4/lib/sidekiq/util.rb:17 in watchdog
/gems/sidekiq-4.1.4/lib/sidekiq/util.rb:25 in block in safe_thread
Caused by NoMethodError: undefined method `visit_Arel_Nodes_Casted' for #<Arel::Visitors::DepthFirst:0x39f75eb5>
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:63 in binary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:62 in binary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:57 in block in nary
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:57 in nary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in block in visit_Array
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in visit_Array
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:146 in visit_Arel_Nodes_SelectCore
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in block in visit_Array
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in visit_Array
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:153 in visit_Arel_Nodes_SelectStatement
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:9 in accept
/gems/arel-6.0.3/lib/arel/nodes/node.rb:56 in each
org/jruby/RubyEnumerable.java:568 in grep
org/jruby/RubyEnumerable.java:542 in grep
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:216 in perform_calculation
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:133 in calculate
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/active_record_helper.rb:70 in block in calculate
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/transaction.rb:849 in with_database_metric_name
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent.rb:569 in with_database_metric_name
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/active_record_helper.rb:69 in calculate
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:48 in count
/gems/activerecord-4.2.7.1/lib/active_record/relation.rb:258 in size
/app/app/decorators/game_page.rb:925 in encode_game_page
/app/app/decorators/game_page.rb:629 in fetch
/app/app/workers/invalidate_game_job.rb:10 in perform
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:152 in execute_job
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:134 in block in process
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:128 in block in invoke
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/sidekiq.rb:33 in block in call
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/controller_instrumentation.rb:363 in perform_action_with_newrelic_trace
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/sidekiq.rb:29 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/active_record.rb:6 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/retry_jobs.rb:74 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/logging.rb:11 in block in call
/gems/sidekiq-4.1.4/lib/sidekiq/logging.rb:32 in with_context
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/server/logging.rb:7 in call
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:130 in block in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/middleware/chain.rb:133 in invoke
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:129 in block in process
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:168 in stats
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:128 in process
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:81 in process_one
/gems/sidekiq-4.1.4/lib/sidekiq/processor.rb:68 in run
/gems/sidekiq-4.1.4/lib/sidekiq/util.rb:17 in watchdog
/gems/sidekiq-4.1.4/lib/sidekiq/util.rb:25 in block in safe_thread
Caused by NoMethodError: undefined method `visit_Arel_Nodes_Casted' for #<Arel::Visitors::DepthFirst:0x39f75eb5>
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:63 in binary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:62 in binary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:17 in unary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:57 in block in nary
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:57 in nary
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in block in visit_Array
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in visit_Array
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:146 in visit_Arel_Nodes_SelectCore
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in block in visit_Array
org/jruby/RubyArray.java:1593 in each
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:169 in visit_Array
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:153 in visit_Arel_Nodes_SelectStatement
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:29 in visit
/gems/arel-6.0.3/lib/arel/visitors/depth_first.rb:12 in visit
/gems/arel-6.0.3/lib/arel/visitors/visitor.rb:9 in accept
/gems/arel-6.0.3/lib/arel/nodes/node.rb:56 in each
org/jruby/RubyEnumerable.java:568 in grep
org/jruby/RubyEnumerable.java:542 in grep
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:216 in perform_calculation
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:133 in calculate
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/active_record_helper.rb:70 in block in calculate
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/transaction.rb:849 in with_database_metric_name
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent.rb:569 in with_database_metric_name
/gems/newrelic_rpm-3.16.0.318/lib/new_relic/agent/instrumentation/active_record_helper.rb:69 in calculate
/gems/activerecord-4.2.7.1/lib/active_record/relation/calculations.rb:48 in count
/gems/activerecord-4.2.7.1/lib/active_record/relation.rb:258 in size

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/36974265-nomethoderror-undefined-method-visit_arel_nodes_casted-for-arel-visitors-depthfirst?utm_campaign=plugin&utm_content=tracker%2F136963&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F136963&utm_medium=issues&utm_source=github).
@abrandoned
Copy link
Contributor

We had similar problems and believe it is related to the lack of thread safety in the rescue clause during a visit of an arel node; although not related to activerecord-jdbc it seems this issue is made more prevalent because of jruby threading

rails/rails#26571

The rails issue outlines the problem as seemingly only related to count but we decided to add a patch to our servers that should account for any concurrent visit type ... tries to minimize locking, but should only hit the lock up to the level of concurrency that exists on a server

we haven't seen it happen since applying the below patch ... but we continue to monitor for it and watch for an update to arel to be able to remove our patch

require "thread"
require "arel/visitors/visitor"

# NOTE: Fixing thread safety problems for Arel, hopefully can be removed in future
# https://github.com/rails/rails/issues/26571

module Arel
  module Visitors
    class Visitor
      NO_METHOD_MUTEX = ::Mutex.new

      def visit object
        send dispatch[object.class], object
      rescue NoMethodError => e
        superklass = object.class.ancestors.find { |klass|
          respond_to?(dispatch[klass], true)
        }

        raise(TypeError, "Cannot visit #{object.class}") unless superklass

        NO_METHOD_MUTEX.synchronize do
          dispatch[object.class] = dispatch[superklass] unless respond_to?(dispatch[object.class], true)
        end

        if respond_to?(dispatch[object.class], true)
          retry
        else
          raise e
        end
      end
    end
  end
end

@prama10
Copy link

prama10 commented Aug 31, 2017

I'm getting the same issue when running from a Sidekiq job.

Was the above patch submitted as a PR to the Rails project? @abrandoned

Here is the error

NoMethodError: undefined method `visit_Arel_Nodes_Casted' for #<Arel::Visitors::DepthFirst:0x3a5cae68>

@abrandoned
Copy link
Contributor

@prama10 the above linked PR into arel was merged in on June 4; if you have a more recent version it may be there but we actually have both patches applied on our systems so I'll have to verify if the PR merged fixed it for both cases (in our testing we thought it would)

@kares
Copy link
Member

kares commented Dec 11, 2017

@abrandoned provided great HINTs on want the issue really is about, let's close it as invalid at AR-JDBC's

@kares kares closed this as completed Dec 11, 2017
@kares kares modified the milestones: WontFix, Invalid Dec 11, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants