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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ae7845744ed9b1f55241cacaaf276754682761799e8ec68768f8ae4d8d76b37
4
- data.tar.gz: 8dff9ea7a4b5c61c1b32c1199d8454e6a183f80c598eadb3e8a14a9628f34459
3
+ metadata.gz: f25addf2f2c68ddec2355fa793c556a0ae3f138f7d89c55d70f1ab5da6e8a2ee
4
+ data.tar.gz: a4fd8dab4169f06e7f3cf149ad058257acbd8d840db45401e533204fde355817
5
5
  SHA512:
6
- metadata.gz: 69e40242bbc9d686b26637a0c52f1f52b0b993e73f0bac84f981eae2c09889054f60efaf0e18a272445134123ab0731a492fdf257ed8fc0b249510cd332ac3f1
7
- data.tar.gz: f95ec0e2739c2292a99469ff55b5197c783af03fdca5110616ee9e5c3f5ae096b4322dd47d0917aa142b8783be15dbbe935864fbaff1c739eaabd42221115d30
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.15.0'
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/thread_pool/auto_trimmer'
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 ThreadPool
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, &block)
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 schedule
31
- def schedule(task, &block)
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(block || task)
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("Trim grpc_kit worker! Next worker size #{@spawned - 1}")
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 = "grpc_kit worker thread #{i}"
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
- @block.call(task)
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 #{Thread.current.backtrace.join("\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("worker thread #{Thread.current.name} is stopping")
102
+ GrpcKit.logger.debug("#{Thread.current.name} stopped")
85
103
  @mutex.synchronize do
86
104
  @spawned -= 1
87
105
  @workers.delete(worker)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- class ThreadPool
4
+ class RpcDispatcher
5
5
  class AutoTrimmer
6
6
  def initialize(pool, interval: 30)
7
7
  @pool = pool
@@ -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::ThreadPool::DEFAULT_MIN
16
- @max_pool_size = max_pool_size || GrpcKit::ThreadPool::DEFAULT_MAX
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 dispatch(stream, control_queue)
94
- t = GrpcKit::Transport::ServerTransport.new(control_queue, stream)
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), thread_pool)
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::ThreadPool] Thread pool handling reqeusts
22
- def initialize(io, pool)
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
- @pool = pool
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
- @pool.schedule([stream, @control_queue])
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 end_write?] => :@pending_send_data
15
- delegate %i[end_read end_read?] => :@pending_recv_data
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcKit
4
- VERSION = '0.3.3'
4
+ VERSION = '0.3.4'
5
5
  end
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.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-01 00:00:00.000000000 Z
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.15.0
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.15.0
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