File: thread_safety_read_write_test.rb

package info (click to toggle)
ruby-ferret 0.11.8.4%2Bdebian-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,368 kB
  • sloc: ansic: 69,786; ruby: 8,131; makefile: 5
file content (73 lines) | stat: -rw-r--r-- 1,573 bytes parent folder | download | duplicates (4)
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