fraggle-block 0.1.0 → 0.2.0
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.
- data/README.md +6 -0
- data/fraggle-block.gemspec +0 -1
- data/lib/fraggle/block.rb +2 -2
- data/lib/fraggle/block/client.rb +22 -5
- data/lib/fraggle/block/connection.rb +22 -13
- data/lib/fraggle/block/msg.pb.rb +9 -10
- data/lib/fraggle/block/response.rb +1 -8
- data/lib/fraggle/block/version.rb +1 -1
- data/msg.proto +57 -0
- metadata +46 -74
data/README.md
CHANGED
@@ -24,3 +24,9 @@ A synchronous Ruby client for [Doozer](https://github.com/ha/doozer).
|
|
24
24
|
=> nil
|
25
25
|
|
26
26
|
See [examples](https://github.com/dylanegan/fraggle-block/tree/master/examples) for more.
|
27
|
+
|
28
|
+
|
29
|
+
# Generate ProtoBuf code
|
30
|
+
|
31
|
+
BEEFCAKE_NAMESPACE=Fraggle::Block protoc --beefcake_out lib/fraggle/block/ -I . msg.proto
|
32
|
+
|
data/fraggle-block.gemspec
CHANGED
data/lib/fraggle/block.rb
CHANGED
@@ -3,7 +3,7 @@ require 'fraggle/block/response'
|
|
3
3
|
|
4
4
|
module Fraggle
|
5
5
|
module Block
|
6
|
-
DEFAULT_URI = "
|
6
|
+
DEFAULT_URI = "doozer:?" + [
|
7
7
|
"ca=127.0.0.1:8046",
|
8
8
|
"ca=127.0.0.1:8041",
|
9
9
|
"ca=127.0.0.1:8042",
|
@@ -24,7 +24,7 @@ module Fraggle
|
|
24
24
|
|
25
25
|
module URI
|
26
26
|
def self.parse(u)
|
27
|
-
if u =~ /^
|
27
|
+
if u =~ /^doozer:\?(.*)$/
|
28
28
|
parts = $1.split("&")
|
29
29
|
parts.inject([]) do |m, pt|
|
30
30
|
k, v = pt.split("=")
|
data/lib/fraggle/block/client.rb
CHANGED
@@ -12,6 +12,9 @@ module Fraggle
|
|
12
12
|
|
13
13
|
def initialize(addrs = [])
|
14
14
|
@addrs = addrs
|
15
|
+
if not @addrs or @addrs.length == 0
|
16
|
+
raise "No doozer servers to connect to"
|
17
|
+
end
|
15
18
|
connect
|
16
19
|
end
|
17
20
|
|
@@ -40,9 +43,22 @@ module Fraggle
|
|
40
43
|
send(request).first
|
41
44
|
end
|
42
45
|
|
43
|
-
def walk(path, rev = nil)
|
44
|
-
|
45
|
-
|
46
|
+
def walk(path, rev = nil, offset = 0)
|
47
|
+
all_responses = []
|
48
|
+
done = false
|
49
|
+
while not done
|
50
|
+
request = Request.new(:path => path, :rev => rev, :verb => WALK, :offset => offset)
|
51
|
+
responses = send(request)
|
52
|
+
responses.each do |response|
|
53
|
+
if response.err_code == Response::Err::RANGE
|
54
|
+
done = true
|
55
|
+
break
|
56
|
+
end
|
57
|
+
all_responses.push response
|
58
|
+
offset += 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
return all_responses
|
46
62
|
end
|
47
63
|
|
48
64
|
def disconnect
|
@@ -57,7 +73,7 @@ module Fraggle
|
|
57
73
|
def connect
|
58
74
|
begin
|
59
75
|
host, port = @addrs.shift.split(':')
|
60
|
-
@connection = connection_to(host, port)
|
76
|
+
@connection = connection_to(host, port.to_i)
|
61
77
|
find_all_of_the_nodes
|
62
78
|
rescue => e
|
63
79
|
retry if @addrs.any?
|
@@ -70,7 +86,8 @@ module Fraggle
|
|
70
86
|
end
|
71
87
|
|
72
88
|
def find_all_of_the_nodes
|
73
|
-
|
89
|
+
response = rev()
|
90
|
+
walk('/ctl/node/*/addr', response.rev).each do |node|
|
74
91
|
@addrs << node.value unless @addrs.include? node.value
|
75
92
|
end
|
76
93
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'fraggle/block/msg.pb'
|
2
2
|
require 'socket'
|
3
|
-
require "system_timer"
|
4
3
|
|
5
4
|
module Fraggle
|
6
5
|
module Block
|
@@ -18,11 +17,24 @@ module Fraggle
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def connect
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
# http://stackoverflow.com/questions/231647/how-do-i-set-the-socket-timeout-in-ruby
|
21
|
+
timeout = 10
|
22
|
+
addr = Socket.getaddrinfo(@host, nil)
|
23
|
+
sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
|
24
|
+
|
25
|
+
begin
|
26
|
+
sock.connect_nonblock(Socket.pack_sockaddr_in(@port, addr[0][3]))
|
27
|
+
rescue Errno::EINPROGRESS
|
28
|
+
resp = IO.select(nil, [sock], nil, timeout.to_i)
|
29
|
+
if resp.nil?
|
30
|
+
raise Errno::ECONNREFUSED
|
31
|
+
end
|
32
|
+
begin
|
33
|
+
sock.connect_nonblock(Socket.pack_sockaddr_in(@port, addr[0][3]))
|
34
|
+
rescue Errno::EISCONN
|
25
35
|
end
|
36
|
+
end
|
37
|
+
sock
|
26
38
|
end
|
27
39
|
|
28
40
|
def disconnect
|
@@ -38,14 +50,11 @@ module Fraggle
|
|
38
50
|
|
39
51
|
def read
|
40
52
|
responses = []
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
responses << response if response.valid?
|
47
|
-
break if response.done?
|
48
|
-
end
|
53
|
+
head = @sock.read(4)
|
54
|
+
length = head.unpack("N")[0]
|
55
|
+
data = @sock.read(length)
|
56
|
+
response = Response.decode(data)
|
57
|
+
responses << response if response.valid?
|
49
58
|
responses
|
50
59
|
end
|
51
60
|
end
|
data/lib/fraggle/block/msg.pb.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
## Generated from msg.proto for
|
1
|
+
## Generated from msg.proto for server
|
2
2
|
require "beefcake"
|
3
3
|
|
4
4
|
module Fraggle
|
@@ -11,23 +11,21 @@ module Fraggle
|
|
11
11
|
GET = 1
|
12
12
|
SET = 2
|
13
13
|
DEL = 3
|
14
|
-
ESET = 4
|
15
14
|
REV = 5
|
15
|
+
WAIT = 6
|
16
16
|
NOP = 7
|
17
|
-
WATCH = 8
|
18
17
|
WALK = 9
|
19
|
-
CANCEL = 10
|
20
18
|
GETDIR = 14
|
21
19
|
STAT = 16
|
20
|
+
ACCESS = 99
|
22
21
|
end
|
23
22
|
|
24
|
-
|
25
|
-
|
23
|
+
optional :tag, :int32, 1
|
24
|
+
optional :verb, Request::Verb, 2
|
26
25
|
optional :path, :string, 4
|
27
26
|
optional :value, :bytes, 5
|
28
27
|
optional :other_tag, :int32, 6
|
29
28
|
optional :offset, :int32, 7
|
30
|
-
optional :limit, :int32, 8
|
31
29
|
optional :rev, :int64, 9
|
32
30
|
|
33
31
|
end
|
@@ -39,18 +37,19 @@ module Fraggle
|
|
39
37
|
OTHER = 127
|
40
38
|
TAG_IN_USE = 1
|
41
39
|
UNKNOWN_VERB = 2
|
42
|
-
|
40
|
+
READONLY = 3
|
43
41
|
TOO_LATE = 4
|
44
42
|
REV_MISMATCH = 5
|
45
43
|
BAD_PATH = 6
|
46
44
|
MISSING_ARG = 7
|
45
|
+
RANGE = 8
|
47
46
|
NOTDIR = 20
|
48
47
|
ISDIR = 21
|
49
48
|
NOENT = 22
|
50
49
|
end
|
51
50
|
|
52
|
-
|
53
|
-
|
51
|
+
optional :tag, :int32, 1
|
52
|
+
optional :flags, :int32, 2
|
54
53
|
optional :rev, :int64, 3
|
55
54
|
optional :path, :string, 5
|
56
55
|
optional :value, :bytes, 6
|
data/msg.proto
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
package server;
|
2
|
+
|
3
|
+
// see doc/proto.md
|
4
|
+
message Request {
|
5
|
+
optional int32 tag = 1;
|
6
|
+
|
7
|
+
enum Verb {
|
8
|
+
GET = 1;
|
9
|
+
SET = 2;
|
10
|
+
DEL = 3;
|
11
|
+
REV = 5;
|
12
|
+
WAIT = 6;
|
13
|
+
NOP = 7;
|
14
|
+
WALK = 9;
|
15
|
+
GETDIR = 14;
|
16
|
+
STAT = 16;
|
17
|
+
ACCESS = 99;
|
18
|
+
}
|
19
|
+
optional Verb verb = 2;
|
20
|
+
|
21
|
+
optional string path = 4;
|
22
|
+
optional bytes value = 5;
|
23
|
+
optional int32 other_tag = 6;
|
24
|
+
|
25
|
+
optional int32 offset = 7;
|
26
|
+
|
27
|
+
optional int64 rev = 9;
|
28
|
+
}
|
29
|
+
|
30
|
+
// see doc/proto.md
|
31
|
+
message Response {
|
32
|
+
optional int32 tag = 1;
|
33
|
+
optional int32 flags = 2;
|
34
|
+
|
35
|
+
optional int64 rev = 3;
|
36
|
+
optional string path = 5;
|
37
|
+
optional bytes value = 6;
|
38
|
+
optional int32 len = 8;
|
39
|
+
|
40
|
+
enum Err {
|
41
|
+
// don't use value 0
|
42
|
+
OTHER = 127;
|
43
|
+
TAG_IN_USE = 1;
|
44
|
+
UNKNOWN_VERB = 2;
|
45
|
+
READONLY = 3;
|
46
|
+
TOO_LATE = 4;
|
47
|
+
REV_MISMATCH = 5;
|
48
|
+
BAD_PATH = 6;
|
49
|
+
MISSING_ARG = 7;
|
50
|
+
RANGE = 8;
|
51
|
+
NOTDIR = 20;
|
52
|
+
ISDIR = 21;
|
53
|
+
NOENT = 22;
|
54
|
+
}
|
55
|
+
optional Err err_code = 100;
|
56
|
+
optional string err_detail = 101;
|
57
|
+
}
|
metadata
CHANGED
@@ -1,78 +1,58 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: fraggle-block
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 0.1.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Dylan Egan
|
14
9
|
- Blake Mizerany
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2012-04-10 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: beefcake
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
19
|
+
requirements:
|
27
20
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 3
|
33
|
-
version: "0.3"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.3'
|
34
23
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: system_timer
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
26
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
46
|
-
- 1
|
47
|
-
- 0
|
48
|
-
version: "1.0"
|
49
|
-
type: :runtime
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0.3'
|
31
|
+
- !ruby/object:Gem::Dependency
|
52
32
|
name: turn
|
53
|
-
|
54
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
55
34
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
63
39
|
type: :development
|
64
|
-
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
65
47
|
description: A synchronous Ruby client for Doozer.
|
66
|
-
email:
|
48
|
+
email:
|
67
49
|
- dylanegan@gmail.com
|
68
50
|
- blake.mizerany@gmail.com
|
69
|
-
executables:
|
51
|
+
executables:
|
70
52
|
- fraggle-block
|
71
53
|
extensions: []
|
72
|
-
|
73
54
|
extra_rdoc_files: []
|
74
|
-
|
75
|
-
files:
|
55
|
+
files:
|
76
56
|
- .gitignore
|
77
57
|
- Gemfile
|
78
58
|
- README.md
|
@@ -86,43 +66,35 @@ files:
|
|
86
66
|
- lib/fraggle/block/msg.pb.rb
|
87
67
|
- lib/fraggle/block/response.rb
|
88
68
|
- lib/fraggle/block/version.rb
|
69
|
+
- msg.proto
|
89
70
|
- test/client_test.rb
|
90
71
|
- test/connection_test.rb
|
91
72
|
- test/helper.rb
|
92
73
|
homepage: https://github.com/dylanegan/fraggle-block
|
93
74
|
licenses: []
|
94
|
-
|
95
75
|
post_install_message:
|
96
76
|
rdoc_options: []
|
97
|
-
|
98
|
-
require_paths:
|
77
|
+
require_paths:
|
99
78
|
- lib
|
100
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
80
|
none: false
|
102
|
-
requirements:
|
103
|
-
- -
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
|
106
|
-
|
107
|
-
- 0
|
108
|
-
version: "0"
|
109
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
86
|
none: false
|
111
|
-
requirements:
|
112
|
-
- -
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
segments:
|
116
|
-
- 0
|
117
|
-
version: "0"
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
118
91
|
requirements: []
|
119
|
-
|
120
92
|
rubyforge_project: fraggle-block
|
121
|
-
rubygems_version: 1.
|
93
|
+
rubygems_version: 1.8.21
|
122
94
|
signing_key:
|
123
95
|
specification_version: 3
|
124
96
|
summary: A synchronous Ruby client for Doozer.
|
125
|
-
test_files:
|
97
|
+
test_files:
|
126
98
|
- test/client_test.rb
|
127
99
|
- test/connection_test.rb
|
128
100
|
- test/helper.rb
|