rails_grpc 0.1.1 → 0.1.2

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
  SHA1:
3
- metadata.gz: d366cc22163cbb02c16dc299be7180222183b608
4
- data.tar.gz: 8ec96617b1c0b8d9acf4120545a0863e6e3111fc
3
+ metadata.gz: 77799fe1c9e201856a2f7caf30278367261f84a1
4
+ data.tar.gz: dcf08de3fa9abe88417e3e5277809761bf0d9e5a
5
5
  SHA512:
6
- metadata.gz: 57c873d6cbbf088ba58263b0e29334598edbfe635a6872ff7ea921e8bb73476c3c69b2e70789a53958826f4a996e2a6a7bb69f2f5e756b36cfdd0fcf4cca5b3b
7
- data.tar.gz: a44d0ce699339c40333385a9a46c12968c8543b5cbfa31eb821a67cf2ac3a6d75df73de08c52d46183a346803614209a930e901151dbc80333ae29e7cc66e908
6
+ metadata.gz: df1e394da19657184461b21c7a8a4895472fb3633ca977192a2e4f877eb81642eab033e3325256a809b09e1aaca4a8546e14b83764ef33303d729055843fb65c
7
+ data.tar.gz: b091153b324be138a6a875014bbe44fdb3c7ad2c98a821a9acbf0955373e01841cde38d20973fa89ecd3a1024a5886c16ced07f00b66c0e5834774aae4c8b2dc
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- rails_grpc (0.1.1)
12
+ rails_grpc (0.1.2)
13
13
  grpc
14
14
  protobuf
15
15
  rails
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/rails_grpc/cli"
4
+
5
+ begin
6
+ cli = RailsGrpc::CLI.instance
7
+ cli.parse
8
+ cli.run
9
+ rescue => e
10
+ STDERR.puts e.message
11
+ STDERR.puts e.backtrace.join("\n")
12
+ exit 1
13
+ end
@@ -0,0 +1,39 @@
1
+ module RailsGrpc
2
+ class Boot
3
+ attr_accessor :server
4
+
5
+ GRPC_DEFAULT_PORT = "127.0.0.1:5050"
6
+ GRPC_DEFAULT_POOL_SIZE = 1
7
+ RAILS_BOOT_PATH = "config/environment.rb"
8
+ GRPC_CONFIG_PATH = "config/grpc.yml"
9
+
10
+ def exec(environment)
11
+ require File.expand_path(RAILS_BOOT_PATH) # Load rails
12
+ require "rails_grpc/general_server"
13
+
14
+ c = config[environment]
15
+ @server = RailsGrpc::GeneralServer.new(
16
+ port: c["server"]["port"] || GRPC_DEFAULT_PORT,
17
+ pool_size: c["server"]["pool_size"] || GRPC_DEFAULT_POOL_SIZE
18
+ )
19
+ @server.set_handlers(c["handlers"].map(&:constantize))
20
+ @server.run
21
+ end
22
+
23
+ private
24
+
25
+ def config
26
+ @_config ||= load_config_file
27
+ end
28
+
29
+ def load_config_file
30
+ if File.exist?(GRPC_CONFIG_PATH)
31
+ require 'erb'
32
+ YAML.load(ERB.new(IO.read(GRPC_CONFIG_PATH)).result)
33
+ else
34
+ puts "config/grpc.yml file not found."
35
+ exit 1
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,117 @@
1
+ require "singleton"
2
+ require "rails_grpc/boot"
3
+
4
+ module RailsGrpc
5
+ class CLI
6
+ include Singleton
7
+
8
+ WORKER_LAUNCH_RETRY_LIMIT = 3
9
+ RAILS_LAUNCH_WAIT_TIME = 10 # FIXME
10
+
11
+ attr_accessor :worker_pid, :server, :mutex
12
+
13
+ def initialize
14
+ @mutex = Mutex.new
15
+ set_environment
16
+ end
17
+
18
+ def parse
19
+ end
20
+
21
+ def run
22
+ @worker_pid = Process.fork
23
+ if @worker_pid
24
+ print_banner
25
+ puts "Start GRPC master (pid: #{$$})"
26
+ set_master_trap
27
+ Process.waitall
28
+ else
29
+ boot_grpc_server
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def set_environment
36
+ env ||= ENV["RAILS_ENV"]
37
+ env ||= ENV["RACK_ENV"]
38
+ env ||= "development"
39
+
40
+ ENV["RAILS_ENV"] = ENV["RACK_ENV"] = env
41
+ env
42
+ end
43
+
44
+ def environment
45
+ ENV["RAILS_ENV"]
46
+ end
47
+
48
+ def boot_grpc_server
49
+ RailsGrpc::Boot.new.exec(environment)
50
+ end
51
+
52
+ def print_banner
53
+ puts "\e[#{31}m"
54
+ puts <<-EOS
55
+ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛ
56
+ °°ÛÛÛ°°°°°ÛÛÛ °°ÛÛÛ°°°°°ÛÛÛ ÛÛÛ°°°°°ÛÛÛ
57
+ ÛÛÛÛÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ ÛÛÛ °°°
58
+ ÛÛÛ°°ÛÛÛ °ÛÛÛÛÛÛÛÛÛÛ °ÛÛÛÛÛÛÛÛÛÛ °ÛÛÛ
59
+ °ÛÛÛ °ÛÛÛ °ÛÛÛ°°°°°ÛÛÛ °ÛÛÛ°°°°°° °ÛÛÛ
60
+ °ÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ °ÛÛÛ °°ÛÛÛ ÛÛÛ
61
+ °°ÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛ °°ÛÛÛÛÛÛÛÛÛ
62
+ °°°°°ÛÛÛ°°°°° °°°°° °°°°° °°°°°°°°°
63
+ ÛÛÛ °ÛÛÛ
64
+ °°ÛÛÛÛÛÛ
65
+ °°°°°°
66
+ EOS
67
+ puts "\e[0m"
68
+ end
69
+
70
+ def set_master_trap
71
+ Signal.trap(:USR1) do
72
+ t = Thread.new do
73
+ @mutex.synchronize do
74
+ launch_new_worker
75
+ end
76
+ end
77
+ t.report_on_exception = false
78
+ t.run
79
+ end
80
+ end
81
+
82
+ def launch_new_worker
83
+ new_worker_pid = Process.fork
84
+ if new_worker_pid
85
+ puts "Launch new worker process (pid: #{new_worker_pid}) and kill old worker (pid:#{@worker_pid})"
86
+ retry_limit = WORKER_LAUNCH_RETRY_LIMIT
87
+
88
+ # FIXME: ugly code
89
+ while !process_exists?(new_worker_pid)
90
+ puts "waiting new worker"
91
+ sleep 1
92
+
93
+ retry_limit -= 1
94
+ if retry_limit < 0
95
+ puts "Failed to Launch new worker..."
96
+ exit 1
97
+ end
98
+ end
99
+ sleep RAILS_LAUNCH_WAIT_TIME # FIXME: bad code
100
+
101
+ Process.kill("TERM", @worker_pid)
102
+ @worker_pid = new_worker_pid
103
+ else
104
+ boot_grpc_server
105
+ end
106
+ end
107
+
108
+ def process_exists?(pid)
109
+ Process.kill(0, pid.to_i)
110
+ true
111
+ rescue Error::SCRCH # no such process
112
+ false
113
+ rescue Error::EPERM # process exists, no permission
114
+ true
115
+ end
116
+ end
117
+ end
@@ -19,9 +19,10 @@ module RailsGrpc
19
19
  end
20
20
 
21
21
  def find_proto_message_definitions
22
- find_proto_lib_files.reject do |t|
22
+ messages = find_proto_lib_files.reject do |t|
23
23
  File.basename(t).include?("_services_pb.rb")
24
24
  end
25
+ messages.sort_by { |m| m.include?("_model_pb.rb") ? 0 : 1 } # FIXME: temporary patch to load model first
25
26
  end
26
27
 
27
28
  def find_proto_service_definitions
@@ -10,14 +10,20 @@ module RailsGrpc
10
10
  def request_response(request: nil, call: nil, method: nil)
11
11
  grpc_method = "#{method.owner.name}##{method.name}"
12
12
  logger = @logger
13
- logger.debug("[GRPC] #{grpc_method}")
13
+ logger.info("[GRPC] #{grpc_method}")
14
14
  t = Time.now
15
15
 
16
- yield
16
+ begin
17
+ yield
18
+ rescue => e
19
+ logger.error(e)
20
+ logger.error(e.backtrace.join("\n"))
21
+ raise e
22
+ end
17
23
 
18
24
  t = Time.now - t
19
25
  display_duration = "%.1f ms" % (t * 1000.0)
20
- logger.debug("[GRPC response] (#{display_duration}) #{grpc_method}")
26
+ logger.info("[GRPC response] (#{display_duration}) #{grpc_method}")
21
27
  end
22
28
  end
23
29
  end
@@ -10,6 +10,7 @@ module RailsGrpc
10
10
 
11
11
  if Rails.env.development? || Rails.env.test?
12
12
  std_logger = ActiveSupport::Logger.new(STDOUT)
13
+ std_logger.formatter = ActiveSupport::Logger::Formatter.new
13
14
  multiple_loggers = ActiveSupport::Logger.broadcast(std_logger)
14
15
  original_logger.extend(multiple_loggers)
15
16
  end
@@ -1,3 +1,3 @@
1
1
  module RailsGrpc
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_grpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinsuke Nishio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-23 00:00:00.000000000 Z
11
+ date: 2018-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -97,7 +97,8 @@ dependencies:
97
97
  description: gRPC for Ruby on Rails
98
98
  email:
99
99
  - nishio@densan-labs.net
100
- executables: []
100
+ executables:
101
+ - grpc
101
102
  extensions: []
102
103
  extra_rdoc_files: []
103
104
  files:
@@ -112,7 +113,10 @@ files:
112
113
  - Rakefile
113
114
  - bin/console
114
115
  - bin/setup
116
+ - exe/grpc
115
117
  - lib/rails_grpc.rb
118
+ - lib/rails_grpc/boot.rb
119
+ - lib/rails_grpc/cli.rb
116
120
  - lib/rails_grpc/dependencies.rb
117
121
  - lib/rails_grpc/extension/rpc_server.rb
118
122
  - lib/rails_grpc/general_server.rb