ey_snaplock 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
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.with_lock(timeout, &block)
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
- aquire_lock_within_timeout(timeout)
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 aquire_lock_within_timeout(timeout)
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
- aquire_lock
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 aquire_lock
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);")
@@ -1,5 +1,5 @@
1
1
  module EY
2
2
  class Snaplock
3
- VERSION = '0.0.9'
3
+ VERSION = '0.0.10'
4
4
  end
5
5
  end
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
- version: 0.0.9
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
- date: 2011-12-07 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
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
- requirement: &2151900320 !ruby/object:Gem::Requirement
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
- version_requirements: *2151900320
25
- - !ruby/object:Gem::Dependency
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
- requirement: &2151896640 !ruby/object:Gem::Requirement
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
- prerelease: false
35
- version_requirements: *2151896640
36
- - !ruby/object:Gem::Dependency
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
37
70
  name: realweb
38
- requirement: &2151895340 !ruby/object:Gem::Requirement
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
- prerelease: false
46
- version_requirements: *2151895340
47
- - !ruby/object:Gem::Dependency
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
48
86
  name: cucumber
49
- requirement: &2151909920 !ruby/object:Gem::Requirement
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
- prerelease: false
57
- version_requirements: *2151909920
58
- - !ruby/object:Gem::Dependency
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
59
102
  name: aruba
60
- requirement: &2151908900 !ruby/object:Gem::Requirement
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
- version: '0.3'
108
+ - !ruby/object:Gem::Version
109
+ hash: 13
110
+ segments:
111
+ - 0
112
+ - 3
113
+ version: "0.3"
66
114
  type: :development
67
- prerelease: false
68
- version_requirements: *2151908900
69
- - !ruby/object:Gem::Dependency
115
+ version_requirements: *id006
116
+ - !ruby/object:Gem::Dependency
70
117
  name: sinatra
71
- requirement: &2151908160 !ruby/object:Gem::Requirement
118
+ prerelease: false
119
+ requirement: &id007 !ruby/object:Gem::Requirement
72
120
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ hash: 3
125
+ segments:
126
+ - 0
127
+ version: "0"
77
128
  type: :development
78
- prerelease: false
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
- files:
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
- require_paths:
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
- version: '0'
107
- required_rubygems_version: !ruby/object:Gem::Requirement
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
- version: '0'
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.8.10
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
- has_rdoc:
182
+