drbqs 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/drbqs.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{drbqs}
8
- s.version = "0.0.1"
8
+ s.version = "0.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Takayuki YAMAGUCHI"]
12
- s.date = %q{2011-02-26}
12
+ s.date = %q{2011-02-27}
13
13
  s.description = %q{Queuing system over network that is implemented by dRuby.}
14
14
  s.email = %q{d@ytak.info}
15
15
  s.extra_rdoc_files = [
data/lib/drbqs/client.rb CHANGED
@@ -28,13 +28,15 @@ module DRbQS
28
28
  end
29
29
  end
30
30
 
31
+ WAIT_NEW_TASK = 1
32
+
31
33
  def calculate
32
34
  cn = Thread.new do
33
35
  loop do
34
36
  @task_client.add_new_task
35
37
  @connection.respond_alive_signal
36
38
  @task_client.send_result
37
- sleep(1)
39
+ sleep(WAIT_NEW_TASK)
38
40
  end
39
41
  end
40
42
  exec = Thread.new do
@@ -25,7 +25,7 @@ module DRbQS
25
25
  begin
26
26
  ary = @message.read([:initialize, nil, Symbol, nil], 0)
27
27
  ary[1..-1]
28
- rescue
28
+ rescue Rinda::RequestExpiredError
29
29
  nil
30
30
  end
31
31
  end
@@ -39,7 +39,7 @@ module DRbQS
39
39
  when :exit
40
40
  Kernel.exit
41
41
  end
42
- rescue
42
+ rescue Rinda::RequestExpiredError
43
43
  end
44
44
  end
45
45
  end
data/lib/drbqs/message.rb CHANGED
@@ -93,7 +93,7 @@ module DRbQS
93
93
  def set_initialization(task)
94
94
  begin
95
95
  @message.take([:initialize, nil, Symbol, nil], 0)
96
- rescue
96
+ rescue Rinda::RequestExpiredError
97
97
  end
98
98
  @message.write(task.drb_args(:initialize))
99
99
  end
data/lib/drbqs/queue.rb CHANGED
@@ -28,7 +28,7 @@ module DRbQS
28
28
  @result = result
29
29
  @task_id = 0
30
30
  @cache = {}
31
- @calculating = {}
31
+ @calculating = Hash.new { |hash, key| hash[key] = Array.new }
32
32
  @logger = logger
33
33
  end
34
34
 
@@ -46,43 +46,63 @@ module DRbQS
46
46
  end
47
47
 
48
48
  def get_accept_signal
49
+ count = 0
49
50
  begin
50
- sym, task_id, node_id = @result.take([:accept, Fixnum, Fixnum], 0)
51
- @calculating[node_id] = task_id
52
- @logger.info("Accept: task #{task_id} by node #{node_id}.") if @logger
53
- rescue
51
+ loop do
52
+ sym, task_id, node_id = @result.take([:accept, Fixnum, Fixnum], 0)
53
+ count += 1
54
+ @calculating[node_id] << task_id
55
+ @logger.info("Accept: task #{task_id} by node #{node_id}.") if @logger
56
+ end
57
+ rescue Rinda::RequestExpiredError
58
+ @logger.debug("Accept: #{count} signals.") if @logger
54
59
  end
60
+ count
55
61
  end
56
62
 
57
63
  def requeue_for_deleted_node_id(deleted)
58
64
  deleted.each do |node_id|
59
- if task_id = @calculating[node_id]
60
- queue_task(task_id)
61
- @calculating.delete(task_id)
65
+ if task_id_ary = @calculating[node_id]
66
+ task_id_ary.each { |task_id| queue_task(task_id) }
67
+ @calculating.delete(node_id)
62
68
  end
63
69
  end
64
70
  end
65
71
 
66
72
  def get_result
73
+ count = 0
67
74
  begin
68
75
  loop do
76
+ get_accept_signal
69
77
  sym, task_id, result = @result.take([:result, Fixnum, nil], 0)
70
- @logger.info("Get: result of #{task_id}.") if @logger
71
- @calculating.delete(task_id)
78
+ count += 1
79
+ if ary = @calculating.find { |k, v| v.include?(task_id) }
80
+ node_id = ary[0]
81
+ @calculating[node_id].delete(task_id)
82
+ else
83
+ node_id = nil
84
+ end
85
+ @logger.info("Get: result of #{task_id} from node #{node_id}.") if @logger
72
86
  task = @cache.delete(task_id)
73
87
  if hook = task.hook
74
88
  hook.call(self, result)
75
89
  end
76
90
  end
77
- rescue
91
+ rescue Rinda::RequestExpiredError
92
+ @logger.debug("Get: #{count} results.") if @logger
78
93
  end
94
+ count
95
+ end
96
+
97
+ def calculating_task_number
98
+ @calculating.inject(0) { |s, key_val| s + key_val[1].size }
79
99
  end
80
100
 
81
101
  # If queue is empty, return true. Otherwise, false.
82
102
  # Even if there are calculating tasks,
83
103
  # the method can return true.
84
104
  def empty?
85
- @cache.size - @calculating.size == 0
105
+ @cache.size - calculating_task_number == 0
86
106
  end
87
107
 
88
108
  # If there are no tasks in queue and calculating,
@@ -90,10 +110,6 @@ module DRbQS
90
110
  def finished?
91
111
  @cache.size == 0
92
112
  end
93
-
94
- def calculating_task_number
95
- @calculating.size
96
- end
97
113
  end
98
114
 
99
115
  end
data/lib/drbqs/server.rb CHANGED
@@ -87,6 +87,7 @@ module DRbQS
87
87
  private :exec_hook
88
88
 
89
89
  WAIT_NODE_EXIT = 3
90
+ WAIT_NEW_RESULT = 1
90
91
 
91
92
  def exit
92
93
  @message.send_exit
@@ -101,9 +102,12 @@ module DRbQS
101
102
  loop do
102
103
  @message.get_message
103
104
  check_connection
104
- @queue.get_result
105
+ count_results = @queue.get_result
105
106
  exec_hook
106
- sleep(1)
107
+ @logger.info("Calculating tasks: #{@queue.calculating_task_number}") if @logger
108
+ if count_results <= 1
109
+ sleep(WAIT_NEW_RESULT)
110
+ end
107
111
  end
108
112
  end
109
113
  end
@@ -16,8 +16,9 @@ module DRbQS
16
16
  task_id, obj, method_sym, args = @queue.take([Fixnum, nil, Symbol, nil], 0)
17
17
  @calculating_task = task_id
18
18
  @task_queue.enq([obj, method_sym, args])
19
- @result.write([:accept, task_id, @node_id])
20
- rescue
19
+ @logger.info("Send accept signal: node #{@node_id} caluclating #{@calculating_task}") if @logger
20
+ @result.write([:accept, @calculating_task, @node_id])
21
+ rescue Rinda::RequestExpiredError
21
22
  end
22
23
  end
23
24
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: drbqs
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Takayuki YAMAGUCHI
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-02-26 00:00:00 +09:00
13
+ date: 2011-02-27 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -109,7 +109,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- hash: 2055221894709119612
112
+ hash: 1630307079048384788
113
113
  segments:
114
114
  - 0
115
115
  version: "0"