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