clockwork-multiple-nodes 0.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4b36d9eae2e716a20d5ff6f1799825a839186333
4
+ data.tar.gz: 8101a539057042399905b77e163bd737a6c2d5d1
5
+ SHA512:
6
+ metadata.gz: 217eb502ee9bc6c7e835e6c21d240e852678c00587706dac8685e8346d7bd56e55dd20dfe8c0e6a3046e3e7709afe45313d8ce01f3c9e8fd6d9a4c339d43d28d
7
+ data.tar.gz: 9e9341f5db50bd7b6b37fce37856b0787a864c87e148869d3e4a8cd763e3f52fe6b70cfc0755bab5ced88b19204d4a45ede0e278bddb2bfbcb3b53f032ff1c45
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .idea
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in clockwork-multiple-nodes.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Marc Lennox
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # ClockworkMultipleNodes
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'clockwork-multiple-nodes'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install clockwork-multiple-nodes
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'clockwork/multiple_nodes/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "clockwork-multiple-nodes"
8
+ spec.version = Clockwork::MultipleNodes::VERSION
9
+ spec.authors = ["Marc Lennox"]
10
+ spec.email = ["marc.lennox@gmail.com"]
11
+ spec.description = %q{Clockwork plugin to support multiple simultaneous hot-standby nodes}
12
+ spec.summary = %q{Clockwork plugin to support multiple simultaneous hot-standby nodes}
13
+ spec.homepage = "http://github.com/marclennox/clockwork-multiple-nodes"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ puts spec.files
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "clockwork", "~> 0.6"
23
+ spec.add_dependency "redis", "~> 3.0"
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ end
@@ -0,0 +1,2 @@
1
+ require "clockwork/multiple_nodes/version"
2
+ require "clockwork/multiple_nodes/handler"
@@ -0,0 +1,100 @@
1
+ module Clockwork
2
+
3
+ module MultipleNodes
4
+
5
+ class Handler
6
+
7
+ attr_accessor :state
8
+
9
+ def initialize
10
+ log_info("Initializing clockwork multiple nodes handler")
11
+ end
12
+
13
+ def node_id
14
+ @node_id||=SecureRandom.hex(16).downcase
15
+ end
16
+
17
+ def state
18
+ @state||=:initializing
19
+ end
20
+
21
+ def heartbeat_timeout
22
+ config[:heartbeat_timeout] || (config[:sleep_timeout] * 10)
23
+ end
24
+
25
+ def process_name
26
+ name = begin
27
+ Socket.gethostbyname(Socket.gethostname).first
28
+ rescue SocketError => why
29
+ Socket.gethostname.underscore.gsub(".", "_")
30
+ end
31
+ #log_debug("Name: " + name)
32
+ "#{name}-p#{Process.pid}-t#{Thread.current.object_id}"
33
+ end
34
+
35
+ def check_active
36
+ active=false
37
+ if redis.get("#{namespace}:active") == 'true' || redis.setnx("#{namespace}:active", 'true')
38
+ if (existing=redis.get('clockwork:node:id')) == self.node_id || (lock=redis.setnx("#{namespace}:id", self.node_id))
39
+ begin
40
+ log_info("Schedule reserved with [#{self.node_id}]") if lock
41
+ result=redis.multi do
42
+ redis.setex("#{namespace}:name", self.heartbeat_timeout, self.process_name)
43
+ redis.set("#{namespace}:heartbeat", DateTime.now.strftime("%Y-%m-%d %H:%M:%S %Z"))
44
+ redis.expire("#{namespace}:id", self.heartbeat_timeout)
45
+ end
46
+ if result[0] == 'OK'
47
+ self.state=:active
48
+ active=true
49
+ end
50
+ end
51
+ else
52
+ log_info("Schedule already reserved [#{existing}]") unless self.state == :waiting
53
+ self.state=:waiting
54
+ end
55
+ else
56
+ log_info("Schedule is not active") unless self.state == :inactive
57
+ self.state=:inactive
58
+ end
59
+ @proc_name||=$0
60
+ $0="#{@proc_name} - #{self.state} [#{self.node_id}]"
61
+ active
62
+ end
63
+
64
+ def log_info(msg)
65
+ config[:logger].info(msg)
66
+ end
67
+
68
+ def log_debug(msg)
69
+ config[:logger].debug(msg)
70
+ end
71
+
72
+ def log_error(msg)
73
+ config[:logger].error(msg)
74
+ end
75
+
76
+ private
77
+
78
+ def config
79
+ config = nil
80
+ Clockwork.configure { |c| config=c }
81
+ config
82
+ end
83
+
84
+ def multiple_nodes_config
85
+ config[:multiple_nodes]||{}
86
+ end
87
+
88
+ def redis
89
+ multiple_nodes_config[:redis] || Redis.new
90
+ end
91
+
92
+ def namespace
93
+ multiple_nodes_config[:namespace] || 'clockwork:node'
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+
100
+ end
@@ -0,0 +1,5 @@
1
+ module Clockwork
2
+ module MultipleNodes
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clockwork-multiple-nodes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Marc Lennox
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: clockwork
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Clockwork plugin to support multiple simultaneous hot-standby nodes
70
+ email:
71
+ - marc.lennox@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - clockwork-multiple-nodes.gemspec
82
+ - lib/clockwork/multiple_nodes.rb
83
+ - lib/clockwork/multiple_nodes/handler.rb
84
+ - lib/clockwork/multiple_nodes/version.rb
85
+ homepage: http://github.com/marclennox/clockwork-multiple-nodes
86
+ licenses:
87
+ - MIT
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubyforge_project:
105
+ rubygems_version: 2.1.9
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Clockwork plugin to support multiple simultaneous hot-standby nodes
109
+ test_files: []