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 +4 -4
- data/README.md +6 -5
- data/griffin.gemspec +1 -1
- data/lib/griffin/engine/server.rb +7 -3
- data/lib/griffin/engine/single.rb +6 -3
- data/lib/griffin/engine/worker.rb +36 -9
- data/lib/griffin/server.rb +27 -3
- data/lib/griffin/server_config_builder.rb +19 -1
- data/lib/griffin/thread_pool.rb +6 -2
- data/lib/griffin/version.rb +1 -1
- metadata +8 -12
- data/.ruby-version +0 -1
- data/.travis.yml +0 -5
- data/lib/griffin/listener.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa72d1f7851dc5a90fb99214c57e9bbba2fd6da6e84225a2ea6955d9ad89f872
|
4
|
+
data.tar.gz: 2794b9f846099b958fb5b937fcf8de2168a858bad149a89316664f9c3b921d75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 731a0d9ab4fba6a3989ef0af62bb4a36f1bd34f48bb0790ff4f5d0c954ee8fa5e0492f4d4f65121ff7378d90fea313333feb262ed4575d4a5c355fb03ae35f28
|
7
|
+
data.tar.gz: 0bded1160bf1b33b16a11e6dea2c95c8abc3311695c4947031dfddb918a5d0292cca809e8797a5b06e1b25e4a8d6e0f88c9467543549539378a079b552c83eff
|
data/README.md
CHANGED
@@ -2,9 +2,6 @@
|
|
2
2
|
|
3
3
|
[](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.
|
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/
|
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.
|
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, :
|
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
|
-
@
|
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
|
-
@
|
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
|
-
|
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
|
-
@
|
19
|
+
@lsock.close if @lsock
|
17
20
|
end
|
18
21
|
|
19
|
-
def stop
|
20
|
-
|
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
|
-
#
|
24
|
-
#
|
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
|
data/lib/griffin/server.rb
CHANGED
@@ -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
|
-
|
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(
|
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
|
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 =
|
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|
|
data/lib/griffin/thread_pool.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'grpc_kit/
|
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::
|
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) }
|
data/lib/griffin/version.rb
CHANGED
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.
|
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:
|
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.
|
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.
|
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
|
-
|
179
|
-
|
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
data/lib/griffin/listener.rb
DELETED
@@ -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
|