griffin 0.2.0 → 0.3.0

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