To edit pages or tickets please login with username/password: aaf/aaf

Changeset 236

Show
Ignore:
Timestamp:
09/05/07 21:07:43 (1 year ago)
Author:
jk
Message:

reconnect in DRb server when MySQL connection went away

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/demo/config/database.yml

    r209 r236  
    3131 
    3232# SQLITE 
    33 development: 
    34   adapter: sqlite3 
    35   dbfile: db/dev.sqlite 
     33#development: 
     34#  adapter: sqlite3 
     35#  dbfile: db/dev.sqlite 
    3636 
    37 test: 
    38   adapter: sqlite3 
    39   dbfile: db/test.sqlite 
     37#test: 
     38#  adapter: sqlite3 
     39#  dbfile: db/test.sqlite 
    4040 
  • trunk/demo/test/unit/content_test.rb

    r235 r236  
    725725  end 
    726726 
     727  def test_reconnect_in_drb_mode 
     728    if ENV['AAF_REMOTE'] && Content.connection.is_a?(ActiveRecord::ConnectionAdapters::MysqlAdapter) 
     729      puts "have DRb and MySQL - doing db reconnect test" 
     730      Content.aaf_index.send(:db_disconnect!) 
     731      c = Content.create! :title => 'another one', :description => 'description' 
     732      assert_equal c, Content.find_with_ferret('another').first 
     733    else 
     734      assert true 
     735    end 
     736  end 
     737 
    727738  protected 
    728739  def more_contents 
  • trunk/plugin/acts_as_ferret/lib/ferret_server.rb

    r198 r236  
    6060      def method_missing(name, *args) 
    6161        @logger.debug "\#method_missing(#{name.inspect}, #{args.inspect})" 
     62        retried = false 
    6263        with_class args.shift do |clazz| 
    63           begin 
    64             clazz.aaf_index.send name, *args 
    65           rescue NoMethodError 
    66             @logger.debug "no luck, trying to call class method instead" 
    67             clazz.send name, *args 
     64          reconnect_when_needed(clazz) do 
     65            begin 
     66              clazz.aaf_index.send name, *args 
     67            rescue NoMethodError 
     68              @logger.debug "no luck, trying to call class method instead" 
     69              clazz.send name, *args 
     70            end 
    6871          end 
    6972        end 
    70       rescue 
    71         @logger.error "ferret server error #{$!}\n#{$!.backtrace.join '\n'}" 
    72         raise 
     73      rescue => e 
     74        @logger.error "ferret server error #{$!}\n#{$!.backtrace.join "\n"}" 
     75        raise e 
    7376      end 
    7477 
     
    8487      end 
    8588 
     89      # disconnects the db connection for the class specified by class_name 
     90      # used only in unit tests to check the automatic reconnection feature 
     91      def db_disconnect!(class_name) 
     92        with_class class_name do |clazz| 
     93          clazz.connection.disconnect! 
     94        end 
     95      end 
     96 
    8697      # hides LocalIndex#rebuild_index to implement index versioning 
    8798      def rebuild_index(clazz, *models) 
     
    90101          models << clazz unless models.include?(clazz) 
    91102          index = new_index_for(clazz, models) 
    92           @logger.debug "DRb server: rebuild index for class(es) #{models.inspect} in #{index.options[:path]}" 
    93           index.index_models models 
     103          reconnect_when_needed(clazz) do 
     104            @logger.debug "DRb server: rebuild index for class(es) #{models.inspect} in #{index.options[:path]}" 
     105            index.index_models models 
     106          end 
    94107          new_version = File.join clazz.aaf_configuration[:index_base_dir], Time.now.utc.strftime('%Y%m%d%H%M%S') 
    95108          # create a unique directory name (needed for unit tests where  
     
    114127        end 
    115128 
     129        def reconnect_when_needed(clazz) 
     130          retried = false 
     131          begin 
     132            yield 
     133          rescue ActiveRecord::StatementInvalid => e 
     134            if e.message =~ /MySQL server has gone away/ 
     135              if retried 
     136                raise e 
     137              else 
     138                @logger.info "StatementInvalid caught, trying to reconnect..." 
     139                clazz.connection.reconnect! 
     140                retried = true 
     141                retry 
     142              end 
     143            else 
     144              @logger.error "StatementInvalid caught, but unsure what to do with it: #{e}" 
     145              raise e 
     146            end 
     147          end 
     148        end 
     149 
    116150        def new_index_for(clazz, models) 
    117151          aaf_configuration = clazz.aaf_configuration 

To edit pages or tickets please login with username/password: aaf/aaf