Project

General

Profile

Actions

Bug #2244

closed

object allocation bug with ActiveRecord

Added by ASUS1983 (Henning Möller) over 14 years ago. Updated almost 13 years ago.

Status:
Rejected
ruby -v:
1.8.7
[ruby-core:26204]

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

Actions #1

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

Actions #2

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

Actions #3

Updated by ASUS1983 (Henning Möller) over 14 years ago

=begin
How we can fix this or use another ext. libary?
=end

Actions #4

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

Actions #5

Updated by drbrain (Eric Hodel) over 14 years ago

  • Assignee changed from drbrain (Eric Hodel) to naruse (Yui NARUSE)

=begin

=end

Actions #6

Updated by naruse (Yui NARUSE) over 14 years ago

  • Status changed from Feedback to Rejected

=begin
This is third party's issue
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0