ey_snaplock 0.0.12.pre.1 → 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.
data/README.md CHANGED
@@ -1,24 +1,29 @@
1
1
  EY Snaplock
2
2
  ===========
3
3
 
4
- almost known as ey-snapshot-really
4
+ ![EY Snaplock](http://img825.imageshack.us/img825/4323/snaplock.jpg "EY Snaplock")
5
+
6
+ Lock the filesystem and execute database specific 'backup' commands before
7
+ calling the provided URI to initiate the snapshot.
5
8
 
6
- lock the filesystem and almost really run the snapshot.
9
+ Unlocks as necessary when the URI returns (when the snapshot is done).
7
10
 
8
- Postgres testing notes,
11
+ Postgres testing notes
12
+ ----------------------
9
13
 
10
14
  wal_level = hot_standby
11
15
  archive_mode = on
12
16
  archive_command = '/usr/bin/true'
13
17
 
14
- ![EY Snaplock](http://img825.imageshack.us/img825/4323/snaplock.jpg "EY Snaplock")
15
-
16
- Release process:
18
+ Release process
19
+ ---------------
17
20
 
18
- ```
19
- edit version file
21
+ ```
22
+ edit version file and commit
20
23
  gem build ey_snaplock.gemspec
21
24
  gem push ey_snaplock-0.0.5.gem
25
+ git tag v0.0.5
26
+ git push origin v0.0.5
22
27
  edit version file again
23
28
  commit
24
- ```
29
+ ```
data/lib/ey_snaplock.rb CHANGED
@@ -1,20 +1,12 @@
1
1
  require 'net/http'
2
2
  require 'net/https'
3
3
  require 'ey_snaplock/database'
4
-
5
- begin
6
- require 'system_timer'
7
- SnaplockTimer = SystemTimer
8
- rescue LoadError => e
9
- require 'timeout'
10
- SnaplockTimer = Timeout
11
- end
4
+ require 'ey_snaplock/timer'
12
5
 
13
6
  module EY
14
7
  class Snaplock
15
8
  REQUEST_TIMEOUT = 15
16
9
  PER_DATABASE_TIMEOUT = 5
17
- LONG_RUNNING_QUERY_RETRIES = 3
18
10
 
19
11
  def self.call(*argv)
20
12
  new(*argv).call
@@ -60,7 +52,7 @@ module EY
60
52
  def timeout
61
53
  lambda do
62
54
  begin
63
- SnaplockTimer.timeout(REQUEST_TIMEOUT) { yield }
55
+ EY::Snaplock::Timer.timeout(REQUEST_TIMEOUT) { yield }
64
56
  rescue Timeout::Error
65
57
  $stderr.puts "Timeout Exceeded: Callback request took longer than #{REQUEST_TIMEOUT} seconds."
66
58
  raise
@@ -78,24 +70,6 @@ module EY
78
70
  def database_lock(database_uri, timeout, &block)
79
71
  database = Database.for(database_uri)
80
72
  with_locked_db = block
81
-
82
- if database.respond_to?(:has_long_running_queries?)
83
- log_file = '/var/log/ey-snaplock.' + Time.now.strftime("%Y-%m-%dT%H-%M-%S") + '.log'
84
- remaining_retries = LONG_RUNNING_QUERY_RETRIES
85
-
86
- while database.has_long_running_queries?(PER_DATABASE_TIMEOUT) && remaining_retries >= 0
87
- if remaining_retries == 0
88
- database.dump_process_list(log_file)
89
- clean_up_old_log_files
90
- $stderr.puts "Aborting Snaplock due to long running queries. Process list dumped to #{log_file}."
91
- exit 1
92
- else
93
- sleep PER_DATABASE_TIMEOUT
94
- end
95
- end
96
-
97
- end
98
-
99
73
  lambda do
100
74
  lock_filename = database.lock_filename
101
75
  file = File.open(lock_filename, File::RDWR|File::EXCL|File::CREAT) rescue nil
@@ -116,11 +90,6 @@ module EY
116
90
  end
117
91
  end
118
92
 
119
- def clean_up_old_log_files(logs_to_keep = 10)
120
- ordinal = logs_to_keep.succ.to_s
121
- "ls -r /var/log/ey-snaplock.*.log | tail -n +#{ordinal} | xargs -I@ rm @"
122
- end
123
-
124
93
  private
125
94
 
126
95
  def post_path_for_uri(uri)
@@ -7,7 +7,7 @@ module EY
7
7
  end
8
8
 
9
9
  def lock_filename
10
- ENV["MYSQL_LOCK_FILENAME"] || "/db/mysql/.ey_snaplock.pid"
10
+ ENV["MYSQL_LOCK_FILENAME"] || "/var/run/ey_snaplock_mysql.pid"
11
11
  end
12
12
 
13
13
  def with_lock(timeout)
@@ -31,7 +31,7 @@ module EY
31
31
  pipe = IO.popen(@mysql, 'w')
32
32
  @read_lock_pid = pipe.pid
33
33
  pipe.puts('flush tables with read lock;')
34
- SnaplockTimer.timeout(timeout) do
34
+ EY::Snaplock::Timer.timeout(timeout) do
35
35
  until locked?
36
36
  sleep 1
37
37
  end
@@ -56,22 +56,6 @@ module EY
56
56
  Process.kill('TERM', @read_lock_pid) # unlock tables
57
57
  end
58
58
 
59
- def has_long_running_queries?(cutoff_in_seconds)
60
- %x<#{@mysql} -B -N -e 'show processlist;'>.split("\n").each do |process_entry|
61
- id, user, host, db, command, time, state, info = process_entry.split("\t")
62
-
63
- next if %w{root system}.include? user
64
- next if ['Sleep', 'Binlog Dump'].include? command
65
-
66
- return true if time.to_i > cutoff_in_seconds
67
- end
68
- false
69
- end
70
-
71
- def dump_process_list(logfile)
72
- system("#{@mysql} -N -e 'show processlist;' >> #{logfile}")
73
- end
74
-
75
59
  def mysql_command(uri)
76
60
  command = "mysql"
77
61
  command << " -u" << (uri.user || 'root')
@@ -8,7 +8,7 @@ module EY
8
8
  end
9
9
 
10
10
  def lock_filename
11
- ENV["POSTGRES_LOCK_FILENAME"] || "/db/postgresql/.ey_snaplock.pid"
11
+ ENV["POSTGRES_LOCK_FILENAME"] || "/var/run/ey_snaplock_postgresql.pid"
12
12
  end
13
13
 
14
14
  # Default function being called (e.g. database.with_lock)
@@ -0,0 +1,15 @@
1
+ module EY
2
+ class Snaplock
3
+ class Timer
4
+ def self.timeout(sec)
5
+ if RUBY_VERSION =~ /^1\.8/
6
+ require 'system_timer'
7
+ SystemTimer.timeout_after(sec) { yield }
8
+ else
9
+ require 'timeout'
10
+ Timeout.timeout(sec) { yield }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  module EY
2
2
  class Snaplock
3
- VERSION = '0.0.12.pre.1'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ey_snaplock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12.pre.1
5
- prerelease: 7
4
+ version: 0.1.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Engine Yard
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-16 00:00:00.000000000 Z
12
+ date: 2012-11-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - '='
36
36
  - !ruby/object:Gem::Version
37
- version: 0.8.7
37
+ version: 0.9.2.2
38
38
  type: :development
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - '='
44
44
  - !ruby/object:Gem::Version
45
- version: 0.8.7
45
+ version: 0.9.2.2
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: realweb
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -118,6 +118,7 @@ files:
118
118
  - lib/ey_snaplock/database/mysql.rb
119
119
  - lib/ey_snaplock/database/postgresql9.rb
120
120
  - lib/ey_snaplock/database.rb
121
+ - lib/ey_snaplock/timer.rb
121
122
  - lib/ey_snaplock/version.rb
122
123
  - lib/ey_snaplock.rb
123
124
  - LICENSE
@@ -137,12 +138,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
138
  required_rubygems_version: !ruby/object:Gem::Requirement
138
139
  none: false
139
140
  requirements:
140
- - - ! '>'
141
+ - - ! '>='
141
142
  - !ruby/object:Gem::Version
142
- version: 1.3.1
143
+ version: '0'
143
144
  requirements: []
144
145
  rubyforge_project:
145
- rubygems_version: 1.8.23
146
+ rubygems_version: 1.8.24
146
147
  signing_key:
147
148
  specification_version: 3
148
149
  summary: Server side components for Engine Yard's snapshotting process