griffin 0.2.0 → 0.3.0

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: 61289d32bbb5830ad446ea08b51604a4f4cf0340f59ec596dcc92c32cf29f7ac
4
- data.tar.gz: dc61c80a41aa8c79294d88c9b2042b3e7babb728c108be7fe7a581e6c6324559
3
+ metadata.gz: aa72d1f7851dc5a90fb99214c57e9bbba2fd6da6e84225a2ea6955d9ad89f872
4
+ data.tar.gz: 2794b9f846099b958fb5b937fcf8de2168a858bad149a89316664f9c3b921d75
5
5
  SHA512:
6
- metadata.gz: c0629cb8f5fe58daa29b9c44d0e27cf37f29885e26bbc8fefb4a9aac624be4efed3436e98053fd554bcff1576fa0c9c4e26c313baf1e059ededae9ab0237b601
7
- data.tar.gz: ea6576f3ab391cc2f632872375926c26e1f374006ee1d7b9f38be37bbe8af053ebdc208f933db309e95a262e1fa14272efcbf17b45941d07be0998fb16cc6f18
6
+ metadata.gz: 731a0d9ab4fba6a3989ef0af62bb4a36f1bd34f48bb0790ff4f5d0c954ee8fa5e0492f4d4f65121ff7378d90fea313333feb262ed4575d4a5c355fb03ae35f28
7
+ data.tar.gz: 0bded1160bf1b33b16a11e6dea2c95c8abc3311695c4947031dfddb918a5d0292cca809e8797a5b06e1b25e4a8d6e0f88c9467543549539378a079b552c83eff
data/README.md CHANGED
@@ -2,9 +2,6 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/griffin.svg)](https://badge.fury.io/rb/griffin)
4
4
 
5
-
6
- __UNDER DEVELOPMENT__
7
-
8
5
  Griffin is [gRPC](https://grpc.io/) server which supports multi process by using [serverengine](https://github.com/treasure-data/serverengine).
9
6
  Griffin also supports building gRPC client.
10
7
 
@@ -46,13 +43,17 @@ Griffin::Server.configure do |c|
46
43
 
47
44
  c.services GreeterServer.new
48
45
 
49
- c.worker 2 # A number of worker process
46
+ c.workers 2 # A number of worker process
50
47
  end
51
48
 
52
49
  Griffin::Server.run
53
50
 
54
51
  ```
55
52
 
53
+ ## Interceptors
54
+
55
+ * [cookpad/griffin-interceptors](https://github.com/cookpad/griffin-interceptors) colloection of interceptors
56
+
56
57
  ## Development
57
58
 
58
59
  ```
@@ -61,7 +62,7 @@ bundle install
61
62
 
62
63
  ## Contributing
63
64
 
64
- Bug reports and pull requests are welcome on GitHub at https://github.com/ganmacs/griffin.
65
+ Bug reports and pull requests are welcome on GitHub at https://github.com/cookpad/griffin.
65
66
 
66
67
  ## License
67
68
 
data/griffin.gemspec CHANGED
@@ -28,6 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'rspec'
29
29
  spec.add_development_dependency 'rubocop'
30
30
 
31
- spec.add_dependency 'grpc_kit', '>= 0.3.0'
31
+ spec.add_dependency 'grpc_kit', '>= 0.5.0'
32
32
  spec.add_dependency 'serverengine', '~> 2.0.7'
33
33
  end
@@ -1,11 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'griffin/listener'
4
-
5
3
  module Griffin
6
4
  module Engine
7
5
  module Server
8
- attr_reader :core, :listener
6
+ attr_reader :core, :socket_manager_path
9
7
 
10
8
  def initialize
11
9
  @core = Griffin::Server.new(
@@ -14,8 +12,13 @@ module Griffin
14
12
  max_pool_size: config[:max_pool_size],
15
13
  min_connection_size: config[:min_connection_size],
16
14
  max_connection_size: config[:max_connection_size],
15
+ max_receive_message_size: config[:max_receive_message_size],
16
+ max_send_message_size: config[:max_send_message_size],
17
17
  interceptors: config[:interceptors],
18
+ settings: config[:http2_settings],
18
19
  )
20
+ @socket_manager_path = ServerEngine::SocketManager::Server.generate_path
21
+ @socket_manager_server = ServerEngine::SocketManager::Server.open(@socket_manager_path)
19
22
  end
20
23
 
21
24
  def before_run
@@ -26,6 +29,7 @@ module Griffin
26
29
 
27
30
  def stop(stop_graceful)
28
31
  super # needed
32
+ @socket_manager_server.close
29
33
  end
30
34
 
31
35
  # def after_start; end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'griffin/server'
4
- require 'griffin/listener'
5
4
 
6
5
  module Griffin
7
6
  module Engine
@@ -12,6 +11,8 @@ module Griffin
12
11
  max_pool_size: config[:max_pool_size],
13
12
  min_connection_size: config[:min_connection_size],
14
13
  max_connection_size: config[:max_connection_size],
14
+ max_receive_message_size: config[:max_receive_message_size],
15
+ max_send_message_size: config[:max_send_message_size],
15
16
  interceptors: config[:interceptors],
16
17
  )
17
18
  new(serv, config)
@@ -20,7 +21,8 @@ module Griffin
20
21
  def initialize(server, config)
21
22
  @server = server
22
23
  @config = config
23
- @listener = Griffin::Listener.new(@config[:bind], @config[:port])
24
+ @sock = TCPServer.new(@config[:bind], @config[:port])
25
+ @sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
24
26
  end
25
27
 
26
28
  def run
@@ -31,7 +33,8 @@ module Griffin
31
33
  install_handler
32
34
 
33
35
  @server.before_run
34
- @server.run(@listener.listen)
36
+ @sock.listen(Socket::SOMAXCONN)
37
+ @server.run(@sock)
35
38
  end
36
39
 
37
40
  def install_handler
@@ -1,27 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'griffin/listener'
4
-
5
3
  module Griffin
6
4
  module Engine
7
5
  module Worker
6
+ def initialize
7
+ @socket_manager = ServerEngine::SocketManager::Client.new(server.socket_manager_path)
8
+ end
9
+
8
10
  def before_fork
9
- @listener = Griffin::Listener.new(config[:bind], config[:port])
10
11
  server.core.before_run(worker_id)
11
12
  end
12
13
 
13
14
  def run
14
- server.core.run(@listener.listen)
15
+ @lsock = @socket_manager.listen_tcp(config[:bind], config[:port])
16
+ @lsock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
17
+ server.core.run(@lsock)
15
18
  ensure
16
- @listener.close
19
+ @lsock.close if @lsock
17
20
  end
18
21
 
19
- def stop
20
- server.core.shutdown
22
+ def stop(signal = nil)
23
+ kind = case signal
24
+ when ServerEngine::Signals::GRACEFUL_STOP then Griffin::Server::GRACEFUL_SHUTDOWN
25
+ when ServerEngine::Signals::IMMEDIATE_STOP then Griffin::Server::FORCE_SHUTDOWN
26
+ when ServerEngine::Signals::GRACEFUL_RESTART then Griffin::Server::GRACEFUL_RESTART
27
+ else Griffin::Server::GRACEFUL_SHUTDOWN
28
+ end
29
+ server.core.shutdown(kind)
21
30
  end
22
31
 
23
- # def after_fork; end
24
- # def reload; end
32
+ # Overwrite to identify the kind of signal in #stop
33
+ # https://github.com/treasure-data/serverengine/blob/a005f3535affaa5b15d1e66486d9349443398dd2/lib/serverengine/worker.rb#L61-L78
34
+ def install_signal_handlers
35
+ w = self
36
+ ServerEngine::SignalThread.new do |st|
37
+ st.trap(ServerEngine::Signals::GRACEFUL_STOP) { |s| w.stop(s) }
38
+ st.trap(ServerEngine::Signals::IMMEDIATE_STOP, 'SIG_DFL')
39
+
40
+ st.trap(ServerEngine::Signals::GRACEFUL_RESTART) { |s| w.stop(s) }
41
+ st.trap(ServerEngine::Signals::IMMEDIATE_RESTART, 'SIG_DFL')
42
+
43
+ st.trap(ServerEngine::Signals::RELOAD) {
44
+ w.logger.reopen!
45
+ w.reload
46
+ }
47
+ st.trap(ServerEngine::Signals::DETACH) { |s| w.stop(s) }
48
+
49
+ st.trap(ServerEngine::Signals::DUMP) { w.dump }
50
+ end
51
+ end
25
52
  end
26
53
  end
27
54
  end
@@ -12,6 +12,7 @@ module Griffin
12
12
 
13
13
  GRACEFUL_SHUTDOWN = '0'
14
14
  FORCIBLE_SHUTDOWN = '1'
15
+ GRACEFUL_RESTART = '2'
15
16
 
16
17
  class << self
17
18
  # @param bind [String]
@@ -40,10 +41,20 @@ module Griffin
40
41
  # @param min_connection_size [Integer] Maximun connection of TCP
41
42
  # @param max_connection_size [Integer] Minimum connection of TCP
42
43
  # @param interceptors [Array<GrpcKit::GRPC::ServerInterceptor>] list of interceptors
43
- def initialize(min_pool_size:, max_pool_size:, min_connection_size:, max_connection_size:, interceptors: [], **opts)
44
+ # @param settings [Array<DS9::Settings,Integer>] list of HTTP2-Settings headers
45
+ # @param max_receive_message_size [Integer, nil] Specify the default maximum size of inbound message in bytes. Default to 4MB.
46
+ # @param max_send_message_size [Integer, nil] Specify the default maximum size of outbound message in bytes. Default to 4MB.
47
+ def initialize(min_pool_size:, max_pool_size:, min_connection_size:, max_connection_size:, interceptors: [], settings: [], max_receive_message_size: nil, max_send_message_size: nil, **opts)
44
48
  @min_connection_size = min_connection_size
45
49
  @max_connection_size = max_connection_size
46
- @server = GrpcKit::Server.new(interceptors: interceptors, min_pool_size: min_pool_size, max_pool_size: max_pool_size)
50
+ @server = GrpcKit::Server.new(
51
+ interceptors: interceptors,
52
+ min_pool_size: min_pool_size,
53
+ max_pool_size: max_pool_size,
54
+ max_receive_message_size: max_receive_message_size,
55
+ max_send_message_size: max_send_message_size,
56
+ settings: settings
57
+ )
47
58
  @opts = opts
48
59
  @status = :run
49
60
  @worker_id = 0
@@ -95,9 +106,15 @@ module Griffin
95
106
  break if handle_command
96
107
  end
97
108
 
109
+ # @thread_pool.schedule could block and accepted socket would be timeout.
110
+ # So call Thread.pass other workers having resources to handle a request would accept.
111
+ unless @thread_pool.resouce_available?
112
+ break
113
+ end
114
+
98
115
  begin
99
116
  conn = sock.accept_nonblock
100
- @thread_pool.schedule(conn[0])
117
+ @thread_pool.schedule(conn)
101
118
  rescue IO::WaitReadable, Errno::EINTR => e
102
119
  Griffin.logger.debug("Error raised #{e}")
103
120
  # nothing
@@ -125,6 +142,13 @@ module Griffin
125
142
  @status = :stop
126
143
  @server.graceful_shutdown
127
144
  true
145
+ when GRACEFUL_RESTART
146
+ Griffin.logger.info("Restart sever(id=#{@worker_id}) gracefully...")
147
+
148
+ @status = :restart
149
+ # timeout is false since we don't know when all connections are closed by clients.
150
+ @server.graceful_shutdown(timeout: false)
151
+ true
128
152
  end
129
153
  end
130
154
  end
@@ -8,7 +8,7 @@ module Griffin
8
8
  SERVERENGIEN_FIXED_CONFIGS = %i[daemonize worker_type worker_process_name].freeze
9
9
 
10
10
  # The default size of thread pool TCP Connection
11
- DEFAULT_POOL_SIZE = 30
11
+ DEFAULT_POOL_SIZE = 20
12
12
  DEFAULT_CONNECTION_SIZE = 3
13
13
 
14
14
  GRIFFIN_CONFIGS = [
@@ -16,6 +16,9 @@ module Griffin
16
16
  :min_pool_size,
17
17
  :max_connection_size,
18
18
  :min_connection_size,
19
+ :max_receive_message_size,
20
+ :max_send_message_size,
21
+ :http2_settings,
19
22
  ].freeze
20
23
 
21
24
  GRPC_CONFIGS = %i[services interceptors].freeze
@@ -40,6 +43,7 @@ module Griffin
40
43
  min_connection_size: DEFAULT_CONNECTION_SIZE,
41
44
  interceptors: [],
42
45
  services: [],
46
+ http2_settings: [],
43
47
  }.freeze
44
48
 
45
49
  def initialize
@@ -67,6 +71,11 @@ module Griffin
67
71
  @opts[:min_connection_size] = Integer(min)
68
72
  @opts[:max_connection_size] = Integer(max)
69
73
  end
74
+
75
+ def http2_settings(settings)
76
+ @opts[:http2_settings] = settings
77
+ end
78
+
70
79
  def interceptors(*value)
71
80
  @opts[:interceptors].concat(value).flatten!
72
81
  end
@@ -75,6 +84,15 @@ module Griffin
75
84
  @opts[:services].concat(value).flatten!
76
85
  end
77
86
 
87
+ def max_receive_message_size(value)
88
+ @opts[:max_receive_message_size] = Integer(value)
89
+ end
90
+
91
+ def max_send_message_size(value)
92
+ @opts[:max_send_message_size] = Integer(value)
93
+ end
94
+
95
+
78
96
  def build
79
97
  c = ServerConfig.new
80
98
  @opts.each do |name, value|
@@ -1,6 +1,6 @@
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
4
 
5
5
  module Griffin
6
6
  class ThreadPool
@@ -21,7 +21,7 @@ module Griffin
21
21
  @waiting = 0
22
22
 
23
23
  @min_pool_size.times { spawn_thread }
24
- @auto_trimmer = GrpcKit::ThreadPool::AutoTrimmer.new(self, interval: interval + rand(10)).tap(&:start!)
24
+ @auto_trimmer = GrpcKit::RpcDispatcher::AutoTrimmer.new(self, interval: interval + rand(10)).tap(&:start!)
25
25
  end
26
26
 
27
27
  def schedule(task, &block)
@@ -41,6 +41,10 @@ module Griffin
41
41
  end
42
42
  end
43
43
 
44
+ def resouce_available?
45
+ (@waiting != 0) || (@spawned != @max_pool_size)
46
+ end
47
+
44
48
  def shutdown
45
49
  @shutdown = true
46
50
  @max_pool_size.times { @tasks.push(nil) }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Griffin
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: griffin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuta Iwama
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-28 00:00:00.000000000 Z
11
+ date: 2021-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 0.3.0
89
+ version: 0.5.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 0.3.0
96
+ version: 0.5.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: serverengine
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -118,8 +118,6 @@ files:
118
118
  - ".gitignore"
119
119
  - ".rspec"
120
120
  - ".rubocop.yml"
121
- - ".ruby-version"
122
- - ".travis.yml"
123
121
  - Gemfile
124
122
  - LICENSE.txt
125
123
  - README.md
@@ -146,7 +144,6 @@ files:
146
144
  - lib/griffin/engine/server.rb
147
145
  - lib/griffin/engine/single.rb
148
146
  - lib/griffin/engine/worker.rb
149
- - lib/griffin/listener.rb
150
147
  - lib/griffin/logger.rb
151
148
  - lib/griffin/server.rb
152
149
  - lib/griffin/server_config_builder.rb
@@ -159,7 +156,7 @@ homepage: https://github.com/ganmacs/griffin
159
156
  licenses:
160
157
  - MIT
161
158
  metadata: {}
162
- post_install_message:
159
+ post_install_message:
163
160
  rdoc_options: []
164
161
  require_paths:
165
162
  - lib
@@ -175,9 +172,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
172
  - !ruby/object:Gem::Version
176
173
  version: '0'
177
174
  requirements: []
178
- rubyforge_project:
179
- rubygems_version: 2.7.6
180
- signing_key:
175
+ rubygems_version: 3.1.4
176
+ signing_key:
181
177
  specification_version: 4
182
178
  summary: gRPC server and client for Ruby
183
179
  test_files: []
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.5
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.4
5
- before_install: gem install bundler -v 1.16.1
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'socket'
4
-
5
- module Griffin
6
- class Listener
7
- DEFAULT_BACKLOG_SIZE = 1024
8
-
9
- # @params host [String]
10
- # @params port [Integer]
11
- # @params backlog [Integer]
12
- def initialize(host, port, backlog: DEFAULT_BACKLOG_SIZE)
13
- @host = host
14
- @port = port
15
- @backlog = backlog
16
- end
17
-
18
- def listen(tcp_opt: true)
19
- @sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
20
- if tcp_opt
21
- @sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
22
- end
23
-
24
- @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
25
-
26
- @sock.bind(Addrinfo.tcp(@host, @port))
27
- @sock.listen(@backlog)
28
- Griffin.logger.info("Start listening #{@host}:#{@port}")
29
- @sock
30
- end
31
-
32
- def close
33
- @sock.close
34
- end
35
- end
36
- end