Changeset 236
- Timestamp:
- 09/05/07 21:07:43 (1 year ago)
- Files:
-
- trunk/demo/config/database.yml (modified) (1 diff)
- trunk/demo/test/unit/content_test.rb (modified) (1 diff)
- trunk/plugin/acts_as_ferret/lib/ferret_server.rb (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/demo/config/database.yml
r209 r236 31 31 32 32 # SQLITE 33 development:34 adapter: sqlite335 dbfile: db/dev.sqlite33 #development: 34 # adapter: sqlite3 35 # dbfile: db/dev.sqlite 36 36 37 test:38 adapter: sqlite339 dbfile: db/test.sqlite37 #test: 38 # adapter: sqlite3 39 # dbfile: db/test.sqlite 40 40 trunk/demo/test/unit/content_test.rb
r235 r236 725 725 end 726 726 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 727 738 protected 728 739 def more_contents trunk/plugin/acts_as_ferret/lib/ferret_server.rb
r198 r236 60 60 def method_missing(name, *args) 61 61 @logger.debug "\#method_missing(#{name.inspect}, #{args.inspect})" 62 retried = false 62 63 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 68 71 end 69 72 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 73 76 end 74 77 … … 84 87 end 85 88 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 86 97 # hides LocalIndex#rebuild_index to implement index versioning 87 98 def rebuild_index(clazz, *models) … … 90 101 models << clazz unless models.include?(clazz) 91 102 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 94 107 new_version = File.join clazz.aaf_configuration[:index_base_dir], Time.now.utc.strftime('%Y%m%d%H%M%S') 95 108 # create a unique directory name (needed for unit tests where … … 114 127 end 115 128 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 116 150 def new_index_for(clazz, models) 117 151 aaf_configuration = clazz.aaf_configuration
