griffin 0.1.9 → 0.2.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/griffin.gemspec +1 -1
- data/lib/griffin/engine/server.rb +5 -1
- data/lib/griffin/engine/single.rb +4 -1
- data/lib/griffin/server.rb +12 -6
- data/lib/griffin/server_config_builder.rb +21 -6
- data/lib/griffin/thread_pool.rb +26 -18
- data/lib/griffin/version.rb +1 -1
- metadata +4 -5
- data/lib/griffin/counting_semaphore.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61289d32bbb5830ad446ea08b51604a4f4cf0340f59ec596dcc92c32cf29f7ac
|
4
|
+
data.tar.gz: dc61c80a41aa8c79294d88c9b2042b3e7babb728c108be7fe7a581e6c6324559
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0629cb8f5fe58daa29b9c44d0e27cf37f29885e26bbc8fefb4a9aac624be4efed3436e98053fd554bcff1576fa0c9c4e26c313baf1e059ededae9ab0237b601
|
7
|
+
data.tar.gz: ea6576f3ab391cc2f632872375926c26e1f374006ee1d7b9f38be37bbe8af053ebdc208f933db309e95a262e1fa14272efcbf17b45941d07be0998fb16cc6f18
|
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.3.0'
|
32
32
|
spec.add_dependency 'serverengine', '~> 2.0.7'
|
33
33
|
end
|
@@ -10,7 +10,11 @@ module Griffin
|
|
10
10
|
def initialize
|
11
11
|
@core = Griffin::Server.new(
|
12
12
|
pool_size: config[:pool_size],
|
13
|
-
|
13
|
+
min_pool_size: config[:min_pool_size],
|
14
|
+
max_pool_size: config[:max_pool_size],
|
15
|
+
min_connection_size: config[:min_connection_size],
|
16
|
+
max_connection_size: config[:max_connection_size],
|
17
|
+
interceptors: config[:interceptors],
|
14
18
|
)
|
15
19
|
end
|
16
20
|
|
@@ -8,7 +8,10 @@ module Griffin
|
|
8
8
|
class Single
|
9
9
|
def self.create(config)
|
10
10
|
serv = Griffin::Server.new(
|
11
|
-
|
11
|
+
min_pool_size: config[:min_pool_size],
|
12
|
+
max_pool_size: config[:max_pool_size],
|
13
|
+
min_connection_size: config[:min_connection_size],
|
14
|
+
max_connection_size: config[:max_connection_size],
|
12
15
|
interceptors: config[:interceptors],
|
13
16
|
)
|
14
17
|
new(serv, config)
|
data/lib/griffin/server.rb
CHANGED
@@ -35,11 +35,15 @@ module Griffin
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
# @param
|
38
|
+
# @param min_pool_size [Integer] Worker thread mininum size
|
39
|
+
# @param max_pool_size [Integer] Worker thread maximun size
|
40
|
+
# @param min_connection_size [Integer] Maximun connection of TCP
|
41
|
+
# @param max_connection_size [Integer] Minimum connection of TCP
|
39
42
|
# @param interceptors [Array<GrpcKit::GRPC::ServerInterceptor>] list of interceptors
|
40
|
-
def initialize(
|
41
|
-
@
|
42
|
-
@
|
43
|
+
def initialize(min_pool_size:, max_pool_size:, min_connection_size:, max_connection_size:, interceptors: [], **opts)
|
44
|
+
@min_connection_size = min_connection_size
|
45
|
+
@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)
|
43
47
|
@opts = opts
|
44
48
|
@status = :run
|
45
49
|
@worker_id = 0
|
@@ -65,7 +69,7 @@ module Griffin
|
|
65
69
|
def run(sock, blocking: true)
|
66
70
|
@socks << sock
|
67
71
|
|
68
|
-
@thread_pool = Griffin::ThreadPool.new(@
|
72
|
+
@thread_pool = Griffin::ThreadPool.new(min: @min_connection_size, max: @max_connection_size) do |conn|
|
69
73
|
@server.run(conn)
|
70
74
|
end
|
71
75
|
|
@@ -113,11 +117,13 @@ module Griffin
|
|
113
117
|
Griffin.logger.info("Shutting down sever(id=#{@worker_id}) forcibly...")
|
114
118
|
|
115
119
|
@status = :halt
|
116
|
-
@server.
|
120
|
+
@server.force_shutdown
|
117
121
|
true
|
118
122
|
when GRACEFUL_SHUTDOWN
|
119
123
|
Griffin.logger.info("Shutting down sever(id=#{@worker_id}) gracefully...")
|
124
|
+
|
120
125
|
@status = :stop
|
126
|
+
@server.graceful_shutdown
|
121
127
|
true
|
122
128
|
end
|
123
129
|
end
|
@@ -7,12 +7,15 @@ module Griffin
|
|
7
7
|
# Users can't change these values
|
8
8
|
SERVERENGIEN_FIXED_CONFIGS = %i[daemonize worker_type worker_process_name].freeze
|
9
9
|
|
10
|
-
# The default size of thread pool
|
11
|
-
DEFAULT_POOL_SIZE =
|
10
|
+
# The default size of thread pool TCP Connection
|
11
|
+
DEFAULT_POOL_SIZE = 30
|
12
|
+
DEFAULT_CONNECTION_SIZE = 3
|
12
13
|
|
13
14
|
GRIFFIN_CONFIGS = [
|
14
|
-
|
15
|
-
:
|
15
|
+
:max_pool_size,
|
16
|
+
:min_pool_size,
|
17
|
+
:max_connection_size,
|
18
|
+
:min_connection_size,
|
16
19
|
].freeze
|
17
20
|
|
18
21
|
GRPC_CONFIGS = %i[services interceptors].freeze
|
@@ -31,7 +34,10 @@ module Griffin
|
|
31
34
|
workers: 1,
|
32
35
|
bind: '0.0.0.0',
|
33
36
|
port: 50051,
|
34
|
-
|
37
|
+
max_pool_size: DEFAULT_POOL_SIZE,
|
38
|
+
min_pool_size: DEFAULT_POOL_SIZE,
|
39
|
+
max_connection_size: DEFAULT_CONNECTION_SIZE,
|
40
|
+
min_connection_size: DEFAULT_CONNECTION_SIZE,
|
35
41
|
interceptors: [],
|
36
42
|
services: [],
|
37
43
|
}.freeze
|
@@ -40,7 +46,7 @@ module Griffin
|
|
40
46
|
@opts = DEFAULT_SERVER_CONFIG.dup
|
41
47
|
end
|
42
48
|
|
43
|
-
(SERVERENGINE_PRIMITIVE_CONFIGS
|
49
|
+
(SERVERENGINE_PRIMITIVE_CONFIGS).each do |name|
|
44
50
|
define_method(name) do |value|
|
45
51
|
@opts[name] = value
|
46
52
|
end
|
@@ -52,6 +58,15 @@ module Griffin
|
|
52
58
|
end
|
53
59
|
end
|
54
60
|
|
61
|
+
def pool_size(min, max)
|
62
|
+
@opts[:min_pool_size] = Integer(min)
|
63
|
+
@opts[:max_pool_size] = Integer(max)
|
64
|
+
end
|
65
|
+
|
66
|
+
def connection_size(min, max)
|
67
|
+
@opts[:min_connection_size] = Integer(min)
|
68
|
+
@opts[:max_connection_size] = Integer(max)
|
69
|
+
end
|
55
70
|
def interceptors(*value)
|
56
71
|
@opts[:interceptors].concat(value).flatten!
|
57
72
|
end
|
data/lib/griffin/thread_pool.rb
CHANGED
@@ -1,25 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'grpc_kit/thread_pool/auto_trimmer'
|
4
4
|
|
5
5
|
module Griffin
|
6
6
|
class ThreadPool
|
7
|
-
|
8
|
-
|
7
|
+
DEFAULT_MAX = 5
|
8
|
+
DEFAULT_MIN = 1
|
9
|
+
QUEUE_SIZE = 128
|
9
10
|
|
10
|
-
def initialize(
|
11
|
-
@
|
12
|
-
@
|
11
|
+
def initialize(interval: 60, max: DEFAULT_MAX, min: DEFAULT_MIN, &block)
|
12
|
+
@max_pool_size = max
|
13
|
+
@min_pool_size = min
|
13
14
|
@block = block
|
14
15
|
@shutdown = false
|
15
|
-
@
|
16
|
-
@tasks = Queue.new
|
16
|
+
@tasks = SizedQueue.new(QUEUE_SIZE)
|
17
17
|
|
18
18
|
@spawned = 0
|
19
19
|
@workers = []
|
20
20
|
@mutex = Mutex.new
|
21
|
+
@waiting = 0
|
21
22
|
|
22
|
-
@
|
23
|
+
@min_pool_size.times { spawn_thread }
|
24
|
+
@auto_trimmer = GrpcKit::ThreadPool::AutoTrimmer.new(self, interval: interval + rand(10)).tap(&:start!)
|
23
25
|
end
|
24
26
|
|
25
27
|
def schedule(task, &block)
|
@@ -32,25 +34,31 @@ module Griffin
|
|
32
34
|
end
|
33
35
|
|
34
36
|
# TODO: blocking now..
|
35
|
-
@semaphore.wait
|
36
37
|
@tasks.push(block || task)
|
37
38
|
|
38
|
-
@mutex.synchronize
|
39
|
-
|
40
|
-
spawn_thread
|
41
|
-
end
|
39
|
+
if @mutex.synchronize { (@waiting < @tasks.size) && (@spawned < @max_pool_size) }
|
40
|
+
spawn_thread
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
44
|
def shutdown
|
46
45
|
@shutdown = true
|
47
|
-
@
|
46
|
+
@max_pool_size.times { @tasks.push(nil) }
|
47
|
+
@auto_trimmer.stop
|
48
48
|
until @workers.empty?
|
49
|
-
Griffin.logger.debug("
|
49
|
+
Griffin.logger.debug("Shutdown waiting #{@waiting} workers")
|
50
50
|
sleep 1
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
# For GrpcKit::ThreadPool::AutoTrimmer
|
55
|
+
def trim(force = false)
|
56
|
+
if @mutex.synchronize { (force || (@waiting > 0)) && (@spawned > @min_pool_size) }
|
57
|
+
GrpcKit.logger.info("Trim worker! Next worker size #{@spawned - 1}")
|
58
|
+
@tasks.push(nil)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
54
62
|
private
|
55
63
|
|
56
64
|
def spawn_thread
|
@@ -64,7 +72,9 @@ module Griffin
|
|
64
72
|
break
|
65
73
|
end
|
66
74
|
|
75
|
+
@mutex.synchronize { @waiting += 1 }
|
67
76
|
task = @tasks.pop
|
77
|
+
@mutex.synchronize { @waiting -= 1 }
|
68
78
|
if task.nil?
|
69
79
|
break
|
70
80
|
end
|
@@ -73,8 +83,6 @@ module Griffin
|
|
73
83
|
@block.call(task)
|
74
84
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
75
85
|
Griffin.logger.error("An error occured on top level in worker #{Thread.current.name}: #{e.message} (#{e.class})\n #{Thread.current.backtrace.join("\n")} ")
|
76
|
-
ensure
|
77
|
-
@semaphore.signal
|
78
86
|
end
|
79
87
|
end
|
80
88
|
|
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.2.0
|
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-01-
|
11
|
+
date: 2019-01-28 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.3.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.3.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: serverengine
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,7 +142,6 @@ files:
|
|
142
142
|
- examples/routeguide_server.rb
|
143
143
|
- griffin.gemspec
|
144
144
|
- lib/griffin.rb
|
145
|
-
- lib/griffin/counting_semaphore.rb
|
146
145
|
- lib/griffin/engine.rb
|
147
146
|
- lib/griffin/engine/server.rb
|
148
147
|
- lib/griffin/engine/single.rb
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Griffin
|
4
|
-
class CountingSemaphore
|
5
|
-
def initialize(size)
|
6
|
-
@size = size
|
7
|
-
@queue = Queue.new
|
8
|
-
@size.times { @queue.push(0) }
|
9
|
-
end
|
10
|
-
|
11
|
-
def wait
|
12
|
-
@queue.pop
|
13
|
-
end
|
14
|
-
|
15
|
-
def signal
|
16
|
-
@queue.push(0)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|