griffin-interceptors 0.1.4 → 0.1.5

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
  SHA1:
3
- metadata.gz: fe0fd2e86343914ca2f2f4a6716c415a2ac24936
4
- data.tar.gz: 4932bb8474d59d681889c86a607eb1f1c76c1758
3
+ metadata.gz: eaf4ab1433928865a32bd22d19c1283f826ea526
4
+ data.tar.gz: 43d9b6c7f9a636fa79ae6e4adf8800c0c5326952
5
5
  SHA512:
6
- metadata.gz: 1f2da5faf64741eaf1455fc209443fb5c2a99310fb39a23d27f949024d74b005692e027262d5b3a69d0b56be57b5f66350113b4810a899881a6697388bb0fb44
7
- data.tar.gz: 3a726be452970dffe6a7b0bb9117069352ae4d4a5e3d5a1442669a492518855fd28f04f729b63d4da46a4afa7de4c0796f108be59a1b6f96dca1048f23b49389
6
+ metadata.gz: 57917963336f2b3ba83d84da9c3c59d2c2ac3b3352317375307facadd00b55edc8d415c72c3015bfc4d70295fc1bb06211d4f0c17b382666dc3bd323514f0e6f
7
+ data.tar.gz: 6f198f8b51e9a9afd723cc6d285307685e226941af9ed51f67a465a9e193c4853a1c21fbd3bf834db08f7bd8a1682cc96cae0e21cc74643728c8e6cf4fd5ae6e
@@ -20,7 +20,8 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_dependency 'griffin', '>= 0.1.5'
23
+ spec.add_dependency 'get_process_mem', '~> 0.2.3'
24
+ spec.add_dependency 'griffin', '>= 0.2.3'
24
25
 
25
26
  spec.add_development_dependency 'bundler'
26
27
  spec.add_development_dependency 'rake'
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'get_process_mem'
4
+
5
+ module Griffin
6
+ module Interceptors
7
+ module Server
8
+ class WorkerKillerInterceptor < GRPC::ServerInterceptor
9
+ def initialize(memory_limit_min: 1024**3, memory_limit_max: 2 * (1024**3), check_cycle: 16)
10
+ @worker_memory_limit_max = memory_limit_max
11
+ @worker_memory_limit_min = memory_limit_min
12
+ @worker_check_cycle = check_cycle
13
+ @worker_memory_limit = @worker_memory_limit_min + rand(@worker_memory_limit_max - @worker_memory_limit_min + 1)
14
+ @worker_check_count = 0
15
+ @sent_signals = false
16
+ end
17
+
18
+ def request_response(*)
19
+ yield.tap do
20
+ break if @sent_signals
21
+
22
+ @worker_process_start ||= Time.now
23
+ @worker_check_count += 1
24
+
25
+ if (@worker_check_count % @worker_check_cycle) == 0
26
+ rss = GetProcessMem.new.bytes
27
+ if rss > @worker_memory_limit
28
+ Griffin.logger.warn("Worker (pid: #{Process.pid}) exceeds memory limit (#{rss.to_i} bytes > #{@worker_memory_limit} bytes)")
29
+ send_restart_signal(@worker_process_start)
30
+ end
31
+
32
+ @worker_check_count = 0
33
+ end
34
+ end
35
+ end
36
+
37
+ alias_method :server_streamer, :request_response
38
+ alias_method :client_streamer, :request_response
39
+ alias_method :bidi_streamer, :request_response
40
+
41
+ private
42
+
43
+ def send_restart_signal(start_time)
44
+ # No need to get a lock, sending signals duplicately is acceptable
45
+ @sent_signals = true
46
+ pid = Process.pid
47
+ alive_sec = (Time.now - start_time).round
48
+
49
+ Griffin.logger.info("Send signal(USR1) pid: #{pid}, alive_sec: #{alive_sec}")
50
+ Process.kill :USR1, pid
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,5 +1,5 @@
1
1
  module Griffin
2
2
  module Interceptors
3
- VERSION = '0.1.4'.freeze
3
+ VERSION = '0.1.5'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: griffin-interceptors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
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-10 00:00:00.000000000 Z
11
+ date: 2019-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: get_process_mem
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.3
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: griffin
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: 0.1.5
33
+ version: 0.2.3
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: 0.1.5
40
+ version: 0.2.3
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -112,6 +126,7 @@ files:
112
126
  - lib/griffin/interceptors/server/rails_exception_interceptor.rb
113
127
  - lib/griffin/interceptors/server/raven_interceptor.rb
114
128
  - lib/griffin/interceptors/server/timeout_interceptor.rb
129
+ - lib/griffin/interceptors/server/worker_killer_interceptor.rb
115
130
  - lib/griffin/interceptors/server/x_request_id_interceptor.rb
116
131
  - lib/griffin/interceptors/version.rb
117
132
  homepage: https://github.com/cookpad/griffin-interceptors