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 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
+