grpc_kit 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/grpc_kit.gemspec +1 -1
- data/lib/grpc_kit/{thread_pool.rb → rpc_dispatcher.rb} +32 -14
- data/lib/grpc_kit/{thread_pool → rpc_dispatcher}/auto_trimmer.rb +1 -1
- data/lib/grpc_kit/server.rb +6 -22
- data/lib/grpc_kit/session/control_queue.rb +34 -0
- data/lib/grpc_kit/session/server_session.rb +6 -11
- data/lib/grpc_kit/session/stream.rb +10 -2
- data/lib/grpc_kit/version.rb +1 -1
- metadata +7 -7
- data/lib/grpc_kit/control_queue.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f25addf2f2c68ddec2355fa793c556a0ae3f138f7d89c55d70f1ab5da6e8a2ee
|
4
|
+
data.tar.gz: a4fd8dab4169f06e7f3cf149ad058257acbd8d840db45401e533204fde355817
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 538fcc7570e52993cde7783190b41cd0b20f45090de70abb10aabbf231b7e6de10546e077b2eacccb648078460452bea628e6f9f5c682afb6c21887b96a06a22
|
7
|
+
data.tar.gz: 5af00705af1b908e09630f2cb1401a65683c3f25aa25d2531783a9bc28fce893b1b66ced3220549f94f1a967b03abda7939e8d85a82f9526699413f2aaca6377
|
data/grpc_kit.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency 'googleapis-common-protos-types', '~> 1.0.2'
|
28
28
|
|
29
29
|
spec.add_development_dependency 'bundler'
|
30
|
-
spec.add_development_dependency 'grpc-tools', '~> 1.
|
30
|
+
spec.add_development_dependency 'grpc-tools', '~> 1.18.0'
|
31
31
|
spec.add_development_dependency 'pry-byebug'
|
32
32
|
spec.add_development_dependency 'rake'
|
33
33
|
spec.add_development_dependency 'rspec'
|
@@ -1,34 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'grpc_kit/
|
3
|
+
require 'grpc_kit/rpc_dispatcher/auto_trimmer'
|
4
|
+
require 'grpc_kit/transport/server_transport'
|
5
|
+
require 'grpc_kit/stream/server_stream'
|
4
6
|
|
5
7
|
module GrpcKit
|
6
|
-
class
|
8
|
+
class RpcDispatcher
|
7
9
|
DEFAULT_MAX = 20
|
8
10
|
DEFAULT_MIN = 5
|
9
11
|
|
12
|
+
# @param rpcs [Hash<String,GrpcKit::RpcDesc>]
|
10
13
|
# @param min [Integer] A mininum thread pool size
|
11
14
|
# @param max [Integer] A maximum thread pool size
|
12
15
|
# @param interval [Integer] An interval time of calling #trim
|
13
|
-
def initialize(max: DEFAULT_MAX, min: DEFAULT_MIN, interval: 30
|
16
|
+
def initialize(rpcs, max: DEFAULT_MAX, min: DEFAULT_MIN, interval: 30)
|
17
|
+
@rpcs = rpcs
|
14
18
|
@max_pool_size = max
|
15
19
|
@min_pool_size = min
|
16
|
-
@shutdown = false
|
17
|
-
@tasks = Queue.new
|
18
20
|
unless max == min
|
19
21
|
@auto_trimmer = AutoTrimmer.new(self, interval: interval).tap(&:start!)
|
20
22
|
end
|
21
23
|
|
24
|
+
@shutdown = false
|
25
|
+
@tasks = Queue.new
|
22
26
|
@spawned = 0
|
23
27
|
@workers = []
|
24
28
|
@mutex = Mutex.new
|
25
|
-
@block = block
|
26
29
|
|
27
30
|
@min_pool_size.times { spawn_thread }
|
28
31
|
end
|
29
32
|
|
30
|
-
# @param task [Object] task to
|
31
|
-
def schedule(task
|
33
|
+
# @param task [Object] task to dispatch
|
34
|
+
def schedule(task)
|
32
35
|
if task.nil?
|
33
36
|
return
|
34
37
|
end
|
@@ -37,7 +40,7 @@ module GrpcKit
|
|
37
40
|
raise "scheduling new task isn't allowed during shutdown"
|
38
41
|
end
|
39
42
|
|
40
|
-
@tasks.push(
|
43
|
+
@tasks.push(task)
|
41
44
|
if @tasks.size > 1 && @mutex.synchronize { @spawned < @max_pool_size }
|
42
45
|
spawn_thread
|
43
46
|
end
|
@@ -51,17 +54,32 @@ module GrpcKit
|
|
51
54
|
|
52
55
|
def trim(force = false)
|
53
56
|
if (force || @tasks.empty?) && @mutex.synchronize { @spawned > @min_pool_size }
|
54
|
-
GrpcKit.logger.debug("
|
57
|
+
GrpcKit.logger.debug("Decrease RpcDipatcher's worker. Next worker size is #{@spawned - 1}")
|
55
58
|
@tasks.push(nil)
|
56
59
|
end
|
57
60
|
end
|
58
61
|
|
59
62
|
private
|
60
63
|
|
64
|
+
def dispatch(stream, control_queue)
|
65
|
+
transport = GrpcKit::Transport::ServerTransport.new(control_queue, stream)
|
66
|
+
server_stream = GrpcKit::Stream::ServerStream.new(transport)
|
67
|
+
path = stream.headers.path
|
68
|
+
|
69
|
+
rpc = @rpcs[path]
|
70
|
+
unless rpc
|
71
|
+
e = GrpcKit::Errors::Unimplemented.new(path)
|
72
|
+
server_stream.send_status(status: e.code, msg: e.message)
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
server_stream.invoke(rpc)
|
77
|
+
end
|
78
|
+
|
61
79
|
def spawn_thread
|
62
80
|
@spawned += 1
|
63
81
|
worker = Thread.new(@spawned) do |i|
|
64
|
-
Thread.current.name = "
|
82
|
+
Thread.current.name = "RpcDispatcher #{i}"
|
65
83
|
GrpcKit.logger.debug("#{Thread.current.name} started")
|
66
84
|
|
67
85
|
loop do
|
@@ -75,13 +93,13 @@ module GrpcKit
|
|
75
93
|
end
|
76
94
|
|
77
95
|
begin
|
78
|
-
|
96
|
+
dispatch(task[0], task[1])
|
79
97
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
80
|
-
GrpcKit.logger.error("An error occured on top level in worker #{Thread.current.name}: #{e.message} (#{e.class})\n #{
|
98
|
+
GrpcKit.logger.error("An error occured on top level in worker #{Thread.current.name}: #{e.message} (#{e.class})\n #{e.backtrace.join("\n")}")
|
81
99
|
end
|
82
100
|
end
|
83
101
|
|
84
|
-
GrpcKit.logger.debug("
|
102
|
+
GrpcKit.logger.debug("#{Thread.current.name} stopped")
|
85
103
|
@mutex.synchronize do
|
86
104
|
@spawned -= 1
|
87
105
|
@workers.delete(worker)
|
data/lib/grpc_kit/server.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'grpc_kit/session/io'
|
4
4
|
require 'grpc_kit/session/server_session'
|
5
|
+
require 'grpc_kit/rpc_dispatcher'
|
5
6
|
|
6
7
|
module GrpcKit
|
7
8
|
class Server
|
@@ -12,8 +13,8 @@ module GrpcKit
|
|
12
13
|
def initialize(interceptors: [], shutdown_timeout: 30, min_pool_size: nil, max_pool_size: nil)
|
13
14
|
@interceptors = interceptors
|
14
15
|
@shutdown_timeout = shutdown_timeout
|
15
|
-
@min_pool_size = min_pool_size || GrpcKit::
|
16
|
-
@max_pool_size = max_pool_size || GrpcKit::
|
16
|
+
@min_pool_size = min_pool_size || GrpcKit::RpcDispatcher::DEFAULT_MIN
|
17
|
+
@max_pool_size = max_pool_size || GrpcKit::RpcDispatcher::DEFAULT_MAX
|
17
18
|
@sessions = []
|
18
19
|
@rpc_descs = {}
|
19
20
|
@mutex = Mutex.new
|
@@ -90,25 +91,8 @@ module GrpcKit
|
|
90
91
|
|
91
92
|
private
|
92
93
|
|
93
|
-
def
|
94
|
-
|
95
|
-
ss = GrpcKit::Stream::ServerStream.new(t)
|
96
|
-
path = stream.headers.path
|
97
|
-
|
98
|
-
rpc = @rpc_descs[path]
|
99
|
-
unless rpc
|
100
|
-
e = GrpcKit::Errors::Unimplemented.new(path)
|
101
|
-
ss.send_status(status: e.code, msg: e.message)
|
102
|
-
return
|
103
|
-
end
|
104
|
-
|
105
|
-
ss.invoke(rpc)
|
106
|
-
end
|
107
|
-
|
108
|
-
def thread_pool
|
109
|
-
@thread_pool ||= GrpcKit::ThreadPool.new(min: @min_pool_size, max: @max_pool_size) do |task|
|
110
|
-
dispatch(task[0], task[1])
|
111
|
-
end
|
94
|
+
def dispatcher
|
95
|
+
@dispatcher ||= GrpcKit::RpcDispatcher.new(@rpc_descs, min: @min_pool_size, max: @max_pool_size)
|
112
96
|
end
|
113
97
|
|
114
98
|
def shutdown_sessions
|
@@ -116,7 +100,7 @@ module GrpcKit
|
|
116
100
|
end
|
117
101
|
|
118
102
|
def establish_session(conn)
|
119
|
-
session = GrpcKit::Session::ServerSession.new(GrpcKit::Session::IO.new(conn),
|
103
|
+
session = GrpcKit::Session::ServerSession.new(GrpcKit::Session::IO.new(conn), dispatcher)
|
120
104
|
begin
|
121
105
|
@mutex.synchronize { @sessions << session }
|
122
106
|
yield(session)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GrpcKit
|
4
|
+
module Session
|
5
|
+
class ControlQueue
|
6
|
+
def initialize
|
7
|
+
@event_stream = Queue.new
|
8
|
+
end
|
9
|
+
|
10
|
+
# Be nonblocking
|
11
|
+
def pop
|
12
|
+
if @event_stream.empty?
|
13
|
+
nil
|
14
|
+
else
|
15
|
+
@event_stream.pop(true)
|
16
|
+
end
|
17
|
+
rescue ThreadError => _
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def submit_response(id, headers)
|
22
|
+
@event_stream.push([:submit_response, id, headers])
|
23
|
+
end
|
24
|
+
|
25
|
+
def submit_headers(id, headers)
|
26
|
+
@event_stream.push([:submit_headers, id, headers])
|
27
|
+
end
|
28
|
+
|
29
|
+
def resume_data(id)
|
30
|
+
@event_stream.push([:resume_data, id])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -2,13 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'ds9'
|
4
4
|
require 'forwardable'
|
5
|
-
require 'grpc_kit/control_queue'
|
5
|
+
require 'grpc_kit/session/control_queue'
|
6
6
|
require 'grpc_kit/session/stream'
|
7
7
|
require 'grpc_kit/session/drain_controller'
|
8
|
-
require 'grpc_kit/stream/server_stream'
|
9
|
-
require 'grpc_kit/session/send_buffer'
|
10
|
-
require 'grpc_kit/transport/server_transport'
|
11
|
-
require 'grpc_kit/thread_pool'
|
12
8
|
|
13
9
|
module GrpcKit
|
14
10
|
module Session
|
@@ -18,8 +14,8 @@ module GrpcKit
|
|
18
14
|
delegate %i[send_event recv_event] => :@io
|
19
15
|
|
20
16
|
# @param io [GrpcKit::Session::IO]
|
21
|
-
# @param pool [GrpcKit::
|
22
|
-
def initialize(io,
|
17
|
+
# @param pool [GrpcKit::RcpDispatcher]
|
18
|
+
def initialize(io, dispatcher)
|
23
19
|
super() # initialize DS9::Session
|
24
20
|
|
25
21
|
@io = io
|
@@ -27,8 +23,8 @@ module GrpcKit
|
|
27
23
|
@stop = false
|
28
24
|
@inflights = []
|
29
25
|
@drain_controller = GrpcKit::Session::DrainController.new
|
30
|
-
@control_queue = GrpcKit::ControlQueue.new
|
31
|
-
@
|
26
|
+
@control_queue = GrpcKit::Session::ControlQueue.new
|
27
|
+
@dispatcher = dispatcher
|
32
28
|
end
|
33
29
|
|
34
30
|
# @return [void]
|
@@ -84,7 +80,6 @@ module GrpcKit
|
|
84
80
|
def shutdown
|
85
81
|
stop
|
86
82
|
@io.close
|
87
|
-
# @pool.shutdown
|
88
83
|
rescue StandardError => e
|
89
84
|
GrpcKit.logger.error(e)
|
90
85
|
end
|
@@ -173,7 +168,7 @@ module GrpcKit
|
|
173
168
|
|
174
169
|
unless stream.inflight
|
175
170
|
stream.inflight = true
|
176
|
-
@
|
171
|
+
@dispatcher.schedule([stream, @control_queue])
|
177
172
|
end
|
178
173
|
when DS9::Frames::Headers
|
179
174
|
if frame.end_stream?
|
@@ -11,8 +11,8 @@ module GrpcKit
|
|
11
11
|
class Stream
|
12
12
|
extend Forwardable
|
13
13
|
|
14
|
-
delegate %i[end_write
|
15
|
-
delegate %i[end_read
|
14
|
+
delegate %i[end_write?] => :@pending_send_data
|
15
|
+
delegate %i[end_read?] => :@pending_recv_data
|
16
16
|
delegate %i[close close_remote close_local close? close_remote? close_local?] => :@status
|
17
17
|
|
18
18
|
attr_reader :headers, :pending_send_data, :pending_recv_data, :trailer_data, :status
|
@@ -32,6 +32,14 @@ module GrpcKit
|
|
32
32
|
@draining = false
|
33
33
|
end
|
34
34
|
|
35
|
+
def end_write
|
36
|
+
@pending_send_data.end_write
|
37
|
+
end
|
38
|
+
|
39
|
+
def end_read
|
40
|
+
@pending_recv_data.end_read
|
41
|
+
end
|
42
|
+
|
35
43
|
# @return [void]
|
36
44
|
def drain
|
37
45
|
@draining = true
|
data/lib/grpc_kit/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grpc_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuta Iwama
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ds9
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.18.0
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.18.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: pry-byebug
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,7 +183,6 @@ files:
|
|
183
183
|
- lib/grpc_kit/calls/server_server_streamer.rb
|
184
184
|
- lib/grpc_kit/client.rb
|
185
185
|
- lib/grpc_kit/codec.rb
|
186
|
-
- lib/grpc_kit/control_queue.rb
|
187
186
|
- lib/grpc_kit/errors.rb
|
188
187
|
- lib/grpc_kit/grpc/core.rb
|
189
188
|
- lib/grpc_kit/grpc/dsl.rb
|
@@ -205,6 +204,8 @@ files:
|
|
205
204
|
- lib/grpc_kit/interceptors/server_server_streamer.rb
|
206
205
|
- lib/grpc_kit/method_config.rb
|
207
206
|
- lib/grpc_kit/rpc_desc.rb
|
207
|
+
- lib/grpc_kit/rpc_dispatcher.rb
|
208
|
+
- lib/grpc_kit/rpc_dispatcher/auto_trimmer.rb
|
208
209
|
- lib/grpc_kit/rpcs.rb
|
209
210
|
- lib/grpc_kit/rpcs/client_bidi_streamer.rb
|
210
211
|
- lib/grpc_kit/rpcs/client_client_streamer.rb
|
@@ -216,6 +217,7 @@ files:
|
|
216
217
|
- lib/grpc_kit/rpcs/server_server_streamer.rb
|
217
218
|
- lib/grpc_kit/server.rb
|
218
219
|
- lib/grpc_kit/session/client_session.rb
|
220
|
+
- lib/grpc_kit/session/control_queue.rb
|
219
221
|
- lib/grpc_kit/session/drain_controller.rb
|
220
222
|
- lib/grpc_kit/session/headers.rb
|
221
223
|
- lib/grpc_kit/session/io.rb
|
@@ -227,8 +229,6 @@ files:
|
|
227
229
|
- lib/grpc_kit/status_codes.rb
|
228
230
|
- lib/grpc_kit/stream/client_stream.rb
|
229
231
|
- lib/grpc_kit/stream/server_stream.rb
|
230
|
-
- lib/grpc_kit/thread_pool.rb
|
231
|
-
- lib/grpc_kit/thread_pool/auto_trimmer.rb
|
232
232
|
- lib/grpc_kit/transport/client_transport.rb
|
233
233
|
- lib/grpc_kit/transport/packable.rb
|
234
234
|
- lib/grpc_kit/transport/server_transport.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module GrpcKit
|
2
|
-
class ControlQueue
|
3
|
-
def initialize
|
4
|
-
@event_stream = Queue.new
|
5
|
-
end
|
6
|
-
|
7
|
-
# Be nonblocking
|
8
|
-
def pop
|
9
|
-
if @event_stream.empty?
|
10
|
-
nil
|
11
|
-
else
|
12
|
-
@event_stream.pop(true)
|
13
|
-
end
|
14
|
-
rescue ThreadError => _
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
|
18
|
-
def submit_response(id, headers)
|
19
|
-
@event_stream.push([:submit_response, id, headers])
|
20
|
-
end
|
21
|
-
|
22
|
-
def submit_headers(id, headers)
|
23
|
-
@event_stream.push([:submit_headers, id, headers])
|
24
|
-
end
|
25
|
-
|
26
|
-
def resume_data(id)
|
27
|
-
@event_stream.push([:resume_data, id])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|