uc 0.0.8 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a1136a67ca433cebf902cb4bb1eacc673e61abed
4
- data.tar.gz: 77019d47d98b56c17929eff36c90fd7c8aa8a487
3
+ metadata.gz: 0fed4c2d361dbf1a6dd608eff3b44e40f236d565
4
+ data.tar.gz: dc26fe4d91b8cf96e9dbd1e57fe9868acb54b955
5
5
  SHA512:
6
- metadata.gz: 2f331fac3d78f17fca9267e1213d225c9b9ed0ba83ee1ea452199605a376fd02174336b4bae6cf45ace8013081f6b5b826b06c3e4ef760bc7fe7a5d9b7116cf6
7
- data.tar.gz: 047df981a85aa29710c2ba2cd26e27dcc25b5c0ab716eb1d94a505b29c13801a3d16a50742921b7051a8760f4c863d6fc93b4bf2da76d9aebb02ac1442a4060c
6
+ metadata.gz: 39efff4eff670c6e8a1a87e801e3d478d792316ee9ccd7bdd5d6db00f32ac26a9762c0df889c5b43a4a51e50bbc8b8399191645dff3f2f005910c5a992f0ff33
7
+ data.tar.gz: 157870c3e3e8fac14cb918a270474591f053adc2c847e430ac074d77ae350e18afdffa0d1c274b254a213bec89cbc6ccac8baef9c7ebfa1151ea1b937b8273a2
data/bin/uc CHANGED
@@ -19,10 +19,9 @@ opts_parser = OptionParser.new do |opts|
19
19
 
20
20
  banner = []
21
21
  banner << "Usage: uc [options] command"
22
- banner << ""
23
- banner << "Commands: "
24
- banner << " start stop restart status "
25
- banner << " rolling-restart "
22
+ banner << "Commands: start, stop, restart, status, "
23
+ banner << " rolling-restart, print-config "
24
+ banner << " "
26
25
 
27
26
  opts.banner = banner.join("\n")
28
27
 
@@ -32,7 +31,7 @@ opts_parser = OptionParser.new do |opts|
32
31
  options[:app_dir] = path
33
32
  end
34
33
 
35
- opts.on("-e", "--environment [RAILS_ENV]" , "Set rails env") do |e|
34
+ opts.on("-e", "--environment [RAILS_ENV]" , "Set rails env (default: production)") do |e|
36
35
  options[:rails_env] = e
37
36
  end
38
37
 
@@ -41,11 +40,22 @@ opts_parser = OptionParser.new do |opts|
41
40
  exit
42
41
  end
43
42
 
43
+ opts.on("--use-pid", "use pid instead of lock file to check server status") do
44
+ options[:use_pid] = true
45
+ end
46
+
44
47
  opts.on("--debug", "Show debug messages") do
45
48
  options[:debug] = true
46
49
  logger.level = ::Logger::DEBUG
47
50
  end
48
51
 
52
+ opts.on("--trace", "Show debug messages and exception stack trace") do
53
+ options[:debug] = true
54
+ options[:trace] = true
55
+ logger.level = ::Logger::DEBUG
56
+ end
57
+
58
+
49
59
  opts.on_tail("-h", "--help", "Show this message") do
50
60
  puts opts
51
61
  exit
@@ -56,13 +66,16 @@ begin
56
66
  opts_parser.parse!(ARGV)
57
67
  app_dir = options[:app_dir] || Dir.pwd
58
68
  server = ::Uc::Server.new(app_dir, rails_env: options[:rails_env], debug: options[:debug])
69
+ server.use_pid = options[:use_pid]
59
70
  command = ARGV.shift
60
71
 
61
72
  case command
62
- when "start", "stop", "restart", "status", "print_config"
73
+ when "start", "stop", "restart", "status"
63
74
  server.send command.to_sym
64
75
  when "rr", "rolling-restart"
65
76
  server.rolling_restart
77
+ when "print-config"
78
+ server.print_config
66
79
  when nil
67
80
  logger.error "No command specified"
68
81
  puts opts_parser
@@ -73,7 +86,7 @@ begin
73
86
  end
74
87
 
75
88
  rescue OptionParser::InvalidOption, OptionParser::MissingArgument, ::Uc::Error => e
76
- if options[:debug]
89
+ if options[:trace]
77
90
  raise e
78
91
  else
79
92
  logger.error "#{e.message}"
@@ -43,7 +43,7 @@ module Uc
43
43
  end
44
44
  end
45
45
 
46
- def watch(event_type, timeout: 30, recreate: true, &block)
46
+ def expect(event_type, timeout: 30, recreate: true, &block)
47
47
  mq.recreate if recreate
48
48
  mq.clear
49
49
  yield
@@ -52,7 +52,7 @@ module Uc
52
52
  raise uc_error(e)
53
53
  end
54
54
 
55
- def watch_in_background(event_type, timeout: 30, recreate: true, &block)
55
+ def expect_in_background(event_type, timeout: 30, recreate: true, &block)
56
56
  begin
57
57
  mq.recreate if recreate
58
58
  mq.clear
data/lib/uc/paths.rb CHANGED
@@ -46,8 +46,8 @@ module Uc
46
46
 
47
47
  def log_and_raise_errors
48
48
  if not errors.empty?
49
- errors.each { |e| logger.error e }
50
- raise ::Uc::Error, "exiting due to missing dirs/files"
49
+ errors.each { |e| logger.debug e }
50
+ raise ::Uc::Error, "#{errors.first}"
51
51
  end
52
52
  end
53
53
 
data/lib/uc/server.rb CHANGED
@@ -14,6 +14,7 @@ module Uc
14
14
  include ::Uc::Logger
15
15
 
16
16
  attr_reader :paths, :rails_env, :app_dir
17
+ attr_accessor :use_pid
17
18
 
18
19
  def initialize(app_dir, rails_env: "production", debug: false)
19
20
  @app_dir = app_dir
@@ -27,7 +28,7 @@ module Uc
27
28
  puts server_status
28
29
  return
29
30
  end
30
- event_stream.watch_in_background :fin do
31
+ event_stream.expect_in_background :fin do
31
32
  cmd %{unicorn -c #{uconfig.path} -D -E #{rails_env} }, return_output: false,
32
33
  error_msg: "error starting unicorn"
33
34
  end
@@ -43,6 +44,8 @@ module Uc
43
44
  end
44
45
 
45
46
  def status
47
+ paths.validate_required
48
+ Dir.chdir app_dir
46
49
  puts server_status
47
50
  end
48
51
 
@@ -58,7 +61,7 @@ module Uc
58
61
  start
59
62
  return
60
63
  end
61
- event_stream.watch :fin do
64
+ event_stream.expect :fin do
62
65
  Process.kill("USR2", server_status.pid)
63
66
  end
64
67
  end
@@ -74,7 +77,7 @@ module Uc
74
77
  private
75
78
 
76
79
  def server_status
77
- @server_status ||= ::Uc::Status.new(unicorn_paths)
80
+ @server_status ||= ::Uc::Status.new(unicorn_paths, use_pid: use_pid)
78
81
  end
79
82
 
80
83
  def paths
@@ -99,6 +102,7 @@ module Uc
99
102
 
100
103
  def init
101
104
  paths.validate_required
105
+ Dir.chdir app_dir
102
106
  lock.acquire
103
107
  ::Uc::Logger.event_queue = config.event_queue_name
104
108
  config.load_env
@@ -106,7 +110,10 @@ module Uc
106
110
  end
107
111
 
108
112
  def init_once
109
- @init_once ||= init
113
+ @init_once ||= begin
114
+ init
115
+ true
116
+ end
110
117
  end
111
118
 
112
119
  end
data/lib/uc/status.rb CHANGED
@@ -1,15 +1,18 @@
1
1
  require 'uc/shell_helper'
2
+ require 'uc/logger'
2
3
 
3
4
  module Uc
4
5
  class Status
5
6
 
6
7
  include ::Uc::ShellHelper
8
+ include ::Uc::Logger
7
9
 
8
10
  attr_reader :paths
9
11
  attr_accessor :use_pid
10
12
 
11
- def initialize(unicorn_paths)
13
+ def initialize(unicorn_paths, use_pid: false)
12
14
  @paths = unicorn_paths
15
+ @use_pid = use_pid
13
16
  end
14
17
 
15
18
  def running?
@@ -18,7 +21,18 @@ module Uc
18
21
  end
19
22
 
20
23
  def pid
21
- @pid ||= read_pid
24
+ pid = pid_from_file
25
+ if pid_valid?
26
+ return pid
27
+ else
28
+ logger.debug "pids holding unicorn.lock => #{fuser_pids.join(' ')}"
29
+ logger.debug "pid from file => #{pid}"
30
+ raise ::Uc::Error, "stale pid #{pid}"
31
+ end
32
+ end
33
+
34
+ def pid_from_file
35
+ @pid_from_file ||= read_pid
22
36
  end
23
37
 
24
38
  def stopped?
@@ -26,9 +40,9 @@ module Uc
26
40
  end
27
41
 
28
42
  def to_s
29
- status = ( running? ? "Running pid #{pid}" : "Stopped")
43
+ status = ( running? ? "Running pid #{pid}" : "Stopped" )
30
44
  end
31
-
45
+
32
46
  private
33
47
 
34
48
  def ex_lock_available?
@@ -44,6 +58,20 @@ module Uc
44
58
  return -1
45
59
  end
46
60
 
61
+ def fuser_pids
62
+ @fuser_pids ||= begin
63
+ output = `fuser #{paths.lock_file} 2>/dev/null`
64
+ pids = output.strip.split.map { |pid| pid.to_i }
65
+ end
66
+ end
67
+
68
+ def pid_valid?
69
+ if use_pid
70
+ return true
71
+ else
72
+ fuser_pids.include?(pid_from_file)
73
+ end
74
+ end
47
75
 
48
76
  end
49
77
  end
@@ -35,6 +35,7 @@ before_fork do |server, worker|
35
35
  end
36
36
 
37
37
  after_fork do |server, worker|
38
+ uc.oom_adjust
38
39
  defined?(ActiveRecord::Base) and
39
40
  ActiveRecord::Base.establish_connection
40
41
 
@@ -51,8 +52,6 @@ end
51
52
  if respond_to? :on_exec_fail
52
53
  uc = uc
53
54
  on_exec_fail do |server|
54
- puts "runnign asdadad"
55
55
  uc.on_exec_fail
56
- puts "lol"
57
56
  end
58
57
  end
@@ -52,6 +52,14 @@ module Uc; module Unicorn
52
52
  shared_lock.acquire
53
53
  end
54
54
 
55
+ def oom_adjust
56
+ pid = Process.pid
57
+ oom_file = "/proc/#{pid}/oom_score_adj"
58
+ File.open(oom_file,"w") do |f|
59
+ f.write "100"
60
+ end
61
+ end
62
+
55
63
  def shared_env
56
64
  @shared_env ||= {}
57
65
  end
@@ -34,7 +34,7 @@ module Uc
34
34
  end
35
35
 
36
36
  def acquire_lock
37
- lock_acquired = File.new(lock_file, "a+").flock(File::LOCK_SH | File::LOCK_NB )
37
+ lock_acquired = lock_fd.flock(File::LOCK_SH | File::LOCK_NB )
38
38
  rescue => e
39
39
  stderr.error "#{e.class} #{e.message}\n #{e.backtrace.join("\n")}"
40
40
  return false
@@ -46,6 +46,10 @@ module Uc
46
46
  run
47
47
  end
48
48
 
49
+ def lock_fd
50
+ @lock_fd ||= File.new(lock_file, "a+")
51
+ end
52
+
49
53
  def end_run(worker)
50
54
  @worker = worker
51
55
  if last_worker?
data/lib/uc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Uc
2
- VERSION = "0.0.8"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neeraj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-21 00:00:00.000000000 Z
11
+ date: 2014-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler