rails_grpc 0.1.1 → 0.1.2

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