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

Changeset 308

Show
Ignore:
Timestamp:
02/02/08 16:40:34 (8 months ago)
Author:
jk
Message:

fix #149 - handle DRb errors by default

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/demo/app/models/comment.rb

    r307 r308  
    2929  acts_as_ferret( :store_class_name => true,  
    3030                  :remote           => ENV['AAF_REMOTE'] == 'true',  # for testing drb remote indexing 
     31                  :raise_drb_errors => ENV['RAISE_DRB_ERRORS'] == 'true', 
    3132                  :fields => { 
    3233                    :content => { :store => :yes }, 
  • trunk/demo/app/models/content_base.rb

    r245 r308  
    1717                  :store_class_name => true, 
    1818                  :boost => :record_boost, 
     19                  :raise_drb_errors => ENV['RAISE_DRB_ERRORS'] == 'true', 
    1920                  :remote           => ENV['AAF_REMOTE'] == 'true') 
    2021 
  • trunk/demo/app/models/shared_index1.rb

    r246 r308  
    55                  :single_index => true,  
    66                  :remote       => ENV['AAF_REMOTE'] == 'true', 
     7                  :raise_drb_errors => ENV['RAISE_DRB_ERRORS'] == 'true', 
    78                  :ferret       => { :default_field => DEFAULT_FIELDS }  
    89                ) 
  • trunk/demo/app/models/shared_index2.rb

    r246 r308  
    11class SharedIndex2 < ActiveRecord::Base 
    2   acts_as_ferret( { :fields       => { :name => { :store => :yes } },  
    3                     :single_index => true,  
    4                     :remote       => ENV['AAF_REMOTE'] == 'true' },  
    5                   { :default_field => SharedIndex1::DEFAULT_FIELDS } ) 
     2  acts_as_ferret( :fields       => { :name => { :store => :yes } },  
     3                  :single_index => true,  
     4                  :remote       => ENV['AAF_REMOTE'] == 'true',  
     5                  :raise_drb_errors => ENV['RAISE_DRB_ERRORS'] == 'true', 
     6                  :ferret => { :default_field => SharedIndex1::DEFAULT_FIELDS } ) 
    67end 
  • trunk/demo/script/ferret_server

    • Property svn:executable set to *
  • trunk/demo/test/unit/content_test.rb

    r290 r308  
    262262    c1.save 
    263263    fi = Content.aaf_index.ferret_index 
     264    assert fi 
    264265    hits = fi.search('title:"Content item 1"') 
    265266    assert_equal 1, hits.total_hits 
     
    336337    sorting = [ Ferret::Search::SortField.new(:id, :reverse => true) ] 
    337338    result = Content.find_with_ferret('comment_count:2', :sort => sorting) 
     339    assert !result.empty? 
    338340    assert result.first.id > result.last.id 
    339341 
  • trunk/plugin/acts_as_ferret/lib/act_methods.rb

    r307 r308  
    4242    #                      algorithm if this model uses a non-integer primary key named 
    4343    #                      'id' on MySQL. 
     44    # 
     45    # raise_drb_errors:: Set this to true if you want aaf to raise Exceptions 
     46    #                    in case the DRb server cannot be reached (in other word - behave like 
     47    #                    versions up to 0.4.3). Defaults to false so DRb exceptions 
     48    #                    are logged but not raised. Be sure to set up some 
     49    #                    monitoring so you still detect when your DRb server died for 
     50    #                    whatever reason. 
    4451    # 
    4552    # ferret:: Hash of Options that directly influence the way the Ferret engine works. You  
     
    118125        :ferret_fields => {},             # list of indexed fields that will be filled later 
    119126        :enabled => true,                 # used for class-wide disabling of Ferret 
    120         :mysql_fast_batches => true       # turn off to disable the faster, id based batching mechanism for MySQL 
     127        :mysql_fast_batches => true,      # turn off to disable the faster, id based batching mechanism for MySQL 
     128        :raise_drb_errors => false        # handle DRb connection errors by default 
    121129      } 
    122130 
  • trunk/plugin/acts_as_ferret/lib/index.rb

    r298 r308  
    1212    end 
    1313     
    14     class << self 
    15       def proxy_method(name, *args) 
    16         define_method name do |*args| 
    17           @server.send name, model_class_name, *args 
    18         end 
    19       end 
    20  
    21       def index_proxy_method(*names) 
    22         names.each do |name| 
    23           define_method name do |*args| 
    24             @server.send :"index_#{name}", model_class_name, *args 
    25           end 
    26         end 
    27       end 
    28  
    29     end 
    3014  end 
    3115 
  • trunk/plugin/acts_as_ferret/lib/remote_index.rb

    r170 r308  
    77 
    88    def initialize(config) 
    9       @config = config 
    10       @ferret_config = config[:ferret] 
     9      super 
    1110      @server = DRbObject.new(nil, config[:remote]) 
    1211    end 
     
    1413    def method_missing(method_name, *args) 
    1514      args.unshift model_class_name 
    16       @server.send(method_name, *args) 
     15      handle_drb_error { @server.send(method_name, *args) } 
     16    end 
     17 
     18    # Proxy any methods that require special return values in case of errors 
     19    {  
     20      :highlight => []  
     21    }.each do |method_name, default_result| 
     22      define_method method_name do |*args| 
     23        args.unshift model_class_name 
     24        handle_drb_error(default_result) { @server.send method_name, *args } 
     25      end 
    1726    end 
    1827 
    1928    def find_id_by_contents(q, options = {}, &proc) 
    20       total_hits, results = @server.find_id_by_contents(model_class_name, q, options) 
     29      total_hits, results = handle_drb_error([0, []]) { @server.find_id_by_contents(model_class_name, q, options) } 
    2130      block_given? ? yield_results(total_hits, results, &proc) : [ total_hits, results ] 
    2231    end 
    2332 
    2433    def id_multi_search(query, models, options, &proc) 
    25       total_hits, results = @server.id_multi_search(model_class_name, query, models, options) 
     34      total_hits, results = handle_drb_error([0, []]) { @server.id_multi_search(model_class_name, query, models, options) } 
    2635      block_given? ? yield_results(total_hits, results, &proc) : [ total_hits, results ] 
    2736    end 
     
    2938    # add record to index 
    3039    def add(record) 
    31       @server.add record.class.name, record.to_doc 
     40      handle_drb_error { @server.add record.class.name, record.to_doc } 
    3241    end 
    3342    alias << add 
    3443 
    3544    private 
     45 
     46    def handle_drb_error(return_value_in_case_of_error = false) 
     47      yield 
     48    rescue DRb::DRbConnError => e 
     49      logger.error "DRb connection error: #{e}" 
     50      logger.warn e.backtrace.join("\n") 
     51      raise e if aaf_configuration[:raise_drb_errors] 
     52      return_value_in_case_of_error 
     53    end 
    3654 
    3755    def yield_results(total_hits, results) 
     
    4361 
    4462    def model_class_name 
    45       @config[:class_name] 
     63      aaf_configuration[:class_name] 
    4664    end 
    4765 

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