thrift_client 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,9 +1,11 @@
1
+ v0.4.3 Bug fixes: handle_exception could be called more than once. Integer types are read signed.
2
+
1
3
  v0.4.2 Allow per-method overrides of retries. Fix several bugs with EventMachine.
2
4
 
3
5
  v0.4.1 Making ThriftClient decoratable. Able to add new functionality a class definition.
4
6
 
5
7
  v0.4.0. Add new EventMachine transport. This requires two layers of transport
6
- configurability:
8
+ configurability:
7
9
  options[:transport] for EventMachine or Socket transports
8
10
  options[:transport_wrapper] for optional Buffered or Framed Transport.
9
11
  Clients will need to update their options to ensure they don't conflict with this change. (mperham)
data/lib/thrift_client.rb CHANGED
@@ -26,7 +26,8 @@ Valid optional parameters are:
26
26
 
27
27
  <tt>:protocol</tt>:: Which Thrift protocol to use. Defaults to <tt>Thrift::BinaryProtocol</tt>.
28
28
  <tt>:protocol_extra_params</tt>:: An array of additional parameters to pass to the protocol initialization call. Defaults to <tt>[]</tt>.
29
- <tt>:transport</tt>:: Which Thrift transport to use. Defaults to <tt>Thrift::FramedTransport</tt>.
29
+ <tt>:transport</tt>:: Which Thrift transport to use. Defaults to <tt>Thrift::Socket</tt>.
30
+ <tt>:transport_wrapper</tt>:: Which Thrift transport wrapper to use. Defaults to <tt>Thrift::FramedTransport</tt>.
30
31
  <tt>:randomize_server_list</tt>:: Whether to connect to the servers randomly, instead of in order. Defaults to <tt>true</tt>.
31
32
  <tt>:exception_classes</tt>:: Which exceptions to catch and retry when sending a request. Defaults to <tt>[IOError, Thrift::Exception, Thrift::ProtocolException, Thrift::ApplicationException, Thrift::TransportException, NoServersAvailable]</tt>
32
33
  <tt>:raise</tt>:: Whether to reraise errors if no responsive servers are found. Defaults to <tt>true</tt>.
@@ -153,7 +153,7 @@ class AbstractThriftClient
153
153
  disconnect_on_error!
154
154
  tries ||= (@options[:retry_overrides][method_name.to_sym] || @retries)
155
155
  tries -= 1
156
- tries == 0 ? handle_exception(e, method_name, args) : retry
156
+ tries == 0 ? raise : retry
157
157
  end
158
158
 
159
159
  def send_rpc(method_name, *args)
@@ -26,6 +26,10 @@ module Thrift
26
26
  fiber.resume
27
27
  end
28
28
  Fiber.yield
29
+
30
+ # Use Thrift::TransportException so the RetryingThriftClient knows to try the next
31
+ # server instead of raising the error.
32
+ raise Thrift::TransportException, "Unable to connect to #{@host}:#{@port}" unless @connection.connected?
29
33
  @connection
30
34
  end
31
35
 
@@ -65,32 +69,30 @@ module Thrift
65
69
  def initialize(host, port=9090)
66
70
  @host, @port = host, port
67
71
  @index = 0
68
- @connected = false
72
+ @disconnected = 'not connected'
69
73
  @buf = ''
70
74
  end
71
75
 
72
76
  def close
73
77
  trap do
74
- @connected = false
78
+ @disconnected = 'closed'
75
79
  close_connection(true)
76
80
  end
77
81
  end
78
82
 
79
83
  def blocking_read(size)
80
- raise IOError, "lost connection to #{@host}:#{@port}" unless @connected
81
- trap do
82
- if can_read?(size)
83
- yank(size)
84
- else
85
- raise ArgumentError, "Unexpected state" if @size or @callback
86
-
87
- fiber = Fiber.current
88
- @size = size
89
- @callback = proc { |data|
90
- fiber.resume(data)
91
- }
92
- Fiber.yield
93
- end
84
+ raise IOError, "lost connection to #{@host}:#{@port}: #{@disconnected}" if @disconnected
85
+ if can_read?(size)
86
+ yank(size)
87
+ else
88
+ raise ArgumentError, "Unexpected state" if @size or @callback
89
+
90
+ fiber = Fiber.current
91
+ @size = size
92
+ @callback = proc { |data|
93
+ fiber.resume(data)
94
+ }
95
+ Fiber.yield
94
96
  end
95
97
  end
96
98
 
@@ -108,17 +110,17 @@ module Thrift
108
110
  end
109
111
 
110
112
  def connected?
111
- @connected
113
+ !@disconnected
112
114
  end
113
115
 
114
116
  def connection_completed
115
- @connected = true
117
+ @disconnected = nil
116
118
  succeed
117
119
  end
118
120
 
119
121
  def unbind
120
- if @connected
121
- @connected = false
122
+ if !@disconnected
123
+ @disconnected = 'unbound'
122
124
  else
123
125
  fail
124
126
  end
@@ -100,7 +100,8 @@ class ThriftClient
100
100
  s.read(len)
101
101
  when I64
102
102
  hi, lo = s.read(8).unpack("NN")
103
- (hi << 32) | lo
103
+ rv = (hi << 32) | lo
104
+ (rv >= (1 << 63)) ? (rv - (1 << 64)) : rv
104
105
  when LIST
105
106
  read_list(s)
106
107
  when MAP
@@ -114,7 +115,15 @@ class ThriftClient
114
115
  when StructType
115
116
  read_struct(s, type.struct_class)
116
117
  else
117
- s.read(SIZES[type]).unpack(FORMATS[type]).first
118
+ rv = s.read(SIZES[type]).unpack(FORMATS[type]).first
119
+ case type
120
+ when I16
121
+ (rv >= (1 << 15)) ? (rv - (1 << 16)) : rv
122
+ when I32
123
+ (rv >= (1 << 31)) ? (rv - (1 << 32)) : rv
124
+ else
125
+ rv
126
+ end
118
127
  end
119
128
  end
120
129
 
@@ -44,6 +44,21 @@ class ThriftClientTest < Test::Unit::TestCase
44
44
  end
45
45
  end
46
46
 
47
+ def test_handle_exception_is_called_once_when_retrying
48
+ client = ThriftClient.new(Greeter::Client, @servers.first, @options.merge(:raise => false, :retries => 1))
49
+ client.options[:exception_classes] += [ThriftClient::NoServersAvailable]
50
+ singleton_class = (class << client; self end)
51
+
52
+ times_called = 0
53
+ singleton_class.send :define_method, :handle_exception do |*args|
54
+ times_called += 1
55
+ raise IOError
56
+ end
57
+
58
+ assert_raises(IOError) { client.greeting('someone') }
59
+ assert_equal 1, times_called
60
+ end
61
+
47
62
  def test_dont_raise_with_defaults
48
63
  client = ThriftClient.new(Greeter::Client, @servers.first, @options.merge(:raise => false, :defaults => {:greeting => 1}))
49
64
  assert_equal 1, client.greeting
@@ -2,12 +2,12 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{thrift_client}
5
- s.version = "0.4.2"
5
+ s.version = "0.4.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0.8") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Evan Weaver"]
9
- s.cert_chain = ["/Users/ryan/.gemkeys/gem-public_cert.pem"]
10
- s.date = %q{2010-04-08}
9
+ s.cert_chain = ["/Users/freels/.gemkeys/gem-public_cert.pem"]
10
+ s.date = %q{2010-05-10}
11
11
  s.description = %q{A Thrift client wrapper that encapsulates some common failover behavior.}
12
12
  s.email = %q{}
13
13
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.rdoc", "lib/thrift_client.rb", "lib/thrift_client/abstract_thrift_client.rb", "lib/thrift_client/connection.rb", "lib/thrift_client/connection/base.rb", "lib/thrift_client/connection/factory.rb", "lib/thrift_client/connection/http.rb", "lib/thrift_client/connection/socket.rb", "lib/thrift_client/event_machine.rb", "lib/thrift_client/simple.rb", "lib/thrift_client/thrift.rb"]
@@ -16,8 +16,8 @@ Gem::Specification.new do |s|
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Thrift_client", "--main", "README.rdoc"]
17
17
  s.require_paths = ["lib"]
18
18
  s.rubyforge_project = %q{fauna}
19
- s.rubygems_version = %q{1.3.5}
20
- s.signing_key = %q{/Users/ryan/.gemkeys/gem-private_key.pem}
19
+ s.rubygems_version = %q{1.3.6}
20
+ s.signing_key = %q{/Users/freels/.gemkeys/gem-private_key.pem}
21
21
  s.summary = %q{A Thrift client wrapper that encapsulates some common failover behavior.}
22
22
  s.test_files = ["test/multiple_working_servers_test.rb", "test/simple_test.rb", "test/test_helper.rb", "test/thrift_client_http_test.rb", "test/thrift_client_test.rb"]
23
23
 
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thrift_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 4
8
+ - 3
9
+ version: 0.4.3
5
10
  platform: ruby
6
11
  authors:
7
12
  - Evan Weaver
@@ -10,39 +15,41 @@ bindir: bin
10
15
  cert_chain:
11
16
  - |
12
17
  -----BEGIN CERTIFICATE-----
13
- MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQ0wCwYDVQQDDARyeWFu
14
- MRswGQYKCZImiZPyLGQBGRYLdGhlcnlhbmtpbmcxEzARBgoJkiaJk/IsZAEZFgNj
15
- b20wHhcNMTAwMTA4MTc1MDM0WhcNMTEwMTA4MTc1MDM0WjBBMQ0wCwYDVQQDDARy
16
- eWFuMRswGQYKCZImiZPyLGQBGRYLdGhlcnlhbmtpbmcxEzARBgoJkiaJk/IsZAEZ
17
- FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLPp+0PtRT3qCI
18
- 02sMsADSn7Uf1GpyXUtk4Fb94LqUO6Scl91YDmbFMpjzrQwQvBYMIVreWcwSish6
19
- nip6WEk9lqXcOeDmex/qY2/FVXG8ffqjFHiNiN9vpWrWj5VMICequ+ftzWLKsPIS
20
- DGJ4o+Z6wEYRuirgaRPCYAUDPglsaqctJ56wPuycryMe5+ApSkOS9iLWMprQKEAq
21
- j2R2OBV0dSARdbtzuKwrP7sLDo7uPa0egFBUlcZ+nujGr4LvmpryB8scNRNmZK1w
22
- 1rEI7O06CbULj08qYxEhnKmFE7LbBoN/HrmvZLVQK5mWuiZQhtmJuhBfStJsaDux
23
- 5tBEkYZVAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
24
- BBSnLarDEo5eBE2arSMrBdOOhtrnPTANBgkqhkiG9w0BAQUFAAOCAQEANER07s4K
25
- Pvc1DSduliRDMUax/VSfLzDTtTAQwuSAPDrWAYXKugcJtOZOXjDbGL7c5zoWmy9u
26
- Fn5vEVdm/93J+84D/IMaaof3BwX/NNEYH01CeZEIGMfc5AFFha7dabzP/uiPpb/c
27
- GSvomC9IzyN37+eWwOS16cC+5XnBT6KRCaXYg2Fh6WpTgde67OVgXr4Q58HXlaZ+
28
- /2BB3wq9lZ4JskvlpYpYnlPAUyiyc6R2Mjts1pURz5nkW4SuS7Kd1KCOOyr1McDH
29
- VP12sTSjJclmI17BjDGQpAF0n9v5ExhJxWpeOjeBUPQsOin3ypEM1KkckLmOKvH6
30
- zyKMYVRO0z/58g==
18
+ MIIDLjCCAhagAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQ0wCwYDVQQDDARtYXR0
19
+ MRYwFAYKCZImiZPyLGQBGRYGZnJlZWxzMRQwEgYKCZImiZPyLGQBGRYEbmFtZTAe
20
+ Fw0xMDA1MTAyMjA0NTVaFw0xMTA1MTAyMjA0NTVaMD0xDTALBgNVBAMMBG1hdHQx
21
+ FjAUBgoJkiaJk/IsZAEZFgZmcmVlbHMxFDASBgoJkiaJk/IsZAEZFgRuYW1lMIIB
22
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuolq5fjVtDVlUMy690FYuonn
23
+ Ww1PNQrx/xP/lKHXIuw0N1r53Rs3+u331Z2lxgNTf7xpCm28TaY7MHLQJeCsCuiW
24
+ xRS1lDZc/D6gSbF1R8NrjX5Z2GkYhWwWq1JCqncGEMu9L2S7w3JEm1uAp9+Slf79
25
+ FRDf8YsxolMo9kvIE9I7E+38tpfgB7V2kl7BWWGkqX+xpF6hYZJ8rJm07PFFPMC9
26
+ mS2VSMShvJHLKpfu94Ud4WP9z05qX8sq+2TWkKHxp5GKndHsGDfWLgLExcw+FHK2
27
+ aSMVczp3gJjX9/Oz5cUDvplwUmuSgdZPG/OloA5THH9yP+uHssJHmveV5eokswID
28
+ AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUK1mG9LJ8
29
+ oj7zMsGt3a72q8M7JqIwDQYJKoZIhvcNAQEFBQADggEBAHnGX2oDk+SQXrFGa/jO
30
+ IXmx3pl4PxriRAdUnJJNKSEopGYh/mr/Mu2XDv4eW4GgBZbqvzuPWavsVYFIQwKK
31
+ Sz4FylZ9fxpcY3mWsz31IwrjYkZ6U43DP/pIw6Sv0iw2xhZwJPt09jZexs2KaH6l
32
+ Non+q//rdf1avbcuWNBeSJIK03s7C4pS3lKfRfF/9KsuIbDFvbwNKC00uiXmokSP
33
+ UdFLVl8y27MG7seE2788E6WaHrLWNhN+/dReDiOA5VjrkPI2lfHRqXDnaZTjvCir
34
+ 5Cd6/wLNizaHOQCmp6VxpCuDA67P+TzXCvR7ElyQ2ErG2IHeSAoB/57bxToe40Rz
35
+ 1LE=
31
36
  -----END CERTIFICATE-----
32
37
 
33
- date: 2010-04-08 00:00:00 -07:00
38
+ date: 2010-05-10 00:00:00 -07:00
34
39
  default_executable:
35
40
  dependencies:
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: thrift
38
- type: :runtime
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
43
+ prerelease: false
44
+ requirement: &id001 !ruby/object:Gem::Requirement
41
45
  requirements:
42
46
  - - ">="
43
47
  - !ruby/object:Gem::Version
48
+ segments:
49
+ - 0
44
50
  version: "0"
45
- version:
51
+ type: :runtime
52
+ version_requirements: *id001
46
53
  description: A Thrift client wrapper that encapsulates some common failover behavior.
47
54
  email: ""
48
55
  executables: []
@@ -106,18 +113,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
113
  requirements:
107
114
  - - ">="
108
115
  - !ruby/object:Gem::Version
116
+ segments:
117
+ - 0
109
118
  version: "0"
110
- version:
111
119
  required_rubygems_version: !ruby/object:Gem::Requirement
112
120
  requirements:
113
121
  - - ">="
114
122
  - !ruby/object:Gem::Version
123
+ segments:
124
+ - 0
125
+ - 8
115
126
  version: "0.8"
116
- version:
117
127
  requirements: []
118
128
 
119
129
  rubyforge_project: fauna
120
- rubygems_version: 1.3.5
130
+ rubygems_version: 1.3.6
121
131
  signing_key:
122
132
  specification_version: 3
123
133
  summary: A Thrift client wrapper that encapsulates some common failover behavior.
metadata.gz.sig CHANGED
Binary file