mongolly 0.2.13 → 0.2.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mongolly/extensions/mongo/mongo_client.rb +29 -6
- data/lib/mongolly/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e4150dd42a9bbef396ff00c1975801aa7b3f04a
|
4
|
+
data.tar.gz: 7f45feff004cdb1899b9a23928c245dc5c14e73a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d5fe8937291b7b98be798fa2af5bb8dd62a829e8d373725b23ae56957b1de1bfae80c3b9bdafa60747532d01f50ca73ec2300ef76727999958995b21bc0ae08
|
7
|
+
data.tar.gz: d14155a3d15822d3e2b3de279645a82ceb2b7b159081eb08776e36e5f8b2fae491196932db30f653a5bd63884f37a23ba4cb18710218d02748c33343bfce9dcf
|
@@ -3,8 +3,16 @@ require "logger"
|
|
3
3
|
require "net/ssh"
|
4
4
|
require "retries"
|
5
5
|
|
6
|
+
class LockFailException < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
class UnlockFailException < StandardError
|
10
|
+
end
|
11
|
+
|
6
12
|
class Mongo::MongoClient
|
7
13
|
MAX_DISABLE_BALANCER_WAIT = 60 * 8 # 8 Minutes
|
14
|
+
MAX_UNLOCK_RETRIES = 3
|
15
|
+
UNLOCK_SLEEP = 10 # 10 Seconds
|
8
16
|
REPLICA_SNAPSHOT_THRESHOLD = 60 * 5 # 5 Minutes
|
9
17
|
REPLICA_SNAPSHOT_PREFER_HIDDEN = true
|
10
18
|
DEFAULT_MONGO_PORT = 27017 # rubocop: disable Style/NumericLiterals
|
@@ -99,14 +107,18 @@ class Mongo::MongoClient
|
|
99
107
|
def with_database_locked
|
100
108
|
@mongolly_logger.debug "Locking database..."
|
101
109
|
disable_profiling
|
102
|
-
|
110
|
+
# {"info"=>"now locked against writes, use db.fsyncUnlock() to unlock", "seeAlso"=>"http://dochub.mongodb.org/core/fsynccommand", "ok"=>1.0}
|
111
|
+
unless @mongolly_dry_run || locked?
|
112
|
+
response = lock!
|
113
|
+
@mongolly_logger.debug "Lock response: #{response['info']}"
|
114
|
+
raise LockFailException, response["info"] if response["ok"] != 1.0
|
115
|
+
end
|
103
116
|
@mongolly_logger.debug "With database locked..."
|
104
117
|
yield
|
105
118
|
rescue => ex
|
106
119
|
@mongolly_logger.error "Error with database locked: #{ex}"
|
107
120
|
ensure
|
108
|
-
|
109
|
-
unlock! if !@mongolly_dry_run && locked?
|
121
|
+
strong_unlock!
|
110
122
|
enable_profiling
|
111
123
|
end
|
112
124
|
|
@@ -184,13 +196,24 @@ class Mongo::MongoClient
|
|
184
196
|
ssh.loop
|
185
197
|
end
|
186
198
|
|
187
|
-
if exit_code != 0
|
188
|
-
raise "Unable to exec #{command} on #{host}, #{output}"
|
189
|
-
end
|
199
|
+
raise "Unable to exec #{command} on #{host}, #{output}" if exit_code != 0
|
190
200
|
end
|
191
201
|
|
192
202
|
private
|
193
203
|
|
204
|
+
def strong_unlock!
|
205
|
+
@mongolly_logger.debug "Unlocking database..."
|
206
|
+
return if @mongolly_dry_run || !locked?
|
207
|
+
retries ||= 0
|
208
|
+
# {"info"=>"unlock completed", "ok"=>1.0}
|
209
|
+
response = unlock!
|
210
|
+
raise UnlockFailException, response["info"] if response["ok"] != 1.0 || locked?
|
211
|
+
rescue UnlockFailException => ex
|
212
|
+
@mongolly_logger.warn "Failed to unlock, #{ex}, sleeping #{UNLOCK_SLEEP} on attempt #{retries} of #{MAX_UNLOCK_RETRIES}"
|
213
|
+
sleep UNLOCK_SLEEP
|
214
|
+
retry if (retries += 1) <= MAX_UNLOCK_RETRIES
|
215
|
+
end
|
216
|
+
|
194
217
|
def backup_instance(address, options)
|
195
218
|
host, port = address.split(":")
|
196
219
|
port ||= DEFAULT_MONGO_PORT
|
data/lib/mongolly/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongolly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Saffitz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|