Bug #2244
closedobject allocation bug with ActiveRecord
Description
=begin
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/query_cache.rb:85: [BUG] object allocation during garbage collection phase
ruby 1.8.7 (2008-06-20 patchlevel 22) [x86_64-linux]
=end
Updated by naruse (Yui NARUSE) over 14 years ago
- Subject changed from Bug to object allocation bug with ActiveRecord
- Status changed from Open to Feedback
- Priority changed from 5 to Normal
=begin
It seems to be caused by Third Party's extension library.
Can you show us more details of this?
=end
Updated by murphy (Kornelius Kalnbach) over 14 years ago
=begin
The affected code is the line
result.collect { |row| row.dup }
in this method:
module ActiveRecord
module ConnectionAdapters # :nodoc:
module QueryCache
class << self
def included(base)
base.class_eval do
alias_method_chain :columns, :query_cache
alias_method_chain :select_all, :query_cache
end
dirties_query_cache base, :insert, :update, :delete
end
def dirties_query_cache(base, *method_names)
method_names.each do |method_name|
base.class_eval <<-end_code, __FILE__, __LINE__
def #{method_name}_with_query_dirty(*args) # def update_with_query_dirty(*args)
clear_query_cache if @query_cache_enabled # clear_query_cache if @query_cache_enabled
#{method_name}_without_query_dirty(*args) # update_without_query_dirty(*args)
end # end
#
alias_method_chain :#{method_name}, :query_dirty # alias_method_chain :update, :query_dirty
end_code
end
end
end
attr_reader :query_cache, :query_cache_enabled
# Enable the query cache within the block.
def cache
old, @query_cache_enabled = @query_cache_enabled, true
@query_cache ||= {}
yield
ensure
clear_query_cache
@query_cache_enabled = old
end
# Disable the query cache within the block.
def uncached
old, @query_cache_enabled = @query_cache_enabled, false
yield
ensure
@query_cache_enabled = old
end
# Clears the query cache.
#
# One reason you may wish to call this method explicitly is between queries
# that ask the database to randomize results. Otherwise the cache would see
# the same SQL query and repeatedly return the same result each time, silently
# undermining the randomness you were expecting.
def clear_query_cache
@query_cache.clear if @query_cache
end
def select_all_with_query_cache(*args)
if @query_cache_enabled
cache_sql(args.first) { select_all_without_query_cache(*args) }
else
select_all_without_query_cache(*args)
end
end
def columns_with_query_cache(*args)
if @query_cache_enabled
@query_cache["SHOW FIELDS FROM #{args.first}"] ||= columns_without_query_cache(*args)
else
columns_without_query_cache(*args)
end
end
private
def cache_sql(sql)
result =
if @query_cache.has_key?(sql)
log_info(sql, "CACHE", 0.0)
@query_cache[sql]
else
@query_cache[sql] = yield
end
if Array === result
result.collect { |row| row.dup }
else
result.duplicable? ? result.dup : result
end
rescue TypeError
result
end
end
end
end
=end
Updated by ASUS1983 (Henning Möller) over 14 years ago
=begin
How we can fix this or use another ext. libary?
=end
Updated by naruse (Yui NARUSE) over 14 years ago
=begin
What is this 'row'?
I think, this 'row' is SQLite or MySQL or PostgreSQL or some DB object.
And its bug arround dup method causes this behavior.
So what is your DB adaptor?
OR show me value of $".
=end
Updated by drbrain (Eric Hodel) over 14 years ago
- Assignee changed from drbrain (Eric Hodel) to naruse (Yui NARUSE)
=begin
=end
Updated by naruse (Yui NARUSE) over 14 years ago
- Status changed from Feedback to Rejected
=begin
This is third party's issue
=end