#1465 new
Postmodern

SystemStackError when accessing lazy loaded resources.

Reported by Postmodern | January 2nd, 2011 @ 03:35 AM

I'm getting a strange "stack level too deep" error when accessing belongs_to relationships on lazy-loaded resources. I eventually traced it back to this method in DataMapper:

/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:421
expected = record_value(value, :target_key)
(rdb:1) bt
--> #0 DataMapper::Query::Conditions::AbstractComparison.expected 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:421
    #1 DataMapper::Query::Conditions::EqualToComparison.matches?(record#Ronin::EmailAddress,...) 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:533
    #2 Set.each 
       at line /home/hal/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/set.rb:461
    #3 Set.each 
       at line /home/hal/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/set.rb:222
    #4 DataMapper::Query::Conditions::AbstractOperation.each 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/operation.rb:159
    #5 DataMapper::Query::Conditions::AndOperation.matches?(record#Ronin::EmailAddress,...) 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/operation.rb:461
    #6 DataMapper::Resource.collection 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/resource.rb:635
    #7 DataMapper::Associations::ManyToOne::Relationship.lazy_load(source#Ronin::EmailAddress,...) 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/associations/many_to_one.rb:158
    #8 DataMapper::Resource::State::Persisted.lazy_load(subject#DataMapper::Associati...,...) 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/resource/state/persisted.rb:23
    #9 DataMapper::Resource::State::Persisted.get(subject#DataMapper::Associati...) 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/resource/state/persisted.rb:8
    #10 #<Module:0x00000002b60380>.host_name 
       at line /home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/model/relationship.rb:337

Here is where it starts to loop:

(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:364
subject = self.subject
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:365
case record
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:371
record
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:423
if @subject.respond_to?(:source_key)
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:426
expected
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:536
super
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:461
if relationship? && expected.respond_to?(:query)
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:449
subject.kind_of?(Associations::Relationship)
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:464
super
(rdb:1) step
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:211
match_property?(record)
(rdb:1) 
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:300
expected.send(operator, record_value(record))
(rdb:1) 
/home/hal/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/query/conditions/comparison.rb:421
expected = record_value(value, :target_key)

No comments found

Please Sign in or create a free account to add a new ticket.

With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.

New-ticket Create new ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

People watching this ticket

Pages