mongo 1.8.0 → 1.8.2
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/README.md +14 -29
- data/VERSION +1 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/collection.rb +99 -49
- data/lib/mongo/cursor.rb +17 -17
- data/lib/mongo/db.rb +30 -14
- data/lib/mongo/gridfs/grid.rb +5 -3
- data/lib/mongo/gridfs/grid_file_system.rb +5 -3
- data/lib/mongo/gridfs/grid_io.rb +5 -3
- data/lib/mongo/legacy.rb +9 -2
- data/lib/mongo/mongo_client.rb +100 -72
- data/lib/mongo/mongo_replica_set_client.rb +46 -60
- data/lib/mongo/mongo_sharded_client.rb +5 -66
- data/lib/mongo/networking.rb +2 -1
- data/lib/mongo/util/node.rb +41 -42
- data/lib/mongo/util/pool.rb +15 -43
- data/lib/mongo/util/pool_manager.rb +16 -65
- data/lib/mongo/util/read_preference.rb +82 -0
- data/lib/mongo/util/sharding_pool_manager.rb +0 -86
- data/lib/mongo/util/ssl_socket.rb +2 -1
- data/lib/mongo/util/support.rb +8 -18
- data/lib/mongo/util/tcp_socket.rb +5 -4
- data/lib/mongo/util/thread_local_variable_manager.rb +29 -0
- data/lib/mongo/util/unix_socket.rb +23 -0
- data/lib/mongo/util/uri_parser.rb +31 -18
- data/lib/mongo/util/write_concern.rb +7 -2
- data/mongo.gemspec +1 -1
- data/test/auxillary/repl_set_auth_test.rb +2 -2
- data/test/bson/bson_test.rb +1 -1
- data/test/bson/byte_buffer_test.rb +24 -26
- data/test/bson/hash_with_indifferent_access_test.rb +11 -1
- data/test/functional/collection_test.rb +16 -16
- data/test/functional/connection_test.rb +1 -4
- data/test/functional/db_api_test.rb +14 -10
- data/test/functional/pool_test.rb +23 -31
- data/test/functional/timeout_test.rb +3 -5
- data/test/functional/uri_test.rb +10 -5
- data/test/replica_set/basic_test.rb +3 -8
- data/test/replica_set/client_test.rb +47 -31
- data/test/replica_set/complex_connect_test.rb +12 -10
- data/test/replica_set/connection_test.rb +8 -151
- data/test/replica_set/count_test.rb +9 -5
- data/test/replica_set/cursor_test.rb +17 -27
- data/test/replica_set/insert_test.rb +5 -10
- data/test/replica_set/query_test.rb +4 -9
- data/test/replica_set/read_preference_test.rb +200 -0
- data/test/replica_set/refresh_test.rb +54 -65
- data/test/replica_set/replication_ack_test.rb +16 -14
- data/test/sharded_cluster/basic_test.rb +30 -0
- data/test/test_helper.rb +33 -15
- data/test/threading/basic_test.rb +79 -0
- data/test/tools/mongo_config.rb +62 -22
- data/test/unit/client_test.rb +36 -14
- data/test/unit/collection_test.rb +23 -0
- data/test/unit/connection_test.rb +30 -14
- data/test/unit/cursor_test.rb +137 -7
- data/test/unit/db_test.rb +17 -4
- data/test/unit/grid_test.rb +2 -2
- data/test/unit/node_test.rb +2 -1
- data/test/unit/pool_manager_test.rb +29 -1
- data/test/unit/read_test.rb +15 -15
- data/test/unit/safe_test.rb +4 -4
- data/test/unit/write_concern_test.rb +4 -4
- metadata +134 -143
- data/examples/admin.rb +0 -43
- data/examples/capped.rb +0 -22
- data/examples/cursor.rb +0 -48
- data/examples/gridfs.rb +0 -44
- data/examples/index_test.rb +0 -126
- data/examples/info.rb +0 -31
- data/examples/queries.rb +0 -74
- data/examples/replica_set.rb +0 -26
- data/examples/simple.rb +0 -25
- data/examples/strict.rb +0 -35
- data/examples/types.rb +0 -36
- data/examples/web/thin/load.rb +0 -23
- data/examples/web/unicorn/load.rb +0 -25
- data/test/support/hash_with_indifferent_access.rb +0 -186
- data/test/support/keys.rb +0 -45
- data/test/threading/threading_with_large_pool_test.rb +0 -90
data/lib/mongo/db.rb
CHANGED
@@ -55,7 +55,7 @@ module Mongo
|
|
55
55
|
attr_accessor :cache_time
|
56
56
|
|
57
57
|
# Read Preference
|
58
|
-
attr_accessor :
|
58
|
+
attr_accessor :read, :tag_sets, :acceptable_latency
|
59
59
|
|
60
60
|
# Instances of DB are normally obtained by calling Mongo#db.
|
61
61
|
#
|
@@ -71,11 +71,17 @@ module Mongo
|
|
71
71
|
# fields the factory wishes to inject. (NOTE: if the object already has a primary key,
|
72
72
|
# the factory should not inject a new key).
|
73
73
|
#
|
74
|
-
# @option opts [
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
74
|
+
# @option opts [String, Integer, Symbol] :w (1) Set default number of nodes to which a write
|
75
|
+
# should be acknowledged
|
76
|
+
# @option opts [Boolean] :j (false) Set journal acknowledgement
|
77
|
+
# @option opts [Integer] :wtimeout (nil) Set replica set acknowledgement timeout
|
78
|
+
# @option opts [Boolean] :fsync (false) Set fsync acknowledgement.
|
79
|
+
#
|
80
|
+
# Notes on write concern:
|
81
|
+
# These write concern options are propagated to Collection objects instantiated off of this DB. If no
|
82
|
+
# options are provided, the default write concern set on this instance's MongoClient object will be used. This
|
83
|
+
# default can be overridden upon instantiation of any collection by explicitly setting write concern options
|
84
|
+
# on initialization or at the time of an operation.
|
79
85
|
#
|
80
86
|
# @option opts [Integer] :cache_time (300) Set the time that all ensure_index calls should cache the command.
|
81
87
|
#
|
@@ -88,12 +94,8 @@ module Mongo
|
|
88
94
|
|
89
95
|
@write_concern = get_write_concern(opts, client)
|
90
96
|
|
91
|
-
|
92
|
-
|
93
|
-
else
|
94
|
-
value = @connection.read_preference
|
95
|
-
end
|
96
|
-
@read_preference = value.is_a?(Hash) ? value.dup : value
|
97
|
+
@read = opts[:read] || @connection.read
|
98
|
+
Mongo::ReadPreference::validate(@read)
|
97
99
|
@tag_sets = opts.fetch(:tag_sets, @connection.tag_sets)
|
98
100
|
@acceptable_latency = opts.fetch(:acceptable_latency, @connection.acceptable_latency)
|
99
101
|
@cache_time = opts[:cache_time] || 300 #5 minutes.
|
@@ -504,8 +506,11 @@ module Mongo
|
|
504
506
|
# hashes are ordered by default.
|
505
507
|
#
|
506
508
|
# @option opts [Boolean] :check_response (true) If +true+, raises an exception if the
|
507
|
-
#
|
509
|
+
# command fails.
|
508
510
|
# @option opts [Socket] :socket a socket to use for sending the command. This is mainly for internal use.
|
511
|
+
# @option opts [:primary, :secondary] :read Read preference for this command. See Collection#find for
|
512
|
+
# more details.
|
513
|
+
# @option opts [String] :comment (nil) a comment to include in profiling logs
|
509
514
|
#
|
510
515
|
# @return [Hash]
|
511
516
|
#
|
@@ -518,9 +523,20 @@ module Mongo
|
|
518
523
|
raise MongoArgumentError, "DB#command requires an OrderedHash when hash contains multiple keys"
|
519
524
|
end
|
520
525
|
|
526
|
+
if read_pref = opts[:read]
|
527
|
+
Mongo::ReadPreference::validate(read_pref)
|
528
|
+
unless read_pref == :primary || Mongo::Support::secondary_ok?(selector)
|
529
|
+
raise MongoArgumentError, "Command is not supported on secondaries: #{selector.keys.first}"
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
521
533
|
begin
|
522
534
|
result = Cursor.new(system_command_collection,
|
523
|
-
|
535
|
+
:limit => -1,
|
536
|
+
:selector => selector,
|
537
|
+
:socket => socket,
|
538
|
+
:read => read_pref,
|
539
|
+
:comment => opts[:comment]).next_document
|
524
540
|
rescue OperationFailure => ex
|
525
541
|
raise OperationFailure, "Database command '#{selector.keys.first}' failed: #{ex.message}"
|
526
542
|
end
|
data/lib/mongo/gridfs/grid.rb
CHANGED
@@ -62,9 +62,11 @@ module Mongo
|
|
62
62
|
# the content type will may be inferred from the filename extension if the mime-types gem can be
|
63
63
|
# loaded. Otherwise, the content type 'binary/octet-stream' will be used.
|
64
64
|
# @option opts [Integer] (262144) :chunk_size size of file chunks in bytes.
|
65
|
-
# @option opts [
|
66
|
-
#
|
67
|
-
#
|
65
|
+
# @option opts [String, Integer, Symbol] :w (1) Set write concern
|
66
|
+
#
|
67
|
+
# Notes on write concern:
|
68
|
+
# When :w > 0, the chunks sent to the server are validated using an md5 hash.
|
69
|
+
# If validation fails, an exception will be raised.
|
68
70
|
#
|
69
71
|
# @return [BSON::ObjectId] the file's id.
|
70
72
|
def put(data, opts={})
|
@@ -69,9 +69,11 @@ module Mongo
|
|
69
69
|
# @option opts [Boolean] :delete_old (false) ensure that old versions of the file are deleted. This option
|
70
70
|
# only work in 'w' mode. Certain precautions must be taken when deleting GridFS files. See the notes under
|
71
71
|
# GridFileSystem#delete.
|
72
|
-
# @option opts [
|
73
|
-
#
|
74
|
-
#
|
72
|
+
# @option opts [String, Integer, Symbol] :w (1) Set write concern
|
73
|
+
#
|
74
|
+
# Notes on write concern:
|
75
|
+
# When :w > 0, the chunks sent to the server
|
76
|
+
# will be validated using an md5 hash. If validation fails, an exception will be raised.
|
75
77
|
# @option opts [Integer] :versions (false) deletes all versions which exceed the number specified to
|
76
78
|
# retain ordered by uploadDate. This option only works in 'w' mode. Certain precautions must be taken when
|
77
79
|
# deleting GridFS files. See the notes under GridFileSystem#delete.
|
data/lib/mongo/gridfs/grid_io.rb
CHANGED
@@ -50,9 +50,11 @@ module Mongo
|
|
50
50
|
# @option opts [String] :content_type ('binary/octet-stream') If no content type is specified,
|
51
51
|
# the content type will may be inferred from the filename extension if the mime-types gem can be
|
52
52
|
# loaded. Otherwise, the content type 'binary/octet-stream' will be used.
|
53
|
-
# @option opts [
|
54
|
-
#
|
55
|
-
#
|
53
|
+
# @option opts [String, Integer, Symbol] :w (1) Set the write concern
|
54
|
+
#
|
55
|
+
# Notes on write concern:
|
56
|
+
# When :w > 0, the chunks sent to the server
|
57
|
+
# will be validated using an md5 hash. If validation fails, an exception will be raised.
|
56
58
|
def initialize(files, chunks, filename, mode, opts={})
|
57
59
|
@files = files
|
58
60
|
@chunks = chunks
|
data/lib/mongo/legacy.rb
CHANGED
@@ -43,16 +43,22 @@ end
|
|
43
43
|
|
44
44
|
module Mongo
|
45
45
|
# @deprecated Use Mongo::MongoClient instead. Support will be removed after v2.0
|
46
|
+
# Please see old documentation for the Connection class
|
46
47
|
class Connection < MongoClient
|
47
48
|
include Mongo::LegacyWriteConcern
|
48
49
|
|
49
|
-
def initialize(
|
50
|
-
|
50
|
+
def initialize(*args)
|
51
|
+
if args.last.is_a?(Hash)
|
52
|
+
opts = args.pop
|
53
|
+
write_concern_from_legacy(opts)
|
54
|
+
args.push(opts)
|
55
|
+
end
|
51
56
|
super
|
52
57
|
end
|
53
58
|
end
|
54
59
|
|
55
60
|
# @deprecated Use Mongo::MongoReplicaSetClient instead. Support will be removed after v2.0
|
61
|
+
# Please see old documentation for the ReplSetConnection class
|
56
62
|
class ReplSetConnection < MongoReplicaSetClient
|
57
63
|
include Mongo::LegacyWriteConcern
|
58
64
|
|
@@ -67,6 +73,7 @@ module Mongo
|
|
67
73
|
end
|
68
74
|
|
69
75
|
# @deprecated Use Mongo::MongoShardedClient instead. Support will be removed after v2.0
|
76
|
+
# Please see old documentation for the ShardedConnection class
|
70
77
|
class ShardedConnection < MongoShardedClient
|
71
78
|
include Mongo::LegacyWriteConcern
|
72
79
|
|
data/lib/mongo/mongo_client.rb
CHANGED
@@ -28,18 +28,18 @@ module Mongo
|
|
28
28
|
include Mongo::Networking
|
29
29
|
include Mongo::WriteConcern
|
30
30
|
|
31
|
-
TCPSocket = Mongo::TCPSocket
|
32
31
|
Mutex = ::Mutex
|
33
32
|
ConditionVariable = ::ConditionVariable
|
34
33
|
|
35
|
-
DEFAULT_HOST
|
36
|
-
DEFAULT_PORT
|
37
|
-
DEFAULT_DB_NAME
|
38
|
-
GENERIC_OPTS
|
39
|
-
TIMEOUT_OPTS
|
40
|
-
POOL_OPTS
|
41
|
-
|
42
|
-
|
34
|
+
DEFAULT_HOST = 'localhost'
|
35
|
+
DEFAULT_PORT = 27017
|
36
|
+
DEFAULT_DB_NAME = 'test'
|
37
|
+
GENERIC_OPTS = [:ssl, :auths, :logger, :connect]
|
38
|
+
TIMEOUT_OPTS = [:timeout, :op_timeout, :connect_timeout]
|
39
|
+
POOL_OPTS = [:pool_size, :pool_timeout]
|
40
|
+
READ_PREFERENCE_OPTS = [:read, :tag_sets, :secondary_acceptable_latency_ms]
|
41
|
+
WRITE_CONCERN_OPTS = [:w, :j, :fsync, :wtimeout]
|
42
|
+
CLIENT_ONLY_OPTS = [:slave_ok]
|
43
43
|
|
44
44
|
mongo_thread_local_accessor :connections
|
45
45
|
|
@@ -56,7 +56,8 @@ module Mongo
|
|
56
56
|
:socket_class,
|
57
57
|
:op_timeout,
|
58
58
|
:tag_sets,
|
59
|
-
:acceptable_latency
|
59
|
+
:acceptable_latency,
|
60
|
+
:read
|
60
61
|
|
61
62
|
# Create a connection to single MongoDB instance.
|
62
63
|
#
|
@@ -72,13 +73,19 @@ module Mongo
|
|
72
73
|
# MongoClient#arbiters. This is useful if your application needs to connect manually to nodes other
|
73
74
|
# than the primary.
|
74
75
|
#
|
75
|
-
# @param [String
|
76
|
+
# @param [String] host
|
76
77
|
# @param [Integer] port specify a port number here if only one host is being specified.
|
77
78
|
#
|
78
|
-
# @option opts [
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
79
|
+
# @option opts [String, Integer, Symbol] :w (1) Set default number of nodes to which a write
|
80
|
+
# should be acknowledged
|
81
|
+
# @option opts [Boolean] :j (false) Set journal acknowledgement
|
82
|
+
# @option opts [Integer] :wtimeout (nil) Set replica set acknowledgement timeout
|
83
|
+
# @option opts [Boolean] :fsync (false) Set fsync acknowledgement.
|
84
|
+
#
|
85
|
+
# Notes about write concern options:
|
86
|
+
# Write concern options are propagated to objects instantiated from this MongoClient.
|
87
|
+
# These defaults can be overridden upon instantiation of any object by explicitly setting an options hash
|
88
|
+
# on initialization.
|
82
89
|
# @option opts [Boolean] :slave_ok (false) Must be set to +true+ when connecting
|
83
90
|
# to a single, slave node.
|
84
91
|
# @option opts [Logger, #debug] :logger (nil) A Logger instance for debugging driver ops. Note that
|
@@ -106,6 +113,9 @@ module Mongo
|
|
106
113
|
# @example localhost, 3000, where this node may be a slave
|
107
114
|
# MongoClient.new("localhost", 3000, :slave_ok => true)
|
108
115
|
#
|
116
|
+
# @example Unix Domain Socket
|
117
|
+
# MongoClient.new("/var/run/mongodb.sock")
|
118
|
+
#
|
109
119
|
# @see http://api.mongodb.org/ruby/current/file.REPLICA_SETS.html Replica sets in Ruby
|
110
120
|
#
|
111
121
|
# @raise [ReplicaSetConnectionError] This is raised if a replica set name is specified and the
|
@@ -114,24 +124,9 @@ module Mongo
|
|
114
124
|
# @raise [MongoArgumentError] If called with no arguments and <code>ENV["MONGODB_URI"]</code> implies a replica set.
|
115
125
|
#
|
116
126
|
# @core self.connections
|
117
|
-
def initialize(
|
118
|
-
|
119
|
-
|
120
|
-
if parser.replicaset?
|
121
|
-
raise MongoArgumentError, "Mongo::MongoClient.new called with no arguments, but ENV['MONGODB_URI'] implies a replica set."
|
122
|
-
end
|
123
|
-
opts.merge!(parser.connection_options)
|
124
|
-
@host_to_try = [parser.host, parser.port]
|
125
|
-
elsif host.is_a?(String) && (port || DEFAULT_PORT).respond_to?(:to_i)
|
126
|
-
@host_to_try = [host, (port || DEFAULT_PORT).to_i]
|
127
|
-
elsif host || port
|
128
|
-
raise MongoArgumentError, "Mongo::MongoClient.new host or port argument error, host:#{host.inspect}, port:#{port.inspect}"
|
129
|
-
else
|
130
|
-
@host_to_try = [DEFAULT_HOST, DEFAULT_PORT]
|
131
|
-
end
|
132
|
-
|
133
|
-
# Host and port of current master.
|
134
|
-
@host = @port = nil
|
127
|
+
def initialize(*args)
|
128
|
+
opts = args.last.is_a?(Hash) ? args.pop : {}
|
129
|
+
@host, @port = parse_init(args[0], args[1], opts)
|
135
130
|
|
136
131
|
# Default maximum BSON object size
|
137
132
|
@max_bson_size = Mongo::DEFAULT_MAX_BSON_SIZE
|
@@ -139,16 +134,17 @@ module Mongo
|
|
139
134
|
# Lock for request ids.
|
140
135
|
@id_lock = Mutex.new
|
141
136
|
|
142
|
-
# Connection pool for
|
137
|
+
# Connection pool for primary node
|
143
138
|
@primary = nil
|
144
139
|
@primary_pool = nil
|
140
|
+
@mongos = false
|
145
141
|
|
146
142
|
# Not set for direct connection
|
147
|
-
@tag_sets =
|
143
|
+
@tag_sets = []
|
148
144
|
@acceptable_latency = 15
|
149
145
|
|
150
146
|
check_opts(opts)
|
151
|
-
setup(opts)
|
147
|
+
setup(opts.dup)
|
152
148
|
end
|
153
149
|
|
154
150
|
# DEPRECATED
|
@@ -180,12 +176,12 @@ module Mongo
|
|
180
176
|
def self.multi(nodes, opts={})
|
181
177
|
warn "MongoClient.multi is now deprecated and will be removed in v2.0. Please use MongoReplicaSetClient.new instead."
|
182
178
|
|
183
|
-
MongoReplicaSetClient.new(
|
179
|
+
MongoReplicaSetClient.new(nodes, opts)
|
184
180
|
end
|
185
181
|
|
186
182
|
# Initialize a connection to MongoDB using the MongoDB URI spec.
|
187
183
|
#
|
188
|
-
# Since MongoClient.new cannot be used with any <code>ENV["MONGODB_URI"]</code> that has multiple hosts (implying a replicaset),
|
184
|
+
# Since MongoClient.new cannot be used with any <code>ENV["MONGODB_URI"]</code> that has multiple hosts (implying a replicaset),
|
189
185
|
# you may use this when the type of your connection varies by environment and should be determined solely from <code>ENV["MONGODB_URI"]</code>.
|
190
186
|
#
|
191
187
|
# @param uri [String]
|
@@ -199,6 +195,20 @@ module Mongo
|
|
199
195
|
parser.connection(extra_opts)
|
200
196
|
end
|
201
197
|
|
198
|
+
def parse_init(host, port, opts)
|
199
|
+
if host.nil? && port.nil? && ENV.has_key?('MONGODB_URI')
|
200
|
+
parser = URIParser.new(ENV['MONGODB_URI'])
|
201
|
+
if parser.replicaset?
|
202
|
+
raise MongoArgumentError,
|
203
|
+
"ENV['MONGODB_URI'] implies a replica set."
|
204
|
+
end
|
205
|
+
opts.merge! parser.connection_options
|
206
|
+
[parser.host, parser.port]
|
207
|
+
else
|
208
|
+
[host || DEFAULT_HOST, port || DEFAULT_PORT]
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
202
212
|
# The host name used for this connection.
|
203
213
|
#
|
204
214
|
# @return [String]
|
@@ -213,6 +223,10 @@ module Mongo
|
|
213
223
|
@primary_pool.port
|
214
224
|
end
|
215
225
|
|
226
|
+
def host_port
|
227
|
+
[@host, @port]
|
228
|
+
end
|
229
|
+
|
216
230
|
# Fsync, then lock the mongod process against writes. Use this to get
|
217
231
|
# the datafiles in a state safe for snapshotting, backing up, etc.
|
218
232
|
#
|
@@ -415,7 +429,6 @@ module Mongo
|
|
415
429
|
self["admin"].command({:buildinfo => 1})
|
416
430
|
end
|
417
431
|
|
418
|
-
|
419
432
|
# Get the build version of the current server.
|
420
433
|
#
|
421
434
|
# @return [Mongo::ServerVersion]
|
@@ -431,6 +444,10 @@ module Mongo
|
|
431
444
|
@slave_ok
|
432
445
|
end
|
433
446
|
|
447
|
+
def mongos?
|
448
|
+
@mongos
|
449
|
+
end
|
450
|
+
|
434
451
|
# Create a new socket and attempt to connect to master.
|
435
452
|
# If successful, sets host and port to master and returns the socket.
|
436
453
|
#
|
@@ -441,7 +458,8 @@ module Mongo
|
|
441
458
|
def connect
|
442
459
|
close
|
443
460
|
|
444
|
-
config = check_is_master(
|
461
|
+
config = check_is_master(host_port)
|
462
|
+
|
445
463
|
if config
|
446
464
|
if config['ismaster'] == 1 || config['ismaster'] == true
|
447
465
|
@read_primary = true
|
@@ -449,15 +467,22 @@ module Mongo
|
|
449
467
|
@read_primary = false
|
450
468
|
end
|
451
469
|
|
470
|
+
if config.has_key?('msg') && config['msg'] == 'isdbgrid'
|
471
|
+
@mongos = true
|
472
|
+
end
|
473
|
+
|
452
474
|
@max_bson_size = config['maxBsonObjectSize'] || Mongo::DEFAULT_MAX_BSON_SIZE
|
453
|
-
set_primary(
|
475
|
+
set_primary(host_port)
|
454
476
|
end
|
455
477
|
|
456
478
|
if !connected?
|
457
|
-
raise ConnectionFailure, "Failed to connect to a master node at #{
|
479
|
+
raise ConnectionFailure, "Failed to connect to a master node at #{host_port.join(":")}"
|
458
480
|
end
|
459
481
|
end
|
460
|
-
|
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
|
461
486
|
|
462
487
|
# It's possible that we defined connected as all nodes being connected???
|
463
488
|
# NOTE: Do check if this needs to be more stringent.
|
@@ -489,7 +514,10 @@ module Mongo
|
|
489
514
|
def read_primary?
|
490
515
|
@read_primary
|
491
516
|
end
|
492
|
-
|
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
|
493
521
|
|
494
522
|
# The socket pool that this connection reads from.
|
495
523
|
#
|
@@ -498,15 +526,6 @@ module Mongo
|
|
498
526
|
@primary_pool
|
499
527
|
end
|
500
528
|
|
501
|
-
# The value of the read preference.
|
502
|
-
def read_preference
|
503
|
-
if slave_ok?
|
504
|
-
:secondary_preferred
|
505
|
-
else
|
506
|
-
:primary
|
507
|
-
end
|
508
|
-
end
|
509
|
-
|
510
529
|
# Close the connection to the database.
|
511
530
|
def close
|
512
531
|
@primary_pool.close if @primary_pool
|
@@ -550,6 +569,7 @@ module Mongo
|
|
550
569
|
GENERIC_OPTS +
|
551
570
|
CLIENT_ONLY_OPTS +
|
552
571
|
POOL_OPTS +
|
572
|
+
READ_PREFERENCE_OPTS +
|
553
573
|
WRITE_CONCERN_OPTS +
|
554
574
|
TIMEOUT_OPTS
|
555
575
|
end
|
@@ -564,13 +584,15 @@ module Mongo
|
|
564
584
|
|
565
585
|
# Parse option hash
|
566
586
|
def setup(opts)
|
567
|
-
# slave_ok can be true only if one node is specified
|
568
587
|
@slave_ok = opts.delete(:slave_ok)
|
569
588
|
|
570
|
-
# Determine whether to use SSL.
|
571
589
|
@ssl = opts.delete(:ssl)
|
590
|
+
@unix = @host ? @host.end_with?('.sock') : false
|
591
|
+
|
572
592
|
if @ssl
|
573
593
|
@socket_class = Mongo::SSLSocket
|
594
|
+
elsif @unix
|
595
|
+
@socket_class = Mongo::UNIXSocket
|
574
596
|
else
|
575
597
|
@socket_class = Mongo::TCPSocket
|
576
598
|
end
|
@@ -590,41 +612,47 @@ module Mongo
|
|
590
612
|
@op_timeout = opts.delete(:op_timeout) || nil
|
591
613
|
|
592
614
|
# Timeout on socket connect.
|
593
|
-
@connect_timeout = opts.delete(:connect_timeout) ||
|
615
|
+
@connect_timeout = opts.delete(:connect_timeout) || 30
|
594
616
|
|
595
|
-
@logger = opts.
|
596
|
-
|
597
|
-
# Connection level write concern options.
|
598
|
-
@write_concern = get_write_concern(opts)
|
617
|
+
@logger = opts.delete(:logger) || nil
|
599
618
|
|
600
619
|
if @logger
|
601
620
|
write_logging_startup_message
|
602
621
|
end
|
603
622
|
|
604
|
-
|
605
|
-
|
623
|
+
# Determine read preference
|
624
|
+
if defined?(@slave_ok) && (@slave_ok) || defined?(@read_secondary) && @read_secondary
|
625
|
+
@read = :secondary_preferred
|
626
|
+
else
|
627
|
+
@read = opts.delete(:read) || :primary
|
606
628
|
end
|
607
|
-
|
629
|
+
Mongo::ReadPreference::validate(@read)
|
608
630
|
|
609
|
-
|
631
|
+
@tag_sets = opts.delete(:tag_sets) || []
|
632
|
+
@acceptable_latency = opts.delete(:secondary_acceptable_latency_ms) || 15
|
610
633
|
|
611
|
-
|
634
|
+
# Connection level write concern options.
|
635
|
+
@write_concern = get_write_concern(opts)
|
612
636
|
|
613
|
-
|
614
|
-
# to close the connection and reset connection values.
|
615
|
-
# TODO: evaluate whether this method is actually necessary
|
616
|
-
def reset_connection
|
617
|
-
close
|
637
|
+
connect if opts.fetch(:connect, true)
|
618
638
|
end
|
619
639
|
|
640
|
+
private
|
641
|
+
|
620
642
|
def check_is_master(node)
|
621
643
|
begin
|
622
644
|
host, port = *node
|
623
645
|
socket = nil
|
624
646
|
config = nil
|
625
647
|
|
626
|
-
socket = @socket_class.new(host, port, @op_timeout, @connect_timeout)
|
627
|
-
|
648
|
+
socket = @socket_class.new(host, port, @op_timeout, @connect_timeout)
|
649
|
+
if(@connect_timeout)
|
650
|
+
Timeout::timeout(@connect_timeout, OperationTimeout) do
|
651
|
+
config = self['admin'].command({:ismaster => 1}, :socket => socket)
|
652
|
+
end
|
653
|
+
else
|
654
|
+
config = self['admin'].command({:ismaster => 1}, :socket => socket)
|
655
|
+
end
|
628
656
|
rescue OperationFailure, SocketError, SystemCallError, IOError
|
629
657
|
close
|
630
658
|
ensure
|