mongo 1.8.2 → 1.8.3.rc0
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.tar.gz.sig +0 -0
- data/LICENSE +1 -1
- data/README.md +2 -7
- data/VERSION +1 -1
- data/lib/mongo.rb +2 -18
- data/lib/mongo/collection.rb +20 -24
- data/lib/mongo/cursor.rb +30 -35
- data/lib/mongo/db.rb +1 -19
- data/lib/mongo/exceptions.rb +0 -19
- data/lib/mongo/gridfs/grid.rb +18 -29
- data/lib/mongo/gridfs/grid_ext.rb +0 -18
- data/lib/mongo/gridfs/grid_file_system.rb +17 -26
- data/lib/mongo/gridfs/grid_io.rb +0 -18
- data/lib/mongo/legacy.rb +0 -18
- data/lib/mongo/mongo_client.rb +11 -33
- data/lib/mongo/mongo_replica_set_client.rb +29 -56
- data/lib/mongo/mongo_sharded_client.rb +38 -50
- data/lib/mongo/networking.rb +5 -4
- data/lib/mongo/util/conversions.rb +0 -17
- data/lib/mongo/util/core_ext.rb +0 -18
- data/lib/mongo/util/node.rb +16 -3
- data/lib/mongo/util/pool.rb +46 -36
- data/lib/mongo/util/pool_manager.rb +102 -71
- data/lib/mongo/util/read_preference.rb +4 -2
- data/lib/mongo/util/server_version.rb +0 -17
- data/lib/mongo/util/sharding_pool_manager.rb +4 -23
- data/lib/mongo/util/socket_util.rb +20 -0
- data/lib/mongo/util/ssl_socket.rb +10 -19
- data/lib/mongo/util/support.rb +0 -18
- data/lib/mongo/util/tcp_socket.rb +1 -9
- data/lib/mongo/util/thread_local_variable_manager.rb +0 -18
- data/lib/mongo/util/uri_parser.rb +87 -82
- data/lib/mongo/util/write_concern.rb +0 -18
- data/mongo.gemspec +4 -1
- data/test/auxillary/pool_reuse_test.rb +65 -0
- data/test/functional/collection_test.rb +92 -3
- data/test/functional/connection_test.rb +30 -6
- data/test/functional/db_api_test.rb +11 -0
- data/test/functional/timeout_test.rb +23 -0
- data/test/functional/uri_test.rb +69 -0
- data/test/replica_set/client_test.rb +0 -22
- data/test/replica_set/cursor_test.rb +11 -5
- data/test/replica_set/refresh_test.rb +0 -0
- data/test/replica_set/z_cluster_shutdown.rb +13 -0
- data/test/sharded_cluster/basic_test.rb +46 -32
- data/test/test_helper.rb +26 -1
- data/test/threading/basic_test.rb +10 -9
- data/test/tools/mongo_config.rb +6 -2
- data/test/unit/collection_test.rb +1 -1
- data/test/unit/grid_test.rb +20 -13
- data/test/unit/mongo_sharded_client_test.rb +32 -0
- data/test/unit/pool_manager_test.rb +28 -14
- metadata +45 -12
- metadata.gz.sig +0 -0
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
module Mongo
|
20
2
|
module GridExt
|
21
3
|
module InstanceMethods
|
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
module Mongo
|
20
2
|
|
21
3
|
# A file store built on the GridFS specification featuring
|
@@ -39,12 +21,12 @@ module Mongo
|
|
39
21
|
|
40
22
|
@default_query_opts = {:sort => [['filename', 1], ['uploadDate', -1]], :limit => 1}
|
41
23
|
|
42
|
-
#
|
24
|
+
# This will create indexes only if we're connected to a primary node.
|
43
25
|
connection = @db.connection
|
44
|
-
|
45
|
-
|
46
|
-
@
|
47
|
-
|
26
|
+
begin
|
27
|
+
@files.ensure_index([['filename', 1], ['uploadDate', -1]])
|
28
|
+
@chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
|
29
|
+
rescue Mongo::ConnectionFailure
|
48
30
|
end
|
49
31
|
end
|
50
32
|
|
@@ -104,9 +86,18 @@ module Mongo
|
|
104
86
|
opts = opts.dup
|
105
87
|
opts.merge!(default_grid_io_opts(filename))
|
106
88
|
if mode == 'w'
|
107
|
-
|
108
|
-
|
109
|
-
|
89
|
+
begin
|
90
|
+
# Ensure there are the appropriate indexes, as state may have changed since instantiation of self.
|
91
|
+
# Recall that index definitions are cached with ensure_index so this statement won't unneccesarily repeat index creation.
|
92
|
+
@files.ensure_index([['filename', 1], ['uploadDate', -1]])
|
93
|
+
@chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
|
94
|
+
versions = opts.delete(:versions)
|
95
|
+
if opts.delete(:delete_old) || (versions && versions < 1)
|
96
|
+
versions = 1
|
97
|
+
end
|
98
|
+
rescue Mongo::ConnectionFailure => e
|
99
|
+
raise e, "Failed to create necessary indexes and write data."
|
100
|
+
return
|
110
101
|
end
|
111
102
|
end
|
112
103
|
file = GridIO.new(@files, @chunks, filename, mode, opts)
|
data/lib/mongo/gridfs/grid_io.rb
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
require 'digest/md5'
|
20
2
|
|
21
3
|
module Mongo
|
data/lib/mongo/legacy.rb
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
module Mongo
|
20
2
|
module LegacyWriteConcern
|
21
3
|
@legacy_write_concern = true
|
data/lib/mongo/mongo_client.rb
CHANGED
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
require 'set'
|
20
2
|
require 'socket'
|
21
3
|
require 'thread'
|
@@ -128,9 +110,6 @@ module Mongo
|
|
128
110
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
129
111
|
@host, @port = parse_init(args[0], args[1], opts)
|
130
112
|
|
131
|
-
# Default maximum BSON object size
|
132
|
-
@max_bson_size = Mongo::DEFAULT_MAX_BSON_SIZE
|
133
|
-
|
134
113
|
# Lock for request ids.
|
135
114
|
@id_lock = Mutex.new
|
136
115
|
|
@@ -181,7 +160,7 @@ module Mongo
|
|
181
160
|
|
182
161
|
# Initialize a connection to MongoDB using the MongoDB URI spec.
|
183
162
|
#
|
184
|
-
# Since MongoClient.new cannot be used with any <code>ENV["MONGODB_URI"]</code> that has multiple hosts (implying a replicaset),
|
163
|
+
# Since MongoClient.new cannot be used with any <code>ENV["MONGODB_URI"]</code> that has multiple hosts (implying a replicaset),
|
185
164
|
# you may use this when the type of your connection varies by environment and should be determined solely from <code>ENV["MONGODB_URI"]</code>.
|
186
165
|
#
|
187
166
|
# @param uri [String]
|
@@ -471,7 +450,8 @@ module Mongo
|
|
471
450
|
@mongos = true
|
472
451
|
end
|
473
452
|
|
474
|
-
@max_bson_size = config['maxBsonObjectSize']
|
453
|
+
@max_bson_size = config['maxBsonObjectSize']
|
454
|
+
@max_message_size = config['maxMessageSizeBytes']
|
475
455
|
set_primary(host_port)
|
476
456
|
end
|
477
457
|
|
@@ -479,10 +459,7 @@ module Mongo
|
|
479
459
|
raise ConnectionFailure, "Failed to connect to a master node at #{host_port.join(":")}"
|
480
460
|
end
|
481
461
|
end
|
482
|
-
|
483
|
-
# Ensures that the alias carries over to the overridden connect method when using
|
484
|
-
# the replica set or sharded clients.
|
485
|
-
def reconnect; connect end
|
462
|
+
alias :reconnect :connect
|
486
463
|
|
487
464
|
# It's possible that we defined connected as all nodes being connected???
|
488
465
|
# NOTE: Do check if this needs to be more stringent.
|
@@ -514,10 +491,7 @@ module Mongo
|
|
514
491
|
def read_primary?
|
515
492
|
@read_primary
|
516
493
|
end
|
517
|
-
|
518
|
-
# Ensures that the alias carries over to the overridden connect method when using
|
519
|
-
# the replica set or sharded clients.
|
520
|
-
def primary?; read_primary? end
|
494
|
+
alias :primary? :read_primary?
|
521
495
|
|
522
496
|
# The socket pool that this connection reads from.
|
523
497
|
#
|
@@ -538,7 +512,11 @@ module Mongo
|
|
538
512
|
#
|
539
513
|
# @return [Integer]
|
540
514
|
def max_bson_size
|
541
|
-
@max_bson_size
|
515
|
+
@max_bson_size || DEFAULT_MAX_BSON_SIZE
|
516
|
+
end
|
517
|
+
|
518
|
+
def max_message_size
|
519
|
+
@max_message_size || DEFAULT_MAX_MESSAGE_SIZE
|
542
520
|
end
|
543
521
|
|
544
522
|
# Checkout a socket for reading (i.e., a secondary node).
|
@@ -559,7 +537,7 @@ module Mongo
|
|
559
537
|
# Note: this is overridden in MongoReplicaSetClient.
|
560
538
|
def checkin(socket)
|
561
539
|
if @primary_pool && socket && socket.pool
|
562
|
-
socket.
|
540
|
+
socket.checkin
|
563
541
|
end
|
564
542
|
end
|
565
543
|
|
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
module Mongo
|
20
2
|
|
21
3
|
# Instantiates and manages connections to a MongoDB replica set.
|
@@ -151,7 +133,6 @@ module Mongo
|
|
151
133
|
|
152
134
|
# No connection manager by default.
|
153
135
|
@manager = nil
|
154
|
-
@old_managers = []
|
155
136
|
|
156
137
|
# Lock for request ids.
|
157
138
|
@id_lock = Mutex.new
|
@@ -183,15 +164,26 @@ module Mongo
|
|
183
164
|
# Initiate a connection to the replica set.
|
184
165
|
def connect
|
185
166
|
log(:info, "Connecting...")
|
186
|
-
@connect_mutex.synchronize do
|
187
|
-
return if @connected
|
188
167
|
|
189
|
-
|
190
|
-
|
168
|
+
# Prevent recursive connection attempts from the same thread.
|
169
|
+
# This is done rather than using a Monitor to prevent potentially recursing
|
170
|
+
# infinitely while attempting to connect and continually failing. Instead, fail fast.
|
171
|
+
raise ConnectionFailure, "Failed to get node data." if thread_local[:locks][:connecting] == true
|
191
172
|
|
192
|
-
|
193
|
-
|
194
|
-
|
173
|
+
@connect_mutex.synchronize do
|
174
|
+
return if @connected
|
175
|
+
begin
|
176
|
+
thread_local[:locks][:connecting] = true
|
177
|
+
if @manager
|
178
|
+
@manager.refresh! @seeds
|
179
|
+
else
|
180
|
+
@manager = PoolManager.new(self, @seeds)
|
181
|
+
thread_local[:managers][self] = @manager
|
182
|
+
@manager.connect
|
183
|
+
end
|
184
|
+
ensure
|
185
|
+
thread_local[:locks][:connecting] = false
|
186
|
+
end
|
195
187
|
@refresh_version += 1
|
196
188
|
|
197
189
|
if @manager.pools.empty?
|
@@ -235,15 +227,7 @@ module Mongo
|
|
235
227
|
# to get the refresh lock.
|
236
228
|
def hard_refresh!
|
237
229
|
log(:info, "Initiating hard refresh...")
|
238
|
-
|
239
|
-
new_manager = PoolManager.new(self, discovered_seeds | @seeds)
|
240
|
-
new_manager.connect
|
241
|
-
|
242
|
-
thread_local[:managers][self] = new_manager
|
243
|
-
|
244
|
-
# TODO: make sure that connect has succeeded
|
245
|
-
@old_managers << @manager
|
246
|
-
@manager = new_manager
|
230
|
+
@manager.refresh! @seeds
|
247
231
|
|
248
232
|
@refresh_version += 1
|
249
233
|
return true
|
@@ -286,6 +270,7 @@ module Mongo
|
|
286
270
|
def read_primary?
|
287
271
|
@manager.read_pool == @manager.primary_pool
|
288
272
|
end
|
273
|
+
alias :primary? :read_primary?
|
289
274
|
|
290
275
|
# Close the connection to the database.
|
291
276
|
def close(opts={})
|
@@ -343,12 +328,11 @@ module Mongo
|
|
343
328
|
end
|
344
329
|
|
345
330
|
if socket
|
346
|
-
socket
|
331
|
+
return socket
|
347
332
|
else
|
348
333
|
@connected = false
|
349
334
|
raise ConnectionFailure.new("Could not checkout a socket.")
|
350
335
|
end
|
351
|
-
socket
|
352
336
|
end
|
353
337
|
|
354
338
|
def checkout_reader(mode=@read, tag_sets=@tag_sets, acceptable_latency=@acceptable_latency)
|
@@ -368,7 +352,7 @@ module Mongo
|
|
368
352
|
# Checkin a socket used for reading.
|
369
353
|
def checkin(socket)
|
370
354
|
if socket && socket.pool
|
371
|
-
socket.
|
355
|
+
socket.checkin
|
372
356
|
end
|
373
357
|
sync_refresh
|
374
358
|
end
|
@@ -435,11 +419,13 @@ module Mongo
|
|
435
419
|
end
|
436
420
|
|
437
421
|
def max_bson_size
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
422
|
+
return local_manager.max_bson_size if local_manager
|
423
|
+
DEFAULT_MAX_BSON_SIZE
|
424
|
+
end
|
425
|
+
|
426
|
+
def max_message_size
|
427
|
+
return local_manager.max_message_size if local_manager
|
428
|
+
DEFAULT_MAX_MESSAGE_SIZE
|
443
429
|
end
|
444
430
|
|
445
431
|
private
|
@@ -480,18 +466,6 @@ module Mongo
|
|
480
466
|
super opts
|
481
467
|
end
|
482
468
|
|
483
|
-
def prune_managers
|
484
|
-
@old_managers.each do |manager|
|
485
|
-
if manager != @manager
|
486
|
-
if manager.closed?
|
487
|
-
@old_managers.delete(manager)
|
488
|
-
else
|
489
|
-
manager.close(:soft => true)
|
490
|
-
end
|
491
|
-
end
|
492
|
-
end
|
493
|
-
end
|
494
|
-
|
495
469
|
def sync_refresh
|
496
470
|
if @refresh_mode == :sync &&
|
497
471
|
((Time.now - @last_refresh) > @refresh_interval)
|
@@ -501,7 +475,6 @@ module Mongo
|
|
501
475
|
if @refresh_mutex.try_lock
|
502
476
|
begin
|
503
477
|
refresh
|
504
|
-
prune_managers
|
505
478
|
ensure
|
506
479
|
@refresh_mutex.unlock
|
507
480
|
end
|
@@ -1,21 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# --
|
4
|
-
# Copyright (C) 2008-2012 10gen Inc.
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
# ++
|
18
|
-
|
19
1
|
module Mongo
|
20
2
|
|
21
3
|
# Instantiates and manages connections to a MongoDB sharded cluster for high availability.
|
@@ -34,11 +16,8 @@ module Mongo
|
|
34
16
|
|
35
17
|
if nodes.empty? and ENV.has_key?('MONGODB_URI')
|
36
18
|
parser = URIParser.new ENV['MONGODB_URI']
|
37
|
-
if parser.direct?
|
38
|
-
raise MongoArgumentError, "Mongo::MongoShardedClient.new called with no arguments, but ENV['MONGODB_URI'] implies a direct connection."
|
39
|
-
end
|
40
19
|
opts = parser.connection_options.merge! opts
|
41
|
-
nodes =
|
20
|
+
nodes = parser.node_strings
|
42
21
|
end
|
43
22
|
|
44
23
|
unless nodes.length > 0
|
@@ -59,7 +38,6 @@ module Mongo
|
|
59
38
|
|
60
39
|
# No connection manager by default.
|
61
40
|
@manager = nil
|
62
|
-
@old_managers = []
|
63
41
|
|
64
42
|
# Lock for request ids.
|
65
43
|
@id_lock = Mutex.new
|
@@ -80,7 +58,7 @@ module Mongo
|
|
80
58
|
end
|
81
59
|
|
82
60
|
def valid_opts
|
83
|
-
GENERIC_OPTS + SHARDED_CLUSTER_OPTS
|
61
|
+
GENERIC_OPTS + SHARDED_CLUSTER_OPTS + READ_PREFERENCE_OPTS + WRITE_CONCERN_OPTS
|
84
62
|
end
|
85
63
|
|
86
64
|
def inspect
|
@@ -92,14 +70,26 @@ module Mongo
|
|
92
70
|
def connect(force = !@connected)
|
93
71
|
return unless force
|
94
72
|
log(:info, "Connecting...")
|
95
|
-
@connect_mutex.synchronize do
|
96
|
-
discovered_seeds = @manager ? @manager.seeds : []
|
97
|
-
@old_managers << @manager if @manager
|
98
|
-
@manager = ShardingPoolManager.new(self, discovered_seeds | @seeds)
|
99
73
|
|
100
|
-
|
74
|
+
# Prevent recursive connection attempts from the same thread.
|
75
|
+
# This is done rather than using a Monitor to prevent potentially recursing
|
76
|
+
# infinitely while attempting to connect and continually failing. Instead, fail fast.
|
77
|
+
raise ConnectionFailure, "Failed to get node data." if thread_local[:locks][:connecting]
|
78
|
+
|
79
|
+
@connect_mutex.synchronize do
|
80
|
+
begin
|
81
|
+
thread_local[:locks][:connecting] = true
|
82
|
+
if @manager
|
83
|
+
@manager.refresh! @seeds
|
84
|
+
else
|
85
|
+
@manager = ShardingPoolManager.new(self, @seeds)
|
86
|
+
thread_local[:managers][self] = @manager
|
87
|
+
@manager.connect
|
88
|
+
end
|
89
|
+
ensure
|
90
|
+
thread_local[:locks][:connecting] = false
|
91
|
+
end
|
101
92
|
|
102
|
-
@manager.connect
|
103
93
|
@refresh_version += 1
|
104
94
|
@last_refresh = Time.now
|
105
95
|
@connected = true
|
@@ -134,27 +124,25 @@ module Mongo
|
|
134
124
|
end
|
135
125
|
|
136
126
|
def checkout(&block)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
begin
|
145
|
-
socket = block.call
|
146
|
-
rescue => ex
|
147
|
-
checkin(socket) if socket
|
148
|
-
raise ex
|
149
|
-
end
|
150
|
-
|
151
|
-
if socket
|
152
|
-
return socket
|
153
|
-
else
|
154
|
-
@connected = false
|
155
|
-
#raise ConnectionFailure.new("Could not checkout a socket.")
|
156
|
-
end
|
127
|
+
tries = 0
|
128
|
+
begin
|
129
|
+
super(&block)
|
130
|
+
rescue ConnectionFailure
|
131
|
+
tries +=1
|
132
|
+
tries < 2 ? retry : raise
|
157
133
|
end
|
158
134
|
end
|
135
|
+
|
136
|
+
# Initialize a connection to MongoDB using the MongoDB URI spec.
|
137
|
+
#
|
138
|
+
# @param uri [ String ] string of the format:
|
139
|
+
# mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/database]
|
140
|
+
#
|
141
|
+
# @param opts [ Hash ] Any of the options available for MongoShardedClient.new
|
142
|
+
#
|
143
|
+
# @return [ Mongo::MongoShardedClient ] The sharded client.
|
144
|
+
def self.from_uri(uri = ENV['MONGODB_URI'], options = {})
|
145
|
+
URIParser.new(uri).connection(options, false, true)
|
146
|
+
end
|
159
147
|
end
|
160
148
|
end
|