eye 0.8.1 → 0.9.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +21 -2
  4. data/.travis.yml +2 -1
  5. data/Gemfile +3 -0
  6. data/LICENSE +1 -1
  7. data/README.md +1 -1
  8. data/bin/loader_eye +1 -1
  9. data/examples/delayed_job.eye +2 -2
  10. data/examples/processes/sample.rb +1 -1
  11. data/examples/puma.eye +1 -1
  12. data/examples/rbenv.eye +1 -1
  13. data/examples/sidekiq.eye +1 -1
  14. data/examples/test.eye +1 -1
  15. data/examples/thin-farm.eye +1 -1
  16. data/examples/unicorn.eye +1 -1
  17. data/eye.gemspec +2 -2
  18. data/lib/eye.rb +2 -3
  19. data/lib/eye/application.rb +3 -6
  20. data/lib/eye/checker.rb +4 -3
  21. data/lib/eye/checker/children_count.rb +3 -3
  22. data/lib/eye/checker/socket.rb +7 -12
  23. data/lib/eye/child_process.rb +5 -7
  24. data/lib/eye/cli.rb +6 -4
  25. data/lib/eye/cli/commands.rb +1 -1
  26. data/lib/eye/cli/render.rb +6 -5
  27. data/lib/eye/client.rb +9 -4
  28. data/lib/eye/controller.rb +2 -2
  29. data/lib/eye/controller/{send_command.rb → apply.rb} +25 -32
  30. data/lib/eye/controller/commands.rb +13 -10
  31. data/lib/eye/controller/load.rb +49 -38
  32. data/lib/eye/controller/status.rb +2 -2
  33. data/lib/eye/dsl.rb +1 -1
  34. data/lib/eye/dsl/application_opts.rb +2 -2
  35. data/lib/eye/dsl/child_process_opts.rb +1 -1
  36. data/lib/eye/dsl/config_opts.rb +1 -1
  37. data/lib/eye/dsl/group_opts.rb +3 -3
  38. data/lib/eye/dsl/main.rb +3 -3
  39. data/lib/eye/dsl/opts.rb +17 -21
  40. data/lib/eye/dsl/process_opts.rb +3 -3
  41. data/lib/eye/dsl/validation.rb +2 -2
  42. data/lib/eye/group.rb +8 -114
  43. data/lib/eye/group/call.rb +73 -0
  44. data/lib/eye/group/chain.rb +19 -17
  45. data/lib/eye/group/data.rb +40 -0
  46. data/lib/eye/loader.rb +1 -1
  47. data/lib/eye/logger.rb +4 -4
  48. data/lib/eye/process.rb +2 -0
  49. data/lib/eye/process/commands.rb +11 -19
  50. data/lib/eye/process/config.rb +2 -1
  51. data/lib/eye/process/controller.rb +5 -12
  52. data/lib/eye/process/data.rb +11 -3
  53. data/lib/eye/process/monitor.rb +5 -5
  54. data/lib/eye/process/notify.rb +1 -1
  55. data/lib/eye/process/scheduler.rb +118 -63
  56. data/lib/eye/process/states.rb +10 -9
  57. data/lib/eye/process/states_history.rb +1 -1
  58. data/lib/eye/process/system.rb +1 -1
  59. data/lib/eye/process/trigger.rb +5 -4
  60. data/lib/eye/process/validate.rb +1 -1
  61. data/lib/eye/server.rb +22 -9
  62. data/lib/eye/trigger.rb +4 -7
  63. data/lib/eye/trigger/check_dependency.rb +1 -1
  64. data/lib/eye/trigger/flapping.rb +8 -10
  65. data/lib/eye/trigger/starting_guard.rb +7 -4
  66. data/lib/eye/trigger/stop_children.rb +1 -1
  67. data/lib/eye/trigger/wait_dependency.rb +2 -2
  68. data/lib/eye/utils.rb +19 -9
  69. metadata +10 -10
  70. data/lib/eye/reason.rb +0 -26
  71. data/lib/eye/utils/celluloid_chain.rb +0 -73
@@ -25,13 +25,30 @@ class Eye::Server
25
25
  text = socket.read
26
26
 
27
27
  begin
28
- cmd, *args = Marshal.load(text)
29
- rescue => ex
30
- error "Failed to read from socket: #{ex.message}"
31
- return
28
+ # TODO, remove in 1.0
29
+
30
+ payload = Marshal.load(text)
31
+ raise "unknown payload #{payload.inspect}" unless payload.is_a?(Array)
32
+ cmd, *args = payload
33
+
34
+ rescue
35
+ # new format
36
+ begin
37
+ pos = text.index("\n")
38
+ msg_size = text[0..pos].to_i
39
+ content = text[pos + 1..-1]
40
+ content << socket.read(msg_size - content.length) while content.length < msg_size
41
+ payload = Marshal.load(content)
42
+ cmd = payload[:command]
43
+ args = payload[:args]
44
+
45
+ rescue => ex
46
+ error "Failed to read from socket: #{ex.message}"
47
+ return
48
+ end
32
49
  end
33
50
 
34
- response = command(cmd, *args)
51
+ response = Eye::Control.command(cmd, *args, {})
35
52
  socket.write(Marshal.dump(response))
36
53
 
37
54
  rescue Errno::EPIPE
@@ -42,10 +59,6 @@ class Eye::Server
42
59
  socket.close
43
60
  end
44
61
 
45
- def command(cmd, *args)
46
- Eye::Control.command(cmd, *args)
47
- end
48
-
49
62
  def unlink_socket_file
50
63
  File.delete(@socket_path) if @socket_path
51
64
  rescue
@@ -65,19 +65,16 @@ class Eye::Trigger
65
65
  "trigger(#{@options[:type]})"
66
66
  end
67
67
 
68
- def notify(transition, reason)
68
+ def notify(transition, state_call)
69
69
  debug { "check (:#{transition.event}) :#{transition.from} => :#{transition.to}" }
70
- @reason = reason
70
+ @state_call = state_call
71
71
  @transition = transition
72
72
 
73
73
  check(transition) if filter_transition(transition)
74
74
 
75
75
  rescue Object => ex
76
- if ex.class == Eye::Process::StateError
77
- raise ex
78
- else
79
- log_ex(ex)
80
- end
76
+ raise ex if ex.class == Eye::Process::StateError || ex.class == Celluloid::TaskTerminated
77
+ log_ex(ex)
81
78
  end
82
79
 
83
80
  param :to, [Symbol, Array]
@@ -25,7 +25,7 @@ private
25
25
 
26
26
  if act
27
27
  processes.each do |p|
28
- p.schedule act, Eye::Reason.new(:"#{act} dependecies")
28
+ p.schedule command: act, reason: "#{act} dependecies"
29
29
  end
30
30
  end
31
31
  end
@@ -44,20 +44,18 @@ private
44
44
  debug { 'flapping recognized!!!' }
45
45
 
46
46
  process.notify :error, 'flapping!'
47
- process.schedule :unmonitor, Eye::Reason::Flapping.new(:flapping)
47
+ process.schedule command: :unmonitor, by: :flapping
48
48
 
49
49
  return unless retry_in
50
50
  if !retry_times || (retry_times && @retry_times < retry_times)
51
51
  @retry_times += 1
52
- process.schedule_in(retry_in.to_f, :conditional_start, Eye::Reason::Flapping.new('retry start after flapping'))
53
- else
54
- if reretry_in
55
- if !reretry_times || (reretry_times && @reretry_times < reretry_times)
56
- @retry_times = 0
57
- @reretry_times += 1
58
- process.schedule_in(reretry_in.to_f, :conditional_start, Eye::Reason::Flapping.new('reretry start after flapping'))
59
- end
60
- end
52
+ process.schedule(in: retry_in.to_f, command: :conditional_start,
53
+ by: :flapping, reason: 'retry start after flapping')
54
+ elsif reretry_in && !reretry_times || (reretry_times && @reretry_times < reretry_times)
55
+ @retry_times = 0
56
+ @reretry_times += 1
57
+ process.schedule(in: reretry_in.to_f, command: :conditional_start,
58
+ by: :flapping, reason: 'reretry start after flapping')
61
59
  end
62
60
  end
63
61
 
@@ -41,23 +41,26 @@ class Eye::Trigger::StartingGuard < Eye::Trigger
41
41
  if times
42
42
  if @retry_count < times
43
43
  new_time = Time.now + every
44
- process.schedule_in every, :conditional_start, Eye::Reason::StartingGuard.new('starting_guard, retry start')
44
+ process.schedule(in: every, command: :conditional_start,
45
+ by: :starting_guard, reason: 'starting_guard, retry start')
45
46
  else
46
47
  @retry_count = 0
47
48
  @reretry_count += 1
48
49
  if retry_in && (!retry_times || (@reretry_count < retry_times))
49
50
  new_time = Time.now + retry_in
50
- process.schedule_in retry_in, :conditional_start, Eye::Reason::StartingGuard.new('starting_guard, reretry start')
51
+ process.schedule(in: retry_in, command: :conditional_start,
52
+ by: :starting_guard, reason: 'restarting_guard, retry start')
51
53
  end
52
54
  end
53
55
  else
54
56
  new_time = Time.now + every
55
- process.schedule_in every, :conditional_start, Eye::Reason::StartingGuard.new('starting_guard, retry start')
57
+ process.schedule(in: every, command: :conditional_start,
58
+ by: :starting_guard, reason: 'starting_guard, retry start')
56
59
  end
57
60
  end
58
61
 
59
62
  retry_msg = new_time ? ", retry at '#{Eye::Utils.human_time2(new_time.to_i)}'" : ''
60
- process.switch :unmonitoring, Eye::Reason::StartingGuard.new("starting_guard, failed condition#{retry_msg}")
63
+ process.switch :unmonitoring, by: :starting_guard, reason: "failed condition#{retry_msg}"
61
64
 
62
65
  raise Eye::Process::StateError, 'starting_guard, refused to start'
63
66
  end
@@ -11,7 +11,7 @@ class Eye::Trigger::StopChildren < Eye::Trigger
11
11
 
12
12
  def check(_trans)
13
13
  debug { 'stopping children' }
14
- process.children.values.pmap &:stop
14
+ process.children.values.pmap(&:stop)
15
15
  end
16
16
 
17
17
  end
@@ -20,7 +20,7 @@ private
20
20
 
21
21
  processes.each do |p|
22
22
  if p.state_name != :up && (should_start != false)
23
- p.schedule :start, Eye::Reason.new(:start_dependency)
23
+ p.schedule command: :start, reason: 'start_dependency'
24
24
  end
25
25
  end
26
26
 
@@ -40,7 +40,7 @@ private
40
40
  process.switch :unmonitoring
41
41
 
42
42
  if retry_after
43
- process.schedule_in retry_after, :start, Eye::Reason.new(:wait_dependency)
43
+ process.schedule in: retry_after, command: :start, reason: 'wait_dependency'
44
44
  end
45
45
 
46
46
  raise Eye::Process::StateError, 'stop transition because dependency is not up'
@@ -4,13 +4,14 @@ module Eye::Utils
4
4
 
5
5
  autoload :Tail, 'eye/utils/tail'
6
6
  autoload :AliveArray, 'eye/utils/alive_array'
7
- autoload :CelluloidChain, 'eye/utils/celluloid_chain'
8
7
 
9
8
  def self.deep_clone(value)
10
- case
11
- when value.is_a?(Array) then value.map { |v| deep_clone(v) }
12
- when value.is_a?(Hash) then value.each_with_object({}) { |(k, v), r| r[deep_clone(k)] = deep_clone(v) }
13
- else value
9
+ if value.is_a?(Array)
10
+ value.map { |v| deep_clone(v) }
11
+ elsif value.is_a?(Hash)
12
+ value.each_with_object({}) { |(k, v), r| r[deep_clone(k)] = deep_clone(v) }
13
+ else
14
+ value
14
15
  end
15
16
  end
16
17
 
@@ -27,17 +28,17 @@ module Eye::Utils
27
28
  a
28
29
  end
29
30
 
30
- D1 = '%H:%M'
31
- D2 = '%b%d'
31
+ D1 = '%H:%M'.freeze
32
+ D2 = '%b%d'.freeze
32
33
 
33
34
  def self.human_time(unix_time)
34
35
  time = Time.at(unix_time.to_i)
35
36
  d1 = time.to_date
36
37
  d2 = Time.now.to_date
37
- time.strftime((d1 == d2) ? D1 : D2)
38
+ time.strftime(d1 == d2 ? D1 : D2)
38
39
  end
39
40
 
40
- DF = '%d %b %H:%M'
41
+ DF = '%d %b %H:%M'.freeze
41
42
 
42
43
  def self.human_time2(unix_time)
43
44
  Time.at(unix_time.to_i).strftime(DF)
@@ -56,4 +57,13 @@ module Eye::Utils
56
57
  h
57
58
  end
58
59
 
60
+ def self.wait_signal(timeout = nil, &block)
61
+ signal = Celluloid::Condition.new
62
+ block.call(signal)
63
+ signal.wait((timeout || 600).to_f)
64
+ :ok
65
+ rescue Celluloid::ConditionError
66
+ :timeouted
67
+ end
68
+
59
69
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eye
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Makarchev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-23 00:00:00.000000000 Z
11
+ date: 2016-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: celluloid
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.17.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: state_machine
42
+ name: state_machines
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -112,16 +112,16 @@ dependencies:
112
112
  name: rr
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - '='
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: 1.1.2
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - '='
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: 1.1.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: ruby-graphviz
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -389,11 +389,11 @@ files:
389
389
  - lib/eye/config.rb
390
390
  - lib/eye/control.rb
391
391
  - lib/eye/controller.rb
392
+ - lib/eye/controller/apply.rb
392
393
  - lib/eye/controller/commands.rb
393
394
  - lib/eye/controller/helpers.rb
394
395
  - lib/eye/controller/load.rb
395
396
  - lib/eye/controller/options.rb
396
- - lib/eye/controller/send_command.rb
397
397
  - lib/eye/controller/status.rb
398
398
  - lib/eye/dsl.rb
399
399
  - lib/eye/dsl/application_opts.rb
@@ -408,7 +408,9 @@ files:
408
408
  - lib/eye/dsl/pure_opts.rb
409
409
  - lib/eye/dsl/validation.rb
410
410
  - lib/eye/group.rb
411
+ - lib/eye/group/call.rb
411
412
  - lib/eye/group/chain.rb
413
+ - lib/eye/group/data.rb
412
414
  - lib/eye/loader.rb
413
415
  - lib/eye/local.rb
414
416
  - lib/eye/logger.rb
@@ -431,7 +433,6 @@ files:
431
433
  - lib/eye/process/trigger.rb
432
434
  - lib/eye/process/validate.rb
433
435
  - lib/eye/process/watchers.rb
434
- - lib/eye/reason.rb
435
436
  - lib/eye/server.rb
436
437
  - lib/eye/sigar.rb
437
438
  - lib/eye/system.rb
@@ -445,7 +446,6 @@ files:
445
446
  - lib/eye/trigger/wait_dependency.rb
446
447
  - lib/eye/utils.rb
447
448
  - lib/eye/utils/alive_array.rb
448
- - lib/eye/utils/celluloid_chain.rb
449
449
  - lib/eye/utils/mini_active_support.rb
450
450
  - lib/eye/utils/pmap.rb
451
451
  - lib/eye/utils/tail.rb
@@ -1,26 +0,0 @@
1
- class Eye::Reason
2
-
3
- def initialize(mes = nil)
4
- @message = mes
5
- end
6
-
7
- def to_s
8
- @message.to_s
9
- end
10
-
11
- def user?
12
- self.class == User
13
- end
14
-
15
- class User < Eye::Reason
16
-
17
- def to_s
18
- "#{super} by user"
19
- end
20
-
21
- end
22
-
23
- class Flapping < Eye::Reason; end
24
- class StartingGuard < Eye::Reason; end
25
-
26
- end
@@ -1,73 +0,0 @@
1
- require 'celluloid'
2
-
3
- class Eye::Utils::CelluloidChain
4
-
5
- include Celluloid
6
-
7
- def initialize(target)
8
- @target = target
9
- @calls = []
10
- @running = false
11
- @target_class = @target.class
12
- end
13
-
14
- def add(method_name, *args)
15
- @calls << { method_name: method_name, args: args }
16
- ensure_process
17
- end
18
-
19
- def add_wo_dups(method_name, *args)
20
- h = { method_name: method_name, args: args }
21
- if @calls[-1] != h
22
- @calls << h
23
- ensure_process
24
- end
25
- end
26
-
27
- def add_wo_dups_current(method_name, *args)
28
- h = { method_name: method_name, args: args }
29
- if !@calls.include?(h) && @call != h
30
- @calls << h
31
- ensure_process
32
- end
33
- end
34
-
35
- def list
36
- @calls
37
- end
38
-
39
- def names_list
40
- list.map { |el| el[:method_name].to_sym }
41
- end
42
-
43
- def clear
44
- @calls = []
45
- end
46
-
47
- alias_method :clear_pending_list, :clear
48
-
49
- # need, because of https://github.com/celluloid/celluloid/issues/22
50
- def inspect
51
- "Celluloid::Chain(#{@target_class}: #{@calls.size})"
52
- end
53
-
54
- attr_reader :running
55
-
56
- private
57
-
58
- def ensure_process
59
- unless @running
60
- @running = true
61
- async.process
62
- end
63
- end
64
-
65
- def process
66
- while @call = @calls.shift
67
- @running = true
68
- @target.send(@call[:method_name], *@call[:args]) if @target.alive?
69
- end
70
- @running = false
71
- end
72
-
73
- end