elasticsearch-transport 1.0.12 → 1.0.13
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/lib/elasticsearch/transport/client.rb +17 -14
- data/lib/elasticsearch/transport/transport/base.rb +2 -1
- data/lib/elasticsearch/transport/transport/connections/connection.rb +16 -7
- data/lib/elasticsearch/transport/transport/sniffer.rb +5 -2
- data/lib/elasticsearch/transport/version.rb +1 -1
- data/test/integration/client_test.rb +4 -0
- data/test/integration/transport_test.rb +4 -0
- data/test/unit/client_test.rb +17 -6
- data/test/unit/sniffer_test.rb +28 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfbb24f919ca5c508c660a9b121fb0937b16d5ab
|
4
|
+
data.tar.gz: 2efeb80ae1defb9578b2b62d2834f61b86e75983
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aefe90beda8b000367535d535156786126c8f7b49d98cd637352a0cdc1a054f248fd7225973cc2b7a7be72207bfedf9b28bfd475f138144110b79082daa6c37b
|
7
|
+
data.tar.gz: e959b3c3c12990b2280ac9ad3836c3cdfb7c63a90ca5a46f2c78c50d974c3de921602b6f927749a7cc5d29f71809706bfb1705cd643a3e2680e0e1c01bb95ad2
|
@@ -143,22 +143,25 @@ module Elasticsearch
|
|
143
143
|
end
|
144
144
|
|
145
145
|
result = hosts.map do |host|
|
146
|
-
case host
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
146
|
+
host_parts = case host
|
147
|
+
when String
|
148
|
+
if host =~ /^[a-z]+\:\/\//
|
149
|
+
uri = URI.parse(host)
|
150
|
+
{ :scheme => uri.scheme, :user => uri.user, :password => uri.password, :host => uri.host, :path => uri.path, :port => uri.port }
|
151
|
+
else
|
152
|
+
host, port = host.split(':')
|
153
|
+
{ :host => host, :port => port }
|
154
|
+
end
|
155
|
+
when URI
|
156
|
+
{ :scheme => host.scheme, :user => host.user, :password => host.password, :host => host.host, :path => host.path, :port => host.port }
|
157
|
+
when Hash
|
158
|
+
host
|
151
159
|
else
|
152
|
-
host,
|
153
|
-
{ :host => host, :port => port }
|
160
|
+
raise ArgumentError, "Please pass host as a String, URI or Hash -- #{host.class} given."
|
154
161
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
host
|
159
|
-
else
|
160
|
-
raise ArgumentError, "Please pass host as a String, URI or Hash -- #{host.class} given."
|
161
|
-
end
|
162
|
+
|
163
|
+
host_parts[:port] = host_parts[:port].to_i unless host_parts[:port].nil?
|
164
|
+
host_parts
|
162
165
|
end
|
163
166
|
|
164
167
|
result.shuffle! if options[:randomize_hosts]
|
@@ -41,6 +41,7 @@ module Elasticsearch
|
|
41
41
|
|
42
42
|
@sniffer = options[:sniffer_class] ? options[:sniffer_class].new(self) : Sniffer.new(self)
|
43
43
|
@counter = 0
|
44
|
+
@counter_mtx = Mutex.new
|
44
45
|
@last_request_at = Time.now
|
45
46
|
@reload_connections = options[:reload_connections]
|
46
47
|
@reload_after = options[:reload_connections].is_a?(Fixnum) ? options[:reload_connections] : DEFAULT_RELOAD_AFTER
|
@@ -60,7 +61,7 @@ module Elasticsearch
|
|
60
61
|
resurrect_dead_connections! if Time.now > @last_request_at + @resurrect_after
|
61
62
|
|
62
63
|
connection = connections.get_connection(options)
|
63
|
-
@counter
|
64
|
+
@counter_mtx.synchronize { @counter += 1 }
|
64
65
|
|
65
66
|
reload_connections! if reload_connections && counter % reload_after == 0
|
66
67
|
connection
|
@@ -26,6 +26,7 @@ module Elasticsearch
|
|
26
26
|
@host = arguments[:host]
|
27
27
|
@connection = arguments[:connection]
|
28
28
|
@options = arguments[:options] || {}
|
29
|
+
@state_mutex = Mutex.new
|
29
30
|
|
30
31
|
@options[:resurrect_timeout] ||= DEFAULT_RESURRECT_TIMEOUT
|
31
32
|
@failures = 0
|
@@ -65,9 +66,11 @@ module Elasticsearch
|
|
65
66
|
# @return [self]
|
66
67
|
#
|
67
68
|
def dead!
|
68
|
-
@
|
69
|
-
|
70
|
-
|
69
|
+
@state_mutex.synchronize do
|
70
|
+
@dead = true
|
71
|
+
@failures += 1
|
72
|
+
@dead_since = Time.now
|
73
|
+
end
|
71
74
|
self
|
72
75
|
end
|
73
76
|
|
@@ -76,7 +79,9 @@ module Elasticsearch
|
|
76
79
|
# @return [self]
|
77
80
|
#
|
78
81
|
def alive!
|
79
|
-
@
|
82
|
+
@state_mutex.synchronize do
|
83
|
+
@dead = false
|
84
|
+
end
|
80
85
|
self
|
81
86
|
end
|
82
87
|
|
@@ -85,8 +90,10 @@ module Elasticsearch
|
|
85
90
|
# @return [self]
|
86
91
|
#
|
87
92
|
def healthy!
|
88
|
-
@
|
89
|
-
|
93
|
+
@state_mutex.synchronize do
|
94
|
+
@dead = false
|
95
|
+
@failures = 0
|
96
|
+
end
|
90
97
|
self
|
91
98
|
end
|
92
99
|
|
@@ -105,7 +112,9 @@ module Elasticsearch
|
|
105
112
|
# @return [Boolean]
|
106
113
|
#
|
107
114
|
def resurrectable?
|
108
|
-
|
115
|
+
@state_mutex.synchronize {
|
116
|
+
Time.now > @dead_since + ( @options[:resurrect_timeout] * 2 ** (@failures-1) )
|
117
|
+
}
|
109
118
|
end
|
110
119
|
|
111
120
|
# @return [String]
|
@@ -5,7 +5,8 @@ module Elasticsearch
|
|
5
5
|
# Handles node discovery ("sniffing").
|
6
6
|
#
|
7
7
|
class Sniffer
|
8
|
-
|
8
|
+
ES1_RE_URL = /\/([^:]*):([0-9]+)\]/ # Use named groups on Ruby 1.9: /\/(?<host>[^:]*):(?<port>[0-9]+)\]/
|
9
|
+
ES2_RE_URL = /([^:]*):([0-9]+)/
|
9
10
|
|
10
11
|
attr_reader :transport
|
11
12
|
attr_accessor :timeout
|
@@ -30,7 +31,9 @@ module Elasticsearch
|
|
30
31
|
Timeout::timeout(timeout, SnifferTimeoutError) do
|
31
32
|
nodes = transport.perform_request('GET', '_nodes/http').body
|
32
33
|
hosts = nodes['nodes'].map do |id,info|
|
33
|
-
|
34
|
+
addr_str = info["#{transport.protocol}_address"].to_s
|
35
|
+
matches = addr_str.match(ES1_RE_URL) || addr_str.match(ES2_RE_URL)
|
36
|
+
if matches
|
34
37
|
# TODO: Implement lightweight "indifferent access" here
|
35
38
|
info.merge :host => matches[1], :port => matches[2], :id => id
|
36
39
|
end
|
@@ -5,6 +5,10 @@ class Elasticsearch::Transport::ClientIntegrationTest < Elasticsearch::Test::Int
|
|
5
5
|
Elasticsearch::Extensions::Test::Cluster.start(nodes: 2) if ENV['SERVER'] and not Elasticsearch::Extensions::Test::Cluster.running?
|
6
6
|
end
|
7
7
|
|
8
|
+
shutdown do
|
9
|
+
Elasticsearch::Extensions::Test::Cluster.stop if ENV['SERVER'] and Elasticsearch::Extensions::Test::Cluster.running?
|
10
|
+
end
|
11
|
+
|
8
12
|
context "Elasticsearch client" do
|
9
13
|
teardown do
|
10
14
|
begin; Object.send(:remove_const, :Typhoeus); rescue NameError; end
|
@@ -5,6 +5,10 @@ class Elasticsearch::Transport::ClientIntegrationTest < Elasticsearch::Test::Int
|
|
5
5
|
Elasticsearch::Extensions::Test::Cluster.start(nodes: 2) if ENV['SERVER'] and not Elasticsearch::Extensions::Test::Cluster.running?
|
6
6
|
end
|
7
7
|
|
8
|
+
shutdown do
|
9
|
+
Elasticsearch::Extensions::Test::Cluster.stop if ENV['SERVER'] and Elasticsearch::Extensions::Test::Cluster.running?
|
10
|
+
end
|
11
|
+
|
8
12
|
context "Transport" do
|
9
13
|
setup do
|
10
14
|
@port = (ENV['TEST_CLUSTER_PORT'] || 9250).to_i
|
data/test/unit/client_test.rb
CHANGED
@@ -127,6 +127,17 @@ class Elasticsearch::Transport::ClientTest < Test::Unit::TestCase
|
|
127
127
|
hosts = @client.__extract_hosts( { :host => 'myhost', :scheme => 'https' } )
|
128
128
|
assert_equal 'myhost', hosts[0][:host]
|
129
129
|
assert_equal 'https', hosts[0][:scheme]
|
130
|
+
assert_nil hosts[0][:port]
|
131
|
+
end
|
132
|
+
|
133
|
+
should "extract from hash with a port passed as a string" do
|
134
|
+
hosts = @client.__extract_hosts( { :host => 'myhost', :scheme => 'https', :port => '443' } )
|
135
|
+
assert_equal 443, hosts[0][:port]
|
136
|
+
end
|
137
|
+
|
138
|
+
should "extract from hash with a port passed as an integer" do
|
139
|
+
hosts = @client.__extract_hosts( { :host => 'myhost', :scheme => 'https', :port => 443 } )
|
140
|
+
assert_equal 443, hosts[0][:port]
|
130
141
|
end
|
131
142
|
|
132
143
|
should "extract from Hashie::Mash" do
|
@@ -154,10 +165,10 @@ class Elasticsearch::Transport::ClientTest < Test::Unit::TestCase
|
|
154
165
|
assert_equal 2, hosts.size
|
155
166
|
|
156
167
|
assert_equal 'host1', hosts[0][:host]
|
157
|
-
assert_equal
|
168
|
+
assert_equal 1000, hosts[0][:port]
|
158
169
|
|
159
170
|
assert_equal 'host2', hosts[1][:host]
|
160
|
-
assert_equal
|
171
|
+
assert_equal 2000, hosts[1][:port]
|
161
172
|
end
|
162
173
|
|
163
174
|
should "extract path" do
|
@@ -171,7 +182,7 @@ class Elasticsearch::Transport::ClientTest < Test::Unit::TestCase
|
|
171
182
|
|
172
183
|
assert_equal 'https', hosts[0][:scheme]
|
173
184
|
assert_equal 'myhost', hosts[0][:host]
|
174
|
-
assert_equal
|
185
|
+
assert_equal 8080, hosts[0][:port]
|
175
186
|
end
|
176
187
|
|
177
188
|
should "extract credentials" do
|
@@ -181,14 +192,14 @@ class Elasticsearch::Transport::ClientTest < Test::Unit::TestCase
|
|
181
192
|
assert_equal 'USERNAME', hosts[0][:user]
|
182
193
|
assert_equal 'PASSWORD', hosts[0][:password]
|
183
194
|
assert_equal 'myhost', hosts[0][:host]
|
184
|
-
assert_equal
|
195
|
+
assert_equal 8080, hosts[0][:port]
|
185
196
|
end
|
186
197
|
|
187
198
|
should "pass hashes over" do
|
188
199
|
hosts = @client.__extract_hosts [{:host => 'myhost', :port => '1000', :foo => 'bar'}]
|
189
200
|
|
190
201
|
assert_equal 'myhost', hosts[0][:host]
|
191
|
-
assert_equal
|
202
|
+
assert_equal 1000, hosts[0][:port]
|
192
203
|
assert_equal 'bar', hosts[0][:foo]
|
193
204
|
end
|
194
205
|
|
@@ -200,7 +211,7 @@ class Elasticsearch::Transport::ClientTest < Test::Unit::TestCase
|
|
200
211
|
assert_equal 'USERNAME', hosts[0][:user]
|
201
212
|
assert_equal 'PASSWORD', hosts[0][:password]
|
202
213
|
assert_equal 'myhost', hosts[0][:host]
|
203
|
-
assert_equal
|
214
|
+
assert_equal 4430, hosts[0][:port]
|
204
215
|
end
|
205
216
|
|
206
217
|
should "split comma-separated URLs" do
|
data/test/unit/sniffer_test.rb
CHANGED
@@ -21,7 +21,7 @@ class Elasticsearch::Transport::Transport::SnifferTest < Test::Unit::TestCase
|
|
21
21
|
assert_equal @transport, @sniffer.transport
|
22
22
|
end
|
23
23
|
|
24
|
-
should "return an array of hosts as hashes" do
|
24
|
+
should "return an array of hosts as hashes with Elasticsearch 1.x syntax" do
|
25
25
|
@transport.expects(:perform_request).returns __nodes_info <<-JSON
|
26
26
|
{
|
27
27
|
"ok" : true,
|
@@ -48,6 +48,33 @@ class Elasticsearch::Transport::Transport::SnifferTest < Test::Unit::TestCase
|
|
48
48
|
assert_equal 'Node 1', hosts.first['name']
|
49
49
|
end
|
50
50
|
|
51
|
+
should "return an array of hosts as hashes with Elasticsearch 2.0 syntax" do
|
52
|
+
@transport.expects(:perform_request).returns __nodes_info <<-JSON
|
53
|
+
{
|
54
|
+
"ok" : true,
|
55
|
+
"cluster_name" : "elasticsearch_test",
|
56
|
+
"nodes" : {
|
57
|
+
"N1" : {
|
58
|
+
"name" : "Node 1",
|
59
|
+
"transport_address" : "192.168.1.23:9300",
|
60
|
+
"hostname" : "testhost1",
|
61
|
+
"version" : "0.20.6",
|
62
|
+
"http_address" : "192.168.1.23:9200",
|
63
|
+
"thrift_address" : "192.168.1.23:9500",
|
64
|
+
"memcached_address" : "192.168.1.23:11211"
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
JSON
|
69
|
+
|
70
|
+
hosts = @sniffer.hosts
|
71
|
+
|
72
|
+
assert_equal 1, hosts.size
|
73
|
+
assert_equal '192.168.1.23', hosts.first[:host]
|
74
|
+
assert_equal '9200', hosts.first[:port]
|
75
|
+
assert_equal 'Node 1', hosts.first['name']
|
76
|
+
end
|
77
|
+
|
51
78
|
should "skip hosts without a matching transport protocol" do
|
52
79
|
@transport = DummyTransport.new :options => { :protocol => 'memcached' }
|
53
80
|
@sniffer = Elasticsearch::Transport::Transport::Sniffer.new @transport
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-transport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|