officer 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +28 -7
- data/VERSION +1 -1
- data/bin/officer +1 -1
- data/lib/officer/client.rb +10 -2
- data/lib/officer/commands.rb +4 -1
- data/lib/officer/connection.rb +4 -0
- data/lib/officer/lock_store.rb +9 -0
- data/officer.gemspec +1 -1
- metadata +1 -1
data/README.markdown
CHANGED
@@ -18,8 +18,8 @@ Here are some simple examples in case you aren't familiar with it.
|
|
18
18
|
Officer's help information:
|
19
19
|
sudo officer run -- --help
|
20
20
|
|
21
|
-
Run Officer in the foreground with
|
22
|
-
sudo officer run -- -
|
21
|
+
Run Officer in the foreground with full logging and statistics:
|
22
|
+
sudo officer run -- -l debug -s
|
23
23
|
|
24
24
|
Run Officer in the background (production mode) and listen on a specific IP and port:
|
25
25
|
sudo officer start -- -h 127.0.0.1 -p 9999
|
@@ -33,41 +33,63 @@ Run Officer in the background (production mode) and listen on a specific IP and
|
|
33
33
|
require 'rubygems'
|
34
34
|
require 'officer'
|
35
35
|
|
36
|
-
### Create a client object
|
36
|
+
### Create a client object
|
37
37
|
|
38
38
|
client = Officer::Client.new :host => 'localhost', :port => 11500
|
39
39
|
|
40
|
+
Options:
|
41
|
+
|
42
|
+
- :host => Hostname or IP address of the server to bind to (default: 0.0.0.0).
|
43
|
+
- :port => TCP Port to listen on (default: 11500).
|
44
|
+
|
45
|
+
|
40
46
|
### Lock
|
41
47
|
|
42
48
|
client.lock 'some_lock_name'
|
43
49
|
|
50
|
+
Options:
|
51
|
+
|
52
|
+
- :timeout => The number of seconds to wait for a lock to become available (default: wait forever).
|
53
|
+
- :namespace => Prepend a namespace to each lock name (default: empty string).
|
54
|
+
- :queue_max => If the lock queue length is greater than :queue_max then don't wait for the lock.
|
55
|
+
|
56
|
+
|
44
57
|
### Unlock
|
45
58
|
|
46
59
|
client.unlock 'some_lock_name'
|
47
60
|
|
48
|
-
|
61
|
+
|
62
|
+
### Lock a block of code
|
49
63
|
|
50
64
|
client.with_lock('some_lock_name', :timeout => 5) do
|
51
65
|
puts 'hello world'
|
52
66
|
end
|
53
67
|
|
68
|
+
Options:
|
69
|
+
|
70
|
+
- Same options as the above Lock command.
|
71
|
+
|
72
|
+
|
54
73
|
### Release all locks for this connection
|
55
74
|
|
56
75
|
client.reset
|
57
76
|
|
77
|
+
|
58
78
|
### Reconnect (all locks will be released)
|
59
79
|
|
60
80
|
client.reconnect
|
61
81
|
|
62
82
|
- Useful if you use Officer with Phusion Passenger and smart spawning. See [Passenger's documentation](http://www.modrails.com/documentation/Users%20guide%20Apache.html#_smart_spawning_gotcha_1_unintential_file_descriptor_sharing) for more information.
|
63
83
|
|
64
|
-
|
84
|
+
|
85
|
+
### Show locks
|
65
86
|
|
66
87
|
client.locks
|
67
88
|
|
68
89
|
- Returns the internal state of all the server's locks.
|
69
90
|
|
70
|
-
|
91
|
+
|
92
|
+
### Show connections
|
71
93
|
|
72
94
|
client.connections
|
73
95
|
|
@@ -77,7 +99,6 @@ Run Officer in the background (production mode) and listen on a specific IP and
|
|
77
99
|
|
78
100
|
- Retrieve the list of locks for the current connection.
|
79
101
|
- Client: Option to abort a lock request if there is already a certain number of clients waiting for the lock.
|
80
|
-
- Client: Namespaced lock names.
|
81
102
|
- Server: configure the daemons gem to allow multiple server processes to run on one box.
|
82
103
|
- Tests
|
83
104
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.0
|
data/bin/officer
CHANGED
data/lib/officer/client.rb
CHANGED
@@ -10,12 +10,14 @@ module Officer
|
|
10
10
|
class AlreadyConnectedError < GenericError; end
|
11
11
|
class LockError < GenericError; end
|
12
12
|
class LockTimeoutError < LockError; end
|
13
|
+
class LockQueuedMaxError < LockError; end
|
13
14
|
class UnlockError < GenericError; end
|
14
15
|
|
15
16
|
class Client
|
16
17
|
def initialize options={}
|
17
18
|
@host = options[:host] || 'localhost'
|
18
19
|
@port = options[:port] || 11500
|
20
|
+
@namespace = options[:namespace]
|
19
21
|
|
20
22
|
connect
|
21
23
|
end
|
@@ -26,11 +28,12 @@ module Officer
|
|
26
28
|
end
|
27
29
|
|
28
30
|
def lock name, options={}
|
29
|
-
execute :command => 'lock', :name => name,
|
31
|
+
execute :command => 'lock', :name => name_with_ns(name),
|
32
|
+
:timeout => options[:timeout], :queue_max => options[:queue_max]
|
30
33
|
end
|
31
34
|
|
32
35
|
def unlock name
|
33
|
-
execute :command => 'unlock', :name => name
|
36
|
+
execute :command => 'unlock', :name => name_with_ns(name)
|
34
37
|
end
|
35
38
|
|
36
39
|
def with_lock name, options={}
|
@@ -38,6 +41,7 @@ module Officer
|
|
38
41
|
result = response['result']
|
39
42
|
|
40
43
|
raise LockTimeoutError if result == 'timed_out'
|
44
|
+
raise LockQueuedMaxError if result == 'queue_maxed'
|
41
45
|
raise LockError unless %w(acquired already_acquired).include?(result)
|
42
46
|
|
43
47
|
begin
|
@@ -85,6 +89,10 @@ module Officer
|
|
85
89
|
reconnect
|
86
90
|
raise
|
87
91
|
end
|
92
|
+
|
93
|
+
def name_with_ns name
|
94
|
+
@namespace ? "#{@namespace}:#{name}" : name
|
95
|
+
end
|
88
96
|
end
|
89
97
|
|
90
98
|
end
|
data/lib/officer/commands.rb
CHANGED
@@ -68,18 +68,21 @@ module Officer
|
|
68
68
|
register
|
69
69
|
|
70
70
|
def execute
|
71
|
-
Officer::LockStore.instance.acquire @name, @connection,
|
71
|
+
Officer::LockStore.instance.acquire @name, @connection,
|
72
|
+
:timeout => @timeout, :queue_max => @queue_max
|
72
73
|
end
|
73
74
|
|
74
75
|
private
|
75
76
|
def setup
|
76
77
|
@name = @request['name']
|
77
78
|
@timeout = @request['timeout']
|
79
|
+
@queue_max = @request['queue_max']
|
78
80
|
end
|
79
81
|
|
80
82
|
def valid?
|
81
83
|
require_string @request['name']
|
82
84
|
optional_positive_integer @request['timeout']
|
85
|
+
optional_positive_integer @request['queue_max']
|
83
86
|
end
|
84
87
|
end
|
85
88
|
|
data/lib/officer/connection.rb
CHANGED
@@ -77,6 +77,10 @@ module Officer
|
|
77
77
|
def connections conns_hash
|
78
78
|
send_result 'connections', :value => conns_hash
|
79
79
|
end
|
80
|
+
|
81
|
+
def queue_maxed name
|
82
|
+
send_result 'queue_maxed', :name => name
|
83
|
+
end
|
80
84
|
end
|
81
85
|
|
82
86
|
class Connection < EventMachine::Protocols::LineAndTextProtocol
|
data/lib/officer/lock_store.rb
CHANGED
@@ -46,6 +46,15 @@ module Officer
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def acquire name, connection, options={}
|
49
|
+
if options[:queue_max]
|
50
|
+
if @locks[name] && !@locks[name].queue.include?(connection)
|
51
|
+
if @locks[name].queue.length >= options[:queue_max]
|
52
|
+
connection.queue_maxed name
|
53
|
+
return
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
49
58
|
@acquire_counter += 1
|
50
59
|
|
51
60
|
lock = @locks[name] ||= Lock.new(name)
|
data/officer.gemspec
CHANGED