1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
require File.dirname(__FILE__) + "/../test_helper"
require File.dirname(__FILE__) + "/number_to_spoken.rb"
require 'thread'
class IndexThreadSafetyReadWriteTest < Test::Unit::TestCase
include Ferret::Index
INDEX_DIR = File.expand_path(File.join(File.dirname(__FILE__), "index"))
ITERATIONS = 10000
ANALYZER = Ferret::Analysis::Analyzer.new()
def setup
@index = Index.new(:path => INDEX_DIR,
:create => true,
:analyzer => ANALYZER,
:default_field => :content)
end
def search_thread()
ITERATIONS.times do
do_search()
sleep(rand(1))
end
rescue => e
puts e
puts e.backtrace
@index = nil
raise e
end
def index_thread()
ITERATIONS.times do
do_add_doc()
sleep(rand(1))
end
rescue => e
puts e
puts e.backtrace
@index = nil
raise e
end
def do_add_doc
n = rand(0xFFFFFFFF)
d = {:id => n.to_s, :content => n.to_spoken}
puts("Adding #{n}")
begin
@index << d
rescue => e
puts e
puts e.backtrace
@index = nil
raise e
end
end
def do_search
n = rand(0xFFFFFFFF)
puts("Searching for #{n}")
hits = @index.search_each(n.to_spoken, :num_docs => 3) do |d, s|
puts "Hit for #{n}: #{@index[d]["id"]} - #{s}"
end
puts("Searched for #{n}: total = #{hits}")
end
def test_threading
threads = []
threads << Thread.new { search_thread }
threads << Thread.new { index_thread }
threads.each { |t| t.join }
end
end
|