galactic-senate 0.1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/galactic-senate.rb +30 -0
- data/lib/galactic-senate/configuration.rb +26 -0
- data/lib/galactic-senate/delegation.rb +114 -0
- data/lib/galactic-senate/version.rb +5 -0
- data/spec/galactic/senate_spec.rb +9 -0
- data/spec/spec_helper.rb +14 -0
- metadata +133 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0bd70552807ba6a4a396837418ef7aaf5c32ee7b
|
4
|
+
data.tar.gz: 4eae80ac0b97aa27108b690c686789698bbab5c5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3d7df3130c4b825c83b9e2bb08726059d35419499bbc670464ddb3e5506382125a1de604b2d9656df84e114c71253d913d18bf7f554c7af0bae72d9ad782ce7c
|
7
|
+
data.tar.gz: 25a0a75e36535949ee936a36ec79350911ab01e7acbdf3111af0c681c59d2c7c635dc1af479ca2453e8af75c6690223f05131246138dd94c9fda37c4c3a7a016
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "galactic-senate/version"
|
4
|
+
require "galactic-senate/configuration"
|
5
|
+
require "galactic-senate/delegation"
|
6
|
+
|
7
|
+
module GalacticSenate
|
8
|
+
class << self
|
9
|
+
attr_accessor :config, :whoami
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.config
|
13
|
+
@config ||= GalacticSenate::Configuration.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.reset
|
17
|
+
@config = GalacticSenate::Configuration.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.configure
|
21
|
+
yield(config)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.whoami
|
25
|
+
@whoami ||= "#{Socket.gethostname}:#{$$}:#{SecureRandom.hex(3)}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GalacticSenate
|
4
|
+
class Configuration
|
5
|
+
|
6
|
+
attr_accessor :redis, :logger, :events
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@redis = nil
|
10
|
+
@logger = Logger.new(STDOUT)
|
11
|
+
@logger.level = Logger::WARN
|
12
|
+
@events = {
|
13
|
+
elected: [],
|
14
|
+
ousted: [],
|
15
|
+
supreme_chancellor_changed: []
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def on(event, &block)
|
21
|
+
raise ArgumentError, "Invalid event: #{event}" unless @events.key?(event) && event.is_a?(Symbol)
|
22
|
+
@events[event] << block
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GalacticSenate
|
4
|
+
class Delegation
|
5
|
+
|
6
|
+
SUPREME_CHANCELLOR_INTERVAL = 10
|
7
|
+
SENATOR_INTERVAL = 30
|
8
|
+
RAND_INTERVAL = 15
|
9
|
+
KEY = "galactic-senate-supreme-chancellor"
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@running = true
|
13
|
+
@supreme_chancellor_timeout = 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.instance
|
17
|
+
@galactic_senate ||= GalacticSenate::Delegation.new
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def self.supreme_chancellor?
|
22
|
+
instance.supreme_chancellor?
|
23
|
+
end
|
24
|
+
|
25
|
+
def supreme_chancellor?
|
26
|
+
( @supreme_chancellor_timeout > Time.now.to_f )
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method :leader?, :supreme_chancellor?
|
30
|
+
class << self
|
31
|
+
alias_method :leader?, :supreme_chancellor?
|
32
|
+
end
|
33
|
+
|
34
|
+
def debate
|
35
|
+
|
36
|
+
vote_of_no_confidence
|
37
|
+
|
38
|
+
timer_task = Concurrent::TimerTask.new(execution_interval: interval) do |task|
|
39
|
+
|
40
|
+
begin
|
41
|
+
vote_now
|
42
|
+
task.execution_interval = interval
|
43
|
+
rescue => e
|
44
|
+
GalacticSenate.config.logger.error "GalacticSenate::Delegation.debate - #{e.message}"
|
45
|
+
GalacticSenate.config.logger.error "GalacticSenate::Delegation.debate - #{e.backtrace.inspect}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
timer_task.execute
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
def vote_now
|
54
|
+
if supreme_chancellor?
|
55
|
+
if update_supreme_chancellor
|
56
|
+
@supreme_chancellor_timeout = Time.now.to_f + SENATOR_INTERVAL
|
57
|
+
else
|
58
|
+
@supreme_chancellor_timeout = 0
|
59
|
+
fire_event(:ousted)
|
60
|
+
end
|
61
|
+
else
|
62
|
+
vote_of_no_confidence
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def vote_of_no_confidence
|
67
|
+
if elect_me_supreme_chancellor?
|
68
|
+
@supreme_chancellor_timeout = Time.now.to_f + SENATOR_INTERVAL
|
69
|
+
fire_event(:elected)
|
70
|
+
else
|
71
|
+
@supreme_chancellor_timeout = 0
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def fire_event(event, val = nil)
|
76
|
+
GalacticSenate.config.events[event].each do |block|
|
77
|
+
begin
|
78
|
+
block.call(val)
|
79
|
+
rescue => e
|
80
|
+
GalacticSenate.config.logger.error "GalacticSenate::Delegation.fire_event - #{e.message}"
|
81
|
+
GalacticSenate.config.logger.error "GalacticSenate::Delegation.fire_event - #{e.backtrace.inspect}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def interval
|
87
|
+
supreme_chancellor? ? SUPREME_CHANCELLOR_INTERVAL : SENATOR_INTERVAL
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def get_supreme_chancellor
|
93
|
+
GalacticSenate.config.redis.call("get",KEY)
|
94
|
+
end
|
95
|
+
|
96
|
+
def delete_supreme_chancellor
|
97
|
+
GalacticSenate.config.redis.call("del",KEY)
|
98
|
+
end
|
99
|
+
|
100
|
+
def expire_supreme_chancellor
|
101
|
+
GalacticSenate.config.redis.call("expire",KEY, SENATOR_INTERVAL)
|
102
|
+
end
|
103
|
+
|
104
|
+
def elect_me_supreme_chancellor?
|
105
|
+
val = GalacticSenate.config.redis.set(KEY, GalacticSenate.whoami, ex: SENATOR_INTERVAL, nx: true)
|
106
|
+
val
|
107
|
+
end
|
108
|
+
|
109
|
+
def update_supreme_chancellor
|
110
|
+
( get_supreme_chancellor == GalacticSenate.whoami ? expire_supreme_chancellor : 0 ) != 0
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "galactic/senate"
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
# Enable flags like --only-failures and --next-failure
|
6
|
+
config.example_status_persistence_file_path = ".rspec_status"
|
7
|
+
|
8
|
+
# Disable RSpec exposing methods globally on `Module` and `main`
|
9
|
+
config.disable_monkey_patching!
|
10
|
+
|
11
|
+
config.expect_with :rspec do |c|
|
12
|
+
c.syntax = :expect
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: galactic-senate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jonathan De Jong
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-09-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: concurrent-ruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: redis
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 3.3.0
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '5.0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 3.3.0
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '5.0'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: bundler
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.16'
|
60
|
+
type: :development
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.16'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: rake
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '10.0'
|
74
|
+
type: :development
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '10.0'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '3.0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '3.0'
|
95
|
+
description:
|
96
|
+
email:
|
97
|
+
- jonathan@helloglobo.com
|
98
|
+
executables: []
|
99
|
+
extensions: []
|
100
|
+
extra_rdoc_files: []
|
101
|
+
files:
|
102
|
+
- lib/galactic-senate.rb
|
103
|
+
- lib/galactic-senate/configuration.rb
|
104
|
+
- lib/galactic-senate/delegation.rb
|
105
|
+
- lib/galactic-senate/version.rb
|
106
|
+
- spec/galactic/senate_spec.rb
|
107
|
+
- spec/spec_helper.rb
|
108
|
+
homepage: https://github.com/jdejong/galactic-senate
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata: {}
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 2.2.0
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 2.4.8
|
129
|
+
signing_key:
|
130
|
+
specification_version: 4
|
131
|
+
summary: galactic-senate provides a framework backed by redis to identify 1 leader
|
132
|
+
for a set of processes.
|
133
|
+
test_files: []
|