mongo 2.1.0.rc0 → 2.1.0
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +5 -2
- data.tar.gz.sig +0 -0
- data/Rakefile +2 -2
- data/lib/mongo.rb +2 -1
- data/lib/mongo/address.rb +11 -5
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/user/view.rb +2 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write.rb +12 -9
- data/lib/mongo/bulk_write/transformable.rb +20 -5
- data/lib/mongo/client.rb +11 -11
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/collection.rb +21 -8
- data/lib/mongo/collection/view.rb +1 -0
- data/lib/mongo/collection/view/aggregation.rb +11 -5
- data/lib/mongo/collection/view/iterable.rb +6 -2
- data/lib/mongo/collection/view/map_reduce.rb +39 -5
- data/lib/mongo/collection/view/readable.rb +35 -30
- data/lib/mongo/collection/view/writable.rb +26 -18
- data/lib/mongo/database.rb +12 -2
- data/lib/mongo/database/view.rb +4 -3
- data/lib/mongo/dbref.rb +4 -4
- data/lib/mongo/grid/fs_bucket.rb +8 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/index/view.rb +2 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +9 -3
- data/lib/mongo/monitoring/event.rb +1 -0
- data/lib/mongo/monitoring/event/command_started.rb +2 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +6 -3
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/operation.rb +31 -1
- data/lib/mongo/operation/commands/collections_info.rb +2 -0
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +2 -1
- data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/read/query.rb +2 -0
- data/lib/mongo/operation/read/query/result.rb +40 -0
- data/lib/mongo/operation/result.rb +13 -1
- data/lib/mongo/operation/write/bulk/delete.rb +2 -2
- data/lib/mongo/operation/write/bulk/update.rb +3 -3
- data/lib/mongo/operation/write/delete.rb +2 -2
- data/lib/mongo/operation/write/update.rb +9 -4
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/protocol/insert.rb +25 -6
- data/lib/mongo/protocol/query.rb +45 -31
- data/lib/mongo/protocol/reply.rb +29 -6
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server.rb +16 -3
- data/lib/mongo/server/connectable.rb +21 -3
- data/lib/mongo/server/connection.rb +38 -4
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/monitor/connection.rb +2 -2
- data/lib/mongo/server_selector.rb +5 -0
- data/lib/mongo/server_selector/selectable.rb +16 -9
- data/lib/mongo/socket.rb +6 -2
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +11 -11
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +10 -10
- data/spec/mongo/client_spec.rb +101 -18
- data/spec/mongo/collection_spec.rb +44 -0
- data/spec/mongo/connection_string_spec.rb +36 -58
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
- data/spec/mongo/grid/stream/write_spec.rb +2 -2
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +0 -16
- data/spec/mongo/operation/commands/command_spec.rb +0 -18
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -16
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -16
- data/spec/mongo/operation/write/bulk/update_spec.rb +6 -6
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +3 -3
- data/spec/mongo/operation/write/update_spec.rb +6 -6
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/query_spec.rb +15 -1
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +32 -0
- data/spec/mongo/server/connection_spec.rb +37 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +24 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +2 -0
- data/spec/mongo/server_selector/nearest_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_spec.rb +8 -2
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/secondary_spec.rb +1 -0
- data/spec/mongo/server_spec.rb +68 -1
- data/spec/mongo/socket/ssl_spec.rb +29 -5
- data/spec/mongo/uri_spec.rb +20 -20
- data/spec/support/crud.rb +7 -1
- data/spec/support/matchers.rb +1 -1
- data/spec/support/shared/server_selector.rb +58 -2
- metadata +20 -5
- metadata.gz.sig +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
1
2
|
require 'spec_helper'
|
|
2
3
|
|
|
3
4
|
describe Mongo::Protocol::Query do
|
|
@@ -15,7 +16,7 @@ describe Mongo::Protocol::Query do
|
|
|
15
16
|
|
|
16
17
|
describe '#initialize' do
|
|
17
18
|
|
|
18
|
-
it 'sets the
|
|
19
|
+
it 'sets the namespace' do
|
|
19
20
|
expect(message.namespace).to eq(ns)
|
|
20
21
|
end
|
|
21
22
|
|
|
@@ -220,6 +221,19 @@ describe Mongo::Protocol::Query do
|
|
|
220
221
|
it 'serializes the namespace' do
|
|
221
222
|
expect(field).to be_cstring(ns)
|
|
222
223
|
end
|
|
224
|
+
|
|
225
|
+
context 'when the namespace contains unicode characters' do
|
|
226
|
+
let(:field) { bytes[20..40] }
|
|
227
|
+
|
|
228
|
+
let(:coll) do
|
|
229
|
+
'områder'
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it 'serializes the namespace' do
|
|
233
|
+
expect(field).to be_cstring(ns)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
end
|
|
223
237
|
end
|
|
224
238
|
|
|
225
239
|
describe 'skip' do
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Mongo::Retryable do
|
|
4
|
+
|
|
5
|
+
let(:klass) do
|
|
6
|
+
Class.new do
|
|
7
|
+
include Mongo::Retryable
|
|
8
|
+
|
|
9
|
+
attr_reader :cluster
|
|
10
|
+
attr_reader :operation
|
|
11
|
+
|
|
12
|
+
def initialize(operation, cluster)
|
|
13
|
+
@operation = operation
|
|
14
|
+
@cluster = cluster
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def read
|
|
18
|
+
read_with_retry do
|
|
19
|
+
operation.execute
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def write
|
|
24
|
+
write_with_retry do
|
|
25
|
+
operation.execute
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe '#read_with_retry' do
|
|
32
|
+
|
|
33
|
+
let(:operation) do
|
|
34
|
+
double('operation')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
let(:cluster) do
|
|
38
|
+
double('cluster')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
let(:retryable) do
|
|
42
|
+
klass.new(operation, cluster)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'when no exception occurs' do
|
|
46
|
+
|
|
47
|
+
before do
|
|
48
|
+
expect(operation).to receive(:execute).and_return(true)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'executes the operation once' do
|
|
52
|
+
expect(retryable.read).to be true
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'when a socket error occurs' do
|
|
57
|
+
|
|
58
|
+
before do
|
|
59
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::SocketError).ordered
|
|
60
|
+
expect(cluster).to receive(:scan!).and_return(true).ordered
|
|
61
|
+
expect(operation).to receive(:execute).and_return(true).ordered
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'executes the operation twice' do
|
|
65
|
+
expect(retryable.read).to be true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'when a socket timeout error occurs' do
|
|
70
|
+
|
|
71
|
+
before do
|
|
72
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::SocketTimeoutError).ordered
|
|
73
|
+
expect(cluster).to receive(:scan!).and_return(true).ordered
|
|
74
|
+
expect(operation).to receive(:execute).and_return(true).ordered
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'executes the operation twice' do
|
|
78
|
+
expect(retryable.read).to be true
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context 'when an operation failure occurs' do
|
|
83
|
+
|
|
84
|
+
before do
|
|
85
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure).ordered
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'raises an exception' do
|
|
89
|
+
expect {
|
|
90
|
+
retryable.read
|
|
91
|
+
}.to raise_error(Mongo::Error::OperationFailure)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe '#write_with_retry' do
|
|
97
|
+
|
|
98
|
+
let(:operation) do
|
|
99
|
+
double('operation')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
let(:cluster) do
|
|
103
|
+
double('cluster')
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
let(:retryable) do
|
|
107
|
+
klass.new(operation, cluster)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context 'when no exception occurs' do
|
|
111
|
+
|
|
112
|
+
before do
|
|
113
|
+
expect(operation).to receive(:execute).and_return(true)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it 'executes the operation once' do
|
|
117
|
+
expect(retryable.write).to be true
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
context 'when a not master error occurs' do
|
|
122
|
+
|
|
123
|
+
before do
|
|
124
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure.new('not master')).ordered
|
|
125
|
+
expect(cluster).to receive(:scan!).and_return(true).ordered
|
|
126
|
+
expect(operation).to receive(:execute).and_return(true).ordered
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'executes the operation twice' do
|
|
130
|
+
expect(retryable.write).to be true
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context 'when a normal operation failure occurs' do
|
|
135
|
+
|
|
136
|
+
before do
|
|
137
|
+
expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure).ordered
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'raises an exception' do
|
|
141
|
+
expect {
|
|
142
|
+
retryable.write
|
|
143
|
+
}.to raise_error(Mongo::Error::OperationFailure)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -47,6 +47,22 @@ describe Mongo::Server::ConnectionPool::Queue do
|
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
describe '#disconnect!' do
|
|
51
|
+
|
|
52
|
+
let(:connection) do
|
|
53
|
+
double('connection')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
let(:queue) do
|
|
57
|
+
described_class.new(:max_pool_size => 1) { connection }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'disconnects all connections in the queue' do
|
|
61
|
+
expect(connection).to receive(:disconnect!)
|
|
62
|
+
queue.disconnect!
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
50
66
|
describe '#enqueue' do
|
|
51
67
|
|
|
52
68
|
let(:connection) do
|
|
@@ -28,6 +28,10 @@ describe Mongo::Server::ConnectionPool do
|
|
|
28
28
|
described_class.get(server)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
+
after do
|
|
32
|
+
server.disconnect!
|
|
33
|
+
end
|
|
34
|
+
|
|
31
35
|
context 'when a connection is checked out on the thread' do
|
|
32
36
|
|
|
33
37
|
let!(:connection) do
|
|
@@ -96,6 +100,26 @@ describe Mongo::Server::ConnectionPool do
|
|
|
96
100
|
end
|
|
97
101
|
end
|
|
98
102
|
|
|
103
|
+
describe '#disconnect!' do
|
|
104
|
+
|
|
105
|
+
let(:server) do
|
|
106
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
let!(:pool) do
|
|
110
|
+
described_class.get(server)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
after do
|
|
114
|
+
server.disconnect!
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it 'disconnects the queue' do
|
|
118
|
+
expect(pool.send(:queue)).to receive(:disconnect!).twice.and_call_original
|
|
119
|
+
pool.disconnect!
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
99
123
|
describe '.get' do
|
|
100
124
|
|
|
101
125
|
let(:server) do
|
|
@@ -106,6 +130,10 @@ describe Mongo::Server::ConnectionPool do
|
|
|
106
130
|
described_class.get(server)
|
|
107
131
|
end
|
|
108
132
|
|
|
133
|
+
after do
|
|
134
|
+
server.disconnect!
|
|
135
|
+
end
|
|
136
|
+
|
|
109
137
|
it 'returns the pool for the server' do
|
|
110
138
|
expect(pool).to eql(described_class.get(server))
|
|
111
139
|
end
|
|
@@ -121,6 +149,10 @@ describe Mongo::Server::ConnectionPool do
|
|
|
121
149
|
described_class.get(server)
|
|
122
150
|
end
|
|
123
151
|
|
|
152
|
+
after do
|
|
153
|
+
server.disconnect!
|
|
154
|
+
end
|
|
155
|
+
|
|
124
156
|
it 'includes the object id' do
|
|
125
157
|
expect(pool.inspect).to include(pool.object_id.to_s)
|
|
126
158
|
end
|
|
@@ -18,6 +18,43 @@ describe Mongo::Server::Connection do
|
|
|
18
18
|
Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
after do
|
|
22
|
+
server.disconnect!
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe '#connectable?' do
|
|
26
|
+
|
|
27
|
+
# context 'when the connection is connectable' do
|
|
28
|
+
|
|
29
|
+
# let(:connection) do
|
|
30
|
+
# described_class.new(server)
|
|
31
|
+
# end
|
|
32
|
+
|
|
33
|
+
# it 'returns true' do
|
|
34
|
+
# expect(connection).to be_connectable
|
|
35
|
+
# end
|
|
36
|
+
# end
|
|
37
|
+
|
|
38
|
+
context 'when the connection is not connectable' do
|
|
39
|
+
|
|
40
|
+
let(:bad_address) do
|
|
41
|
+
Mongo::Address.new('127.0.0.1:666')
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
let(:bad_server) do
|
|
45
|
+
Mongo::Server.new(bad_address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
let(:connection) do
|
|
49
|
+
described_class.new(bad_server)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'returns false' do
|
|
53
|
+
expect(connection).to_not be_connectable
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
21
58
|
describe '#connect!' do
|
|
22
59
|
|
|
23
60
|
context 'when no socket exists' do
|
|
@@ -11,40 +11,26 @@ describe 'Server Discovery and Monitoring' do
|
|
|
11
11
|
|
|
12
12
|
before(:all) do
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
module Mongo
|
|
15
|
+
# We monkey-patch the server here, so the monitors do not run and no
|
|
16
|
+
# real TCP connection is attempted. Thus we can control the server
|
|
17
|
+
# descriptions per-phase.
|
|
18
|
+
#
|
|
19
|
+
# @since 2.0.0
|
|
20
|
+
class Server
|
|
21
|
+
|
|
22
|
+
alias :original_initialize :initialize
|
|
23
|
+
def initialize(address, cluster, monitoring, event_listeners, options = {})
|
|
24
|
+
@address = address
|
|
25
|
+
@cluster = cluster
|
|
26
|
+
@monitoring = monitoring
|
|
27
|
+
@options = options.freeze
|
|
28
|
+
@monitor = Monitor.new(address, event_listeners, options)
|
|
29
|
+
end
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# descriptions per-phase.
|
|
31
|
-
#
|
|
32
|
-
# @since 2.0.0
|
|
33
|
-
class Mongo::Server
|
|
34
|
-
|
|
35
|
-
# The constructor keeps the same API, but does not instantiate a
|
|
36
|
-
# monitor and run it.
|
|
37
|
-
def initialize(address, cluster, monitoring, event_listeners, options = {})
|
|
38
|
-
@address = address
|
|
39
|
-
@cluster = cluster
|
|
40
|
-
@monitoring = monitoring
|
|
41
|
-
@options = options.freeze
|
|
42
|
-
@monitor = Monitor.new(address, event_listeners, options)
|
|
31
|
+
alias :original_disconnect! :disconnect!
|
|
32
|
+
def disconnect!; true; end
|
|
43
33
|
end
|
|
44
|
-
|
|
45
|
-
# Disconnect simply needs to return true since we have no monitor and
|
|
46
|
-
# no connection.
|
|
47
|
-
def disconnect!; true; end
|
|
48
34
|
end
|
|
49
35
|
|
|
50
36
|
# Client is set as an instance variable inside the scope of the spec to
|
|
@@ -58,34 +44,13 @@ describe 'Server Discovery and Monitoring' do
|
|
|
58
44
|
|
|
59
45
|
# Return the server implementation to its original for the other
|
|
60
46
|
# tests in the suite.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
@address = address
|
|
66
|
-
@cluster = cluster
|
|
67
|
-
@monitoring = monitoring
|
|
68
|
-
@options = options.freeze
|
|
69
|
-
@monitor = Monitor.new(address, event_listeners, options)
|
|
70
|
-
@monitor.scan!
|
|
71
|
-
@monitor.run!
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Returns disconnect! to its original implementation.
|
|
75
|
-
def disconnect!
|
|
76
|
-
context.with_connection do |connection|
|
|
77
|
-
connection.disconnect!
|
|
78
|
-
end
|
|
79
|
-
@monitor.stop! and true
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
class Mongo::Address
|
|
84
|
-
private
|
|
47
|
+
module Mongo
|
|
48
|
+
class Server
|
|
49
|
+
alias :initialize :original_initialize
|
|
50
|
+
remove_method(:original_initialize)
|
|
85
51
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
::Socket.getaddrinfo(host, nil, fam, ::Socket::SOCK_STREAM).first[4]
|
|
52
|
+
alias :disconnect! :original_disconnect!
|
|
53
|
+
remove_method(:original_disconnect!)
|
|
89
54
|
end
|
|
90
55
|
end
|
|
91
56
|
end
|
|
@@ -8,80 +8,60 @@ describe 'Server Selection moving average round trip time calculation' do
|
|
|
8
8
|
|
|
9
9
|
spec = Mongo::ServerSelection::RTT::Spec.new(file)
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
module Mongo
|
|
14
|
-
class Server
|
|
15
|
-
|
|
16
|
-
# We monkey-patch the monitor here, so the last average rtt can be controlled.
|
|
17
|
-
# We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.0.0
|
|
20
|
-
class Monitor
|
|
21
|
-
|
|
22
|
-
def initialize(address, listeners, options = {})
|
|
23
|
-
@description = Mongo::Server::Description.new(address, {})
|
|
24
|
-
@inspector = Mongo::Server::Description::Inspector.new(listeners)
|
|
25
|
-
@options = options.freeze
|
|
26
|
-
@connection = Connection.new(address, options)
|
|
27
|
-
@last_round_trip_time = options[:avg_rtt_ms]
|
|
28
|
-
@mutex = Mutex.new
|
|
29
|
-
end
|
|
11
|
+
context(spec.description) do
|
|
30
12
|
|
|
31
|
-
|
|
13
|
+
before(:all) do
|
|
32
14
|
|
|
33
|
-
|
|
15
|
+
module Mongo
|
|
16
|
+
class Server
|
|
17
|
+
|
|
18
|
+
# We monkey-patch the monitor here, so the last average rtt can be controlled.
|
|
19
|
+
# We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
|
|
34
20
|
#
|
|
35
21
|
# @since 2.0.0
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
22
|
+
class Monitor
|
|
23
|
+
|
|
24
|
+
alias :original_initialize :initialize
|
|
25
|
+
def initialize(address, listeners, options = {})
|
|
26
|
+
@description = Mongo::Server::Description.new(address, {})
|
|
27
|
+
@inspector = Mongo::Server::Description::Inspector.new(listeners)
|
|
28
|
+
@options = options.freeze
|
|
29
|
+
@connection = Connection.new(address, options)
|
|
30
|
+
@last_round_trip_time = options[:avg_rtt_ms]
|
|
31
|
+
@mutex = Mutex.new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# We monkey patch this method to use an instance variable instead of calculating time elapsed.
|
|
35
|
+
#
|
|
36
|
+
# @since 2.0.0
|
|
37
|
+
alias :original_average_round_trip_time :average_round_trip_time
|
|
38
|
+
def average_round_trip_time(start)
|
|
39
|
+
new_rtt = @new_rtt_ms
|
|
40
|
+
RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
|
|
41
|
+
end
|
|
39
42
|
end
|
|
40
43
|
end
|
|
41
44
|
end
|
|
42
45
|
end
|
|
43
|
-
end
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
after(:all) do
|
|
46
48
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
module Mongo
|
|
50
|
+
class Server
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
# Return the monitor implementation to its original for the other
|
|
53
|
+
# tests in the suite.
|
|
54
|
+
class Monitor
|
|
53
55
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
# @example Create the server monitor.
|
|
57
|
-
# Mongo::Server::Monitor.new(address, listeners)
|
|
58
|
-
#
|
|
59
|
-
# @param [ Address ] address The address to monitor.
|
|
60
|
-
# @param [ Event::Listeners ] listeners The event listeners.
|
|
61
|
-
# @param [ Hash ] options The options.
|
|
62
|
-
#
|
|
63
|
-
# @since 2.0.0
|
|
64
|
-
def initialize(address, listeners, options = {})
|
|
65
|
-
@description = Description.new(address, {})
|
|
66
|
-
@inspector = Description::Inspector.new(listeners)
|
|
67
|
-
@options = options.freeze
|
|
68
|
-
@connection = Connection.new(address, options)
|
|
69
|
-
@last_round_trip_time = nil
|
|
70
|
-
@mutex = Mutex.new
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
private
|
|
56
|
+
alias :initialize :original_initialize
|
|
57
|
+
remove_method(:original_initialize)
|
|
74
58
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
|
|
59
|
+
alias :average_round_trip_time :original_average_round_trip_time
|
|
60
|
+
remove_method(:original_average_round_trip_time)
|
|
78
61
|
end
|
|
79
62
|
end
|
|
80
63
|
end
|
|
81
64
|
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
context(spec.description) do
|
|
85
65
|
|
|
86
66
|
let(:address) do
|
|
87
67
|
Mongo::Address.new('127.0.0.1:27017')
|