grpc_kit 0.3.3 → 0.3.4
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/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
|