ey_snaplock 0.0.9 → 0.0.10
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/lib/ey_snaplock.rb +17 -1
- data/lib/ey_snaplock/database/mysql.rb +6 -3
- data/lib/ey_snaplock/database/postgresql9.rb +6 -2
- data/lib/ey_snaplock/version.rb +1 -1
- metadata +123 -61
data/lib/ey_snaplock.rb
CHANGED
@@ -69,8 +69,24 @@ module EY
|
|
69
69
|
|
70
70
|
def database_lock(database_uri, timeout, &block)
|
71
71
|
database = Database.for(database_uri)
|
72
|
+
with_locked_db = block
|
72
73
|
lambda do
|
73
|
-
database.
|
74
|
+
lock_filename = database.lock_filename
|
75
|
+
file = File.open(lock_filename, File::RDWR|File::EXCL|File::CREAT) rescue nil
|
76
|
+
if !file && File.mtime(lock_filename) < (Time.now - (20 * 60 * 60))
|
77
|
+
$stdout.puts "Cleared stale database lock: #{lock_filename}"
|
78
|
+
file = File.open(lock_filename, File::RDWR|File::EXCL)
|
79
|
+
elsif !file
|
80
|
+
$stderr.puts "Failed to acquire database lock: #{lock_filename}"
|
81
|
+
exit 1
|
82
|
+
end
|
83
|
+
file.write(Process.pid.to_s)
|
84
|
+
file.close
|
85
|
+
begin
|
86
|
+
database.with_lock(timeout, &with_locked_db)
|
87
|
+
ensure
|
88
|
+
File.delete(lock_filename) if File.exists?(lock_filename)
|
89
|
+
end
|
74
90
|
end
|
75
91
|
end
|
76
92
|
|
@@ -6,8 +6,12 @@ module EY
|
|
6
6
|
@mysql = mysql_command(uri)
|
7
7
|
end
|
8
8
|
|
9
|
+
def lock_filename
|
10
|
+
ENV["MYSQL_LOCK_FILENAME"] || "/db/mysql/.ey_snaplock.pid"
|
11
|
+
end
|
12
|
+
|
9
13
|
def with_lock(timeout)
|
10
|
-
|
14
|
+
acquire_lock_within_timeout(timeout)
|
11
15
|
write_master_status(ENV["MASTER_STATUS_FILE"] || "/db/mysql/.snapshot_backup_master_status.txt")
|
12
16
|
yield
|
13
17
|
rescue Timeout::Error
|
@@ -23,11 +27,10 @@ module EY
|
|
23
27
|
system(master_status_cmd)
|
24
28
|
end
|
25
29
|
|
26
|
-
def
|
30
|
+
def acquire_lock_within_timeout(timeout)
|
27
31
|
pipe = IO.popen(@mysql, 'w')
|
28
32
|
@read_lock_pid = pipe.pid
|
29
33
|
pipe.puts('flush tables with read lock;')
|
30
|
-
|
31
34
|
SystemTimer.timeout_after(timeout) do
|
32
35
|
until locked?
|
33
36
|
sleep 1
|
@@ -7,9 +7,13 @@ module EY
|
|
7
7
|
@postgresql = postgresql_command(uri)
|
8
8
|
end
|
9
9
|
|
10
|
+
def lock_filename
|
11
|
+
ENV["POSTGRES_LOCK_FILENAME"] || "/db/postgres/.ey_snaplock.pid"
|
12
|
+
end
|
13
|
+
|
10
14
|
# Default function being called (e.g. database.with_lock)
|
11
15
|
def with_lock(timeout) #timeout is ignored
|
12
|
-
|
16
|
+
acquire_lock
|
13
17
|
yield
|
14
18
|
ensure
|
15
19
|
release_lock
|
@@ -17,7 +21,7 @@ module EY
|
|
17
21
|
|
18
22
|
# http://wiki.postgresql.org/wiki/Hot_Standby
|
19
23
|
# We don't need to acquire a read lock for the snapshot. However we do need to create an backup of the base database and force a checkpoint to ensure the data is written so when the slave comes up it has enough data to start.
|
20
|
-
def
|
24
|
+
def acquire_lock
|
21
25
|
pipe = IO.popen(@postgresql, 'w')
|
22
26
|
@read_lock_pid = pipe.pid
|
23
27
|
pipe.puts("select pg_start_backup('backup',true);")
|
data/lib/ey_snaplock/version.rb
CHANGED
metadata
CHANGED
@@ -1,89 +1,141 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ey_snaplock
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 11
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 10
|
10
|
+
version: 0.0.10
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Engine Yard
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2011-12-29 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
15
22
|
name: addressable
|
16
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
25
|
none: false
|
18
|
-
requirements:
|
26
|
+
requirements:
|
19
27
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 2
|
33
|
+
- 2
|
21
34
|
version: 2.2.2
|
22
35
|
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: SystemTimer
|
23
39
|
prerelease: false
|
24
|
-
|
25
|
-
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 29
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 2
|
49
|
+
- 1
|
50
|
+
version: 1.2.1
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
26
54
|
name: rake
|
27
|
-
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
28
57
|
none: false
|
29
|
-
requirements:
|
30
|
-
- - =
|
31
|
-
- !ruby/object:Gem::Version
|
58
|
+
requirements:
|
59
|
+
- - "="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 49
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 8
|
65
|
+
- 7
|
32
66
|
version: 0.8.7
|
33
67
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
37
70
|
name: realweb
|
38
|
-
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
39
73
|
none: false
|
40
|
-
requirements:
|
74
|
+
requirements:
|
41
75
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 21
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
- 2
|
81
|
+
- 1
|
43
82
|
version: 0.2.1
|
44
83
|
type: :development
|
45
|
-
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
48
86
|
name: cucumber
|
49
|
-
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
50
89
|
none: false
|
51
|
-
requirements:
|
90
|
+
requirements:
|
52
91
|
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 55
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
- 10
|
97
|
+
- 0
|
54
98
|
version: 0.10.0
|
55
99
|
type: :development
|
56
|
-
|
57
|
-
|
58
|
-
- !ruby/object:Gem::Dependency
|
100
|
+
version_requirements: *id005
|
101
|
+
- !ruby/object:Gem::Dependency
|
59
102
|
name: aruba
|
60
|
-
|
103
|
+
prerelease: false
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
61
105
|
none: false
|
62
|
-
requirements:
|
106
|
+
requirements:
|
63
107
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 13
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
- 3
|
113
|
+
version: "0.3"
|
66
114
|
type: :development
|
67
|
-
|
68
|
-
|
69
|
-
- !ruby/object:Gem::Dependency
|
115
|
+
version_requirements: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
70
117
|
name: sinatra
|
71
|
-
|
118
|
+
prerelease: false
|
119
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
72
120
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: 3
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
version: "0"
|
77
128
|
type: :development
|
78
|
-
|
79
|
-
version_requirements: *2151908160
|
129
|
+
version_requirements: *id007
|
80
130
|
description: Server side components for Engine Yard's snapshotting process
|
81
131
|
email:
|
82
|
-
executables:
|
132
|
+
executables:
|
83
133
|
- ey-snaplock
|
84
134
|
extensions: []
|
135
|
+
|
85
136
|
extra_rdoc_files: []
|
86
|
-
|
137
|
+
|
138
|
+
files:
|
87
139
|
- bin/ey-snaplock
|
88
140
|
- lib/ey_snaplock/database/mysql.rb
|
89
141
|
- lib/ey_snaplock/database/postgresql9.rb
|
@@ -92,29 +144,39 @@ files:
|
|
92
144
|
- lib/ey_snaplock.rb
|
93
145
|
- LICENSE
|
94
146
|
- README.md
|
147
|
+
has_rdoc: true
|
95
148
|
homepage:
|
96
149
|
licenses: []
|
150
|
+
|
97
151
|
post_install_message:
|
98
152
|
rdoc_options: []
|
99
|
-
|
153
|
+
|
154
|
+
require_paths:
|
100
155
|
- lib
|
101
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
157
|
none: false
|
103
|
-
requirements:
|
104
|
-
- -
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
|
107
|
-
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
hash: 3
|
162
|
+
segments:
|
163
|
+
- 0
|
164
|
+
version: "0"
|
165
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
166
|
none: false
|
109
|
-
requirements:
|
110
|
-
- -
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
171
|
+
segments:
|
172
|
+
- 0
|
173
|
+
version: "0"
|
113
174
|
requirements: []
|
175
|
+
|
114
176
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.
|
177
|
+
rubygems_version: 1.3.7
|
116
178
|
signing_key:
|
117
179
|
specification_version: 3
|
118
180
|
summary: Server side components for Engine Yard's snapshotting process
|
119
181
|
test_files: []
|
120
|
-
|
182
|
+
|