gearman-ruby 4.0.4 → 4.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/examples/client_dedupe.rb +22 -0
- data/examples/worker_dedupe.rb +19 -0
- data/lib/gearman/client.rb +1 -1
- data/lib/gearman/connection_pool.rb +33 -22
- data/lib/gearman/version.rb +1 -1
- data/spec/client_spec.rb +13 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ffdbe675e2808d933b8fb7ebdd8ffe5a42b0814
|
4
|
+
data.tar.gz: a1633bb7cb2c83ecc631e8f32bb15719d99a06c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7ef5d38b28304b96945bc9a7d9c023acec174ff6dbc3585c19dbb123d2dd2e6aeeb70edfc7e0ed5e81d2bfe7f65b424d8ddac75b5e8993864808cc1f13f3dbd
|
7
|
+
data.tar.gz: bed878e4570169263cf3106ad7db091204d7533db1bdff81be6c882f3a8a96b9833ea679b2807423a5218201d4a80efe9e50adc5b43effdf981d04076826a078
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH.unshift("../lib")
|
2
|
+
require 'rubygems'
|
3
|
+
require 'gearman'
|
4
|
+
|
5
|
+
# Control logger
|
6
|
+
l = Logger.new($stdout)
|
7
|
+
l.level = Logger::DEBUG
|
8
|
+
Gearman.logger=l
|
9
|
+
|
10
|
+
servers = ['localhost:4730']
|
11
|
+
|
12
|
+
client = Gearman::Client.new(servers)
|
13
|
+
|
14
|
+
# Submitting work with no explicit unique ID will
|
15
|
+
# cause one to be generated by the client based on
|
16
|
+
# the job queue and the data, these 10 jobs should
|
17
|
+
# get de-duped into one job in the server (provided
|
18
|
+
# that nobody is pulling from the queue in the middle)
|
19
|
+
(0..10).each do |i|
|
20
|
+
task = Gearman::BackgroundTask.new('dedupe', 'data')
|
21
|
+
client.do_task(task)
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$LOAD_PATH.unshift("../lib")
|
2
|
+
require 'rubygems'
|
3
|
+
require 'gearman'
|
4
|
+
|
5
|
+
# Control logger
|
6
|
+
l = Logger.new($stdout)
|
7
|
+
l.level = Logger::DEBUG
|
8
|
+
Gearman.logger=l
|
9
|
+
|
10
|
+
servers = ['localhost:4730']
|
11
|
+
|
12
|
+
worker = Gearman::Worker.new(servers)
|
13
|
+
|
14
|
+
worker.add_ability('dedupe') do |data, job|
|
15
|
+
puts "Should only see one of these come through!"
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
loop { worker.work }
|
data/lib/gearman/client.rb
CHANGED
@@ -98,7 +98,7 @@ module Gearman
|
|
98
98
|
raise ProtocolError, message
|
99
99
|
end
|
100
100
|
rescue NetworkError
|
101
|
-
message = "Network error on read from #{hostport} while adding job, marking server bad"
|
101
|
+
message = "Network error on read from #{connection.hostport} while adding job, marking server bad"
|
102
102
|
logger.error message
|
103
103
|
raise NetworkError, message
|
104
104
|
rescue NoJobServersError
|
@@ -5,6 +5,8 @@ module Gearman
|
|
5
5
|
include Logging
|
6
6
|
|
7
7
|
DEFAULT_PORT = 4730
|
8
|
+
TIME_BETWEEN_CHECKS = 60 #seconds
|
9
|
+
SLEEP_TIME = 30 #seconds
|
8
10
|
|
9
11
|
def initialize(servers = [])
|
10
12
|
@bad_servers = []
|
@@ -14,9 +16,9 @@ module Gearman
|
|
14
16
|
@reconnect_seconds = 10
|
15
17
|
@server_counter = 0 # Round-robin distribution of requests
|
16
18
|
@servers_mutex = Mutex.new
|
19
|
+
@last_check_time = Time.now
|
17
20
|
|
18
21
|
add_servers(servers)
|
19
|
-
start_reconnect_thread
|
20
22
|
end
|
21
23
|
|
22
24
|
def add_connection(connection)
|
@@ -49,7 +51,6 @@ module Gearman
|
|
49
51
|
|
50
52
|
def get_connection(coalesce_key = nil)
|
51
53
|
@servers_mutex.synchronize do
|
52
|
-
|
53
54
|
logger.debug "Available job servers: #{@job_servers.inspect}"
|
54
55
|
raise NoJobServersError if @job_servers.empty?
|
55
56
|
@server_counter += 1
|
@@ -62,6 +63,7 @@ module Gearman
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def poll_connections(timeout = nil)
|
66
|
+
update_job_servers
|
65
67
|
available_sockets = []
|
66
68
|
@servers_mutex.synchronize do
|
67
69
|
available_sockets.concat @job_servers.collect { |conn| conn.socket }
|
@@ -73,6 +75,7 @@ module Gearman
|
|
73
75
|
end
|
74
76
|
|
75
77
|
def with_all_connections(&block)
|
78
|
+
update_job_servers
|
76
79
|
@servers_mutex.synchronize do
|
77
80
|
@job_servers.each do |connection|
|
78
81
|
begin
|
@@ -88,6 +91,10 @@ module Gearman
|
|
88
91
|
|
89
92
|
private
|
90
93
|
|
94
|
+
def time_to_check_connections
|
95
|
+
(Time.now - @last_check_time) >= TIME_BETWEEN_CHECKS
|
96
|
+
end
|
97
|
+
|
91
98
|
def deactivate_connection(connection)
|
92
99
|
@job_servers.reject! { |c| c == connection }
|
93
100
|
@bad_servers << connection
|
@@ -99,31 +106,35 @@ module Gearman
|
|
99
106
|
@connection_handler.call(connection) if @connection_handler
|
100
107
|
end
|
101
108
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
@servers_mutex.synchronize do
|
106
|
-
# If there are any failed servers, try to reconnect to them.
|
107
|
-
update_job_servers unless @bad_servers.empty?
|
108
|
-
end
|
109
|
-
sleep @reconnect_seconds
|
110
|
-
end
|
111
|
-
end.run
|
112
|
-
end
|
113
|
-
|
109
|
+
##
|
110
|
+
# Check for bad servers and update the available pools
|
111
|
+
#
|
114
112
|
def update_job_servers
|
113
|
+
# Check if it's been > TIME_BETWEEN_CHECKS or we have no good servers
|
114
|
+
return unless time_to_check_connections || @job_servers.empty?
|
115
|
+
|
115
116
|
logger.debug "Found #{@bad_servers.size} zombie connections, checking pulse."
|
116
|
-
@
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
117
|
+
@servers_mutex.synchronize do
|
118
|
+
@bad_servers.each do |connection|
|
119
|
+
begin
|
120
|
+
message = "Testing server #{connection}..."
|
121
|
+
if connection.is_healthy?
|
122
|
+
logger.debug "#{message} Connection is healthy, putting back into service"
|
123
|
+
activate_connection(connection)
|
124
|
+
else
|
125
|
+
logger.debug "#{message} Still down."
|
126
|
+
end
|
124
127
|
end
|
125
128
|
end
|
126
129
|
end
|
130
|
+
|
131
|
+
# Sleep for a few to allow a chance for the world to become sane
|
132
|
+
if @job_servers.empty?
|
133
|
+
logger.warn "No job servers available, sleeping for #{SLEEP_TIME} seconds"
|
134
|
+
sleep(SLEEP_TIME)
|
135
|
+
end
|
136
|
+
|
137
|
+
@last_check_time = Time.now
|
127
138
|
end
|
128
139
|
|
129
140
|
|
data/lib/gearman/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -51,6 +51,19 @@ describe Gearman::Client do
|
|
51
51
|
|
52
52
|
end
|
53
53
|
|
54
|
+
it 'propagates NetworkErrors while submitting jobs' do
|
55
|
+
mock_connection = double(Gearman::Connection)
|
56
|
+
mock_connection.stub(:send_request).and_raise(Gearman::NetworkError)
|
57
|
+
mock_connection.stub(:hostport).and_return("localhost:4730")
|
58
|
+
|
59
|
+
@mock_connection_pool.stub(:get_connection) { mock_connection }
|
60
|
+
|
61
|
+
task = Gearman::Task.new("queue", "data")
|
62
|
+
|
63
|
+
expect {
|
64
|
+
@client.submit_job(task)
|
65
|
+
}.to raise_error(Gearman::NetworkError)
|
66
|
+
end
|
54
67
|
|
55
68
|
|
56
69
|
it "should raise a NetworkError when it didn't write as much as expected to a socket" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gearman-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Ewart
|
@@ -27,8 +27,10 @@ files:
|
|
27
27
|
- Rakefile
|
28
28
|
- examples/client.rb
|
29
29
|
- examples/client_background_jobs.rb
|
30
|
+
- examples/client_dedupe.rb
|
30
31
|
- examples/client_reverse_string.rb
|
31
32
|
- examples/worker.rb
|
33
|
+
- examples/worker_dedupe.rb
|
32
34
|
- examples/worker_reverse_string.rb
|
33
35
|
- gearman-ruby.gemspec
|
34
36
|
- lib/gearman.rb
|