thrift_client 0.4.2 → 0.4.3

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.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