mongo 2.14.0 → 2.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/mongo/background_thread.rb +11 -0
  4. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  5. data/lib/mongo/cluster.rb +0 -26
  6. data/lib/mongo/collection/view/iterable.rb +16 -6
  7. data/lib/mongo/collection.rb +2 -0
  8. data/lib/mongo/cursor.rb +10 -0
  9. data/lib/mongo/database.rb +14 -2
  10. data/lib/mongo/grid/fs_bucket.rb +37 -37
  11. data/lib/mongo/operation/parallel_scan/command.rb +1 -2
  12. data/lib/mongo/operation/shared/read_preference_supported.rb +38 -36
  13. data/lib/mongo/operation/shared/sessions_supported.rb +3 -2
  14. data/lib/mongo/protocol/msg.rb +2 -2
  15. data/lib/mongo/protocol/query.rb +11 -11
  16. data/lib/mongo/server/connection_pool.rb +0 -2
  17. data/lib/mongo/server.rb +0 -14
  18. data/lib/mongo/server_selector/secondary_preferred.rb +2 -7
  19. data/lib/mongo/srv/monitor.rb +0 -11
  20. data/lib/mongo/version.rb +1 -1
  21. data/spec/integration/query_cache_spec.rb +45 -0
  22. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  23. data/spec/integration/sdam_events_spec.rb +3 -5
  24. data/spec/integration/secondary_reads_spec.rb +102 -0
  25. data/spec/mongo/cluster_spec.rb +2 -18
  26. data/spec/mongo/index/view_spec.rb +4 -2
  27. data/spec/mongo/operation/read_preference_legacy_spec.rb +9 -19
  28. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  29. data/spec/mongo/server/app_metadata_shared.rb +33 -7
  30. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  31. data/spec/runners/transactions/operation.rb +13 -2
  32. data/spec/shared/bin/get-mongodb-download-url +17 -0
  33. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  34. data/spec/shared/lib/mrss/constraints.rb +43 -0
  35. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  36. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  37. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  38. data/spec/shared/lib/mrss/spec_organizer.rb +3 -0
  39. data/spec/shared/lib/mrss/utils.rb +15 -0
  40. data/spec/shared/share/Dockerfile.erb +231 -0
  41. data/spec/shared/shlib/distro.sh +73 -0
  42. data/spec/shared/shlib/server.sh +290 -0
  43. data/spec/shared/shlib/set_env.sh +128 -0
  44. data/spec/solo/clean_exit_spec.rb +21 -0
  45. data/spec/support/client_registry.rb +8 -4
  46. data/spec/support/client_registry_macros.rb +4 -4
  47. data/spec/support/spec_config.rb +12 -0
  48. data/spec/support/spec_setup.rb +48 -38
  49. data.tar.gz.sig +0 -0
  50. metadata +1005 -983
  51. metadata.gz.sig +0 -0
@@ -0,0 +1,290 @@
1
+ # This file contains functions pertaining to downloading, starting and
2
+ # configuring a MongoDB server.
3
+
4
+ set_fcv() {
5
+ if test -n "$FCV"; then
6
+ mongo --eval 'assert.commandWorked(db.adminCommand( { setFeatureCompatibilityVersion: "'"$FCV"'" } ));' "$MONGODB_URI"
7
+ mongo --quiet --eval 'db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )' |grep "version.*$FCV"
8
+ fi
9
+ }
10
+
11
+ add_uri_option() {
12
+ opt=$1
13
+
14
+ if ! echo $MONGODB_URI |sed -e s,//,, |grep -q /; then
15
+ MONGODB_URI="$MONGODB_URI/"
16
+ fi
17
+
18
+ if ! echo $MONGODB_URI |grep -q '?'; then
19
+ MONGODB_URI="$MONGODB_URI?"
20
+ fi
21
+
22
+ MONGODB_URI="$MONGODB_URI&$opt"
23
+ }
24
+
25
+ prepare_server() {
26
+ arch=$1
27
+
28
+ if test -n "$USE_OPT_MONGODB"; then
29
+ export BINDIR=/opt/mongodb/bin
30
+ export PATH=$BINDIR:$PATH
31
+ return
32
+ fi
33
+
34
+ if test "$MONGODB_VERSION" = latest; then
35
+ # Test on the most recent published 4.3 release.
36
+ # https://jira.mongodb.org/browse/RUBY-1724
37
+ echo 'Using "latest" server is not currently implemented' 1>&2
38
+ exit 1
39
+ else
40
+ download_version="$MONGODB_VERSION"
41
+ fi
42
+
43
+ url=`$(dirname $0)/get-mongodb-download-url $download_version $arch`
44
+
45
+ prepare_server_from_url $url
46
+ }
47
+
48
+ prepare_server_from_url() {
49
+ url=$1
50
+
51
+ mongodb_dir="$MONGO_ORCHESTRATION_HOME"/mdb
52
+ mkdir -p "$mongodb_dir"
53
+ curl --retry 3 $url |tar xz -C "$mongodb_dir" -f -
54
+ BINDIR="$mongodb_dir"/`basename $url |sed -e s/.tgz//`/bin
55
+ export PATH="$BINDIR":$PATH
56
+ }
57
+
58
+ install_mlaunch_virtualenv() {
59
+ python2 -V || true
60
+ if ! python2 -m virtualenv -h >/dev/null; then
61
+ # Current virtualenv fails with
62
+ # https://github.com/pypa/virtualenv/issues/1630
63
+ python2 -m pip install 'virtualenv<20' --user
64
+ fi
65
+ if test "$USE_SYSTEM_PYTHON_PACKAGES" = 1 &&
66
+ python2 -m pip list |grep mtools-legacy
67
+ then
68
+ # Use the existing mtools-legacy
69
+ :
70
+ else
71
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
+ python2 -m virtualenv -p python2 $venvpath
73
+ . $venvpath/bin/activate
74
+ pip install 'mtools-legacy[mlaunch]'
75
+ fi
76
+ }
77
+
78
+ install_mlaunch_pip() {
79
+ if test -n "$USE_OPT_MONGODB" && which mlaunch >/dev/null 2>&1; then
80
+ # mlaunch is preinstalled in the docker image, do not install it here
81
+ return
82
+ fi
83
+
84
+ python -V || true
85
+ python3 -V || true
86
+ pythonpath="$MONGO_ORCHESTRATION_HOME"/python
87
+ pip install -t "$pythonpath" 'mtools-legacy[mlaunch]'
88
+ export PATH="$pythonpath/bin":$PATH
89
+ export PYTHONPATH="$pythonpath"
90
+ }
91
+
92
+ install_mlaunch_git() {
93
+ repo=$1
94
+ branch=$2
95
+ python -V || true
96
+ python3 -V || true
97
+ which pip || true
98
+ which pip3 || true
99
+
100
+ if false; then
101
+ if ! virtualenv --version; then
102
+ python3 `which pip3` install --user virtualenv
103
+ export PATH=$HOME/.local/bin:$PATH
104
+ virtualenv --version
105
+ fi
106
+
107
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
108
+ virtualenv -p python3 $venvpath
109
+ . $venvpath/bin/activate
110
+
111
+ pip3 install psutil pymongo
112
+
113
+ git clone $repo mlaunch
114
+ cd mlaunch
115
+ git checkout origin/$branch
116
+ python3 setup.py install
117
+ cd ..
118
+ else
119
+ pip install --user 'virtualenv==13'
120
+ export PATH=$HOME/.local/bin:$PATH
121
+
122
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
123
+ virtualenv $venvpath
124
+ . $venvpath/bin/activate
125
+
126
+ pip install psutil pymongo
127
+
128
+ git clone $repo mlaunch
129
+ (cd mlaunch &&
130
+ git checkout origin/$branch &&
131
+ python setup.py install
132
+ )
133
+ fi
134
+ }
135
+
136
+ calculate_server_args() {
137
+ local mongo_version=`echo $MONGODB_VERSION |tr -d .`
138
+
139
+ if test -z "$mongo_version"; then
140
+ echo "$MONGODB_VERSION must be set and not contain only dots" 1>&2
141
+ exit 3
142
+ fi
143
+
144
+ if test $mongo_version = latest; then
145
+ mongo_version=49
146
+ fi
147
+
148
+ local args="--setParameter enableTestCommands=1"
149
+
150
+ if test $mongo_version -ge 47; then
151
+ args="$args --setParameter acceptAPIVersion2=1"
152
+ fi
153
+
154
+ # diagnosticDataCollectionEnabled is a mongod-only parameter on server 3.2,
155
+ # and mlaunch does not support specifying mongod-only parameters:
156
+ # https://github.com/rueckstiess/mtools/issues/696
157
+ # Pass it to 3.4 and newer servers where it is accepted by all daemons.
158
+ if test $mongo_version -ge 34; then
159
+ args="$args --setParameter diagnosticDataCollectionEnabled=false"
160
+ fi
161
+ local uri_options=
162
+ if test "$TOPOLOGY" = replica-set; then
163
+ args="$args --replicaset --name ruby-driver-rs --nodes 2 --arbiter"
164
+ export HAVE_ARBITER=1
165
+ elif test "$TOPOLOGY" = sharded-cluster; then
166
+ args="$args --replicaset --nodes 2 --sharded 1 --name ruby-driver-rs"
167
+ if test -z "$SINGLE_MONGOS"; then
168
+ args="$args --mongos 2"
169
+ fi
170
+ else
171
+ args="$args --single"
172
+ fi
173
+ if test -n "$MMAPV1"; then
174
+ args="$args --storageEngine mmapv1 --smallfiles --noprealloc"
175
+ uri_options="$uri_options&retryReads=false&retryWrites=false"
176
+ fi
177
+ if test "$AUTH" = auth; then
178
+ args="$args --auth --username bob --password pwd123"
179
+ elif test "$AUTH" = x509; then
180
+ args="$args --auth --username bootstrap --password bootstrap"
181
+ elif echo "$AUTH" |grep -q ^aws; then
182
+ args="$args --auth --username bootstrap --password bootstrap"
183
+ args="$args --setParameter authenticationMechanisms=MONGODB-AWS,SCRAM-SHA-1,SCRAM-SHA-256"
184
+ uri_options="$uri_options&authMechanism=MONGODB-AWS&authSource=\$external"
185
+ fi
186
+
187
+ if test -n "$OCSP"; then
188
+ if test -z "$OCSP_ALGORITHM"; then
189
+ echo "OCSP_ALGORITHM must be set if OCSP is set" 1>&2
190
+ exit 1
191
+ fi
192
+ fi
193
+
194
+ local server_cert_path server_ca_path server_client_cert_path
195
+ if test "$SSL" = ssl || test -n "$OCSP_ALGORITHM"; then
196
+ if test -n "$OCSP_ALGORITHM"; then
197
+ if test "$OCSP_MUST_STAPLE" = 1; then
198
+ server_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server-mustStaple.pem
199
+ else
200
+ server_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
201
+ fi
202
+ server_ca_path=spec/support/ocsp/$OCSP_ALGORITHM/ca.crt
203
+ server_client_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
204
+ else
205
+ server_cert_path=spec/support/certificates/server-second-level-bundle.pem
206
+ server_ca_path=spec/support/certificates/ca.crt
207
+ server_client_cert_path=spec/support/certificates/client.pem
208
+ fi
209
+
210
+ if test -n "$OCSP_ALGORITHM"; then
211
+ client_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
212
+ elif test "$AUTH" = x509; then
213
+ client_cert_path=spec/support/certificates/client-x509.pem
214
+
215
+ uri_options="$uri_options&authMechanism=MONGODB-X509"
216
+ elif echo $RVM_RUBY |grep -q jruby; then
217
+ # JRuby does not grok chained certificate bundles -
218
+ # https://github.com/jruby/jruby-openssl/issues/181
219
+ client_cert_path=spec/support/certificates/client.pem
220
+ else
221
+ client_cert_path=spec/support/certificates/client-second-level-bundle.pem
222
+ fi
223
+
224
+ uri_options="$uri_options&tls=true&"\
225
+ "tlsCAFile=$server_ca_path&"\
226
+ "tlsCertificateKeyFile=$client_cert_path"
227
+
228
+ args="$args --sslMode requireSSL"\
229
+ " --sslPEMKeyFile $server_cert_path"\
230
+ " --sslCAFile $server_ca_path"\
231
+ " --sslClientCertificate $server_client_cert_path"
232
+ fi
233
+
234
+ # Docker forwards ports to the external interface, not to the loopback.
235
+ # Hence we must bind to all interfaces here.
236
+ if test -n "$BIND_ALL"; then
237
+ args="$args --bind_ip_all"
238
+ fi
239
+
240
+ # MongoDB servers pre-4.2 do not enable zlib compression by default
241
+ if test "$COMPRESSOR" = snappy; then
242
+ args="$args --networkMessageCompressors snappy"
243
+ elif test "$COMPRESSOR" = zlib; then
244
+ args="$args --networkMessageCompressors zlib"
245
+ fi
246
+
247
+ if test -n "$OCSP_ALGORITHM" || test -n "$OCSP_VERIFIER"; then
248
+ python3 -m pip install asn1crypto oscrypto flask
249
+ fi
250
+
251
+ local ocsp_args=
252
+ if test -n "$OCSP_ALGORITHM"; then
253
+ if test -z "$server_ca_path"; then
254
+ echo "server_ca_path must have been set" 1>&2
255
+ exit 1
256
+ fi
257
+ ocsp_args="--ca_file $server_ca_path"
258
+ if test "$OCSP_DELEGATE" = 1; then
259
+ ocsp_args="$ocsp_args \
260
+ --ocsp_responder_cert spec/support/ocsp/$OCSP_ALGORITHM/ocsp-responder.crt \
261
+ --ocsp_responder_key spec/support/ocsp/$OCSP_ALGORITHM/ocsp-responder.key \
262
+ "
263
+ else
264
+ ocsp_args="$ocsp_args \
265
+ --ocsp_responder_cert spec/support/ocsp/$OCSP_ALGORITHM/ca.crt \
266
+ --ocsp_responder_key spec/support/ocsp/$OCSP_ALGORITHM/ca.key \
267
+ "
268
+ fi
269
+ if test -n "$OCSP_STATUS"; then
270
+ ocsp_args="$ocsp_args --fault $OCSP_STATUS"
271
+ fi
272
+ fi
273
+
274
+ OCSP_ARGS="$ocsp_args"
275
+ SERVER_ARGS="$args"
276
+ URI_OPTIONS="$uri_options"
277
+ }
278
+
279
+ launch_ocsp_mock() {
280
+ if test -n "$OCSP_ARGS"; then
281
+ # Bind to 0.0.0.0 for Docker
282
+ python3 spec/support/ocsp/ocsp_mock.py $OCSP_ARGS -b 0.0.0.0 -p 8100 &
283
+ OCSP_MOCK_PID=$!
284
+ fi
285
+ }
286
+
287
+ launch_server() {
288
+ local dbdir="$1"
289
+ python -m mtools.mlaunch.mlaunch --dir "$dbdir" --binarypath "$BINDIR" $SERVER_ARGS
290
+ }
@@ -0,0 +1,128 @@
1
+ TOOLCHAIN_VERSION=289d4bec7c61e88000cea582c05fd8073b932122
2
+
3
+ set_env_java() {
4
+ ls -l /opt || true
5
+ ls -l /usr/lib/jvm || true
6
+
7
+ # Use toolchain java if it exists
8
+ if [ -f /opt/java/jdk8/bin/java ]; then
9
+ export JAVACMD=/opt/java/jdk8/bin/java
10
+ #export PATH=$PATH:/opt/java/jdk8/bin
11
+ fi
12
+
13
+ # ppc64le has it in a different place
14
+ if test -z "$JAVACMD" && [ -f /usr/lib/jvm/java-1.8.0/bin/java ]; then
15
+ export JAVACMD=/usr/lib/jvm/java-1.8.0/bin/java
16
+ #export PATH=$PATH:/usr/lib/jvm/java-1.8.0/bin
17
+ fi
18
+
19
+ if true; then
20
+ # newer
21
+ # rhel71-ppc, https://jira.mongodb.org/browse/BUILD-9231
22
+ if test -z "$JAVACMD" &&
23
+ (ls /opt/java || true) |grep -q java-1.8.0-openjdk-1.8.0 &&
24
+ test -f /opt/java/java-1.8.0-openjdk-1.8.0*/bin/java;
25
+ then
26
+ path=$(cd /opt/java && ls -d java-1.8.0-openjdk-1.8.0* |head -n 1)
27
+ export JAVACMD=/opt/java/"$path"/bin/java
28
+ fi
29
+ else
30
+ # older
31
+ # rhel71-ppc seems to have an /opt/java/jdk8/bin/java but it doesn't work
32
+ if test -n "$JAVACMD" && ! exec $JAVACMD -version; then
33
+ JAVACMD=
34
+ # we will try the /usr/lib/jvm then
35
+ fi
36
+ fi
37
+
38
+ if test -n "$JAVACMD"; then
39
+ eval $JAVACMD -version
40
+ elif which java 2>/dev/null; then
41
+ java -version
42
+ else
43
+ echo No java runtime found
44
+ fi
45
+ }
46
+
47
+ set_env_ruby() {
48
+ if test -z "$RVM_RUBY"; then
49
+ echo "Empty RVM_RUBY, aborting"
50
+ exit 2
51
+ fi
52
+
53
+ #ls -l /opt
54
+
55
+ # Necessary for jruby
56
+ set_env_java
57
+
58
+ if [ "$RVM_RUBY" == "ruby-head" ]; then
59
+ # When we use ruby-head, we do not install the Ruby toolchain.
60
+ # But we still need Python 3.6+ to run mlaunch.
61
+ # Since the ruby-head tests are run on ubuntu1604, we can use the
62
+ # globally installed Python toolchain.
63
+ #export PATH=/opt/python/3.7/bin:$PATH
64
+
65
+ # 12.04, 14.04 and 16.04 are good
66
+ curl --retry 3 -fL http://rubies.travis-ci.org/ubuntu/`lsb_release -rs`/x86_64/ruby-head.tar.bz2 |tar xfj -
67
+ # TODO adjust gem path?
68
+ export PATH=`pwd`/ruby-head/bin:`pwd`/ruby-head/lib/ruby/gems/2.6.0/bin:$PATH
69
+ ruby --version
70
+ ruby --version |grep dev
71
+ else
72
+ if test "$USE_OPT_TOOLCHAIN" = 1; then
73
+ # nothing, also PATH is already set
74
+ :
75
+ elif true; then
76
+
77
+ # For testing toolchains:
78
+ #toolchain_url=https://s3.amazonaws.com//mciuploads/mongo-ruby-toolchain/`host_distro`/f11598d091441ffc8d746aacfdc6c26741a3e629/mongo_ruby_driver_toolchain_`host_distro |tr - _`_patch_f11598d091441ffc8d746aacfdc6c26741a3e629_5e46f2793e8e866f36eda2c5_20_02_14_19_18_18.tar.gz
79
+ toolchain_url=http://boxes.10gen.com/build/toolchain-drivers/mongo-ruby-driver/ruby-toolchain-`host_distro`-$TOOLCHAIN_VERSION.tar.xz
80
+ curl --retry 3 -fL $toolchain_url |tar Jxf -
81
+ export PATH=`pwd`/rubies/$RVM_RUBY/bin:$PATH
82
+ #export PATH=`pwd`/rubies/python/3/bin:$PATH
83
+
84
+ # Attempt to get bundler to report all errors - so far unsuccessful
85
+ #curl --retry 3 -o bundler-openssl.diff https://github.com/bundler/bundler/compare/v2.0.1...p-mongo:report-errors.diff
86
+ #find . -path \*/lib/bundler/fetcher.rb -exec patch {} bundler-openssl.diff \;
87
+
88
+ else
89
+
90
+ # Normal operation
91
+ if ! test -d $HOME/.rubies/$RVM_RUBY/bin; then
92
+ echo "Ruby directory does not exist: $HOME/.rubies/$RVM_RUBY/bin" 1>&2
93
+ echo "Contents of /opt:" 1>&2
94
+ ls -l /opt 1>&2 || true
95
+ echo ".rubies symlink:" 1>&2
96
+ ls -ld $HOME/.rubies 1>&2 || true
97
+ echo "Our rubies:" 1>&2
98
+ ls -l $HOME/.rubies 1>&2 || true
99
+ exit 2
100
+ fi
101
+ export PATH=$HOME/.rubies/$RVM_RUBY/bin:$PATH
102
+
103
+ fi
104
+
105
+ ruby --version
106
+
107
+ # Ensure we're using the right ruby
108
+ ruby_name=`echo $RVM_RUBY |awk -F- '{print $1}'`
109
+ ruby_version=`echo $RVM_RUBY |awk -F- '{print $2}' |cut -c 1-3`
110
+
111
+ ruby -v |fgrep $ruby_name
112
+ ruby -v |fgrep $ruby_version
113
+
114
+ # We shouldn't need to update rubygems, and there is value in
115
+ # testing on whatever rubygems came with each supported ruby version
116
+ #echo 'updating rubygems'
117
+ #gem update --system
118
+
119
+ # Only install bundler when not using ruby-head.
120
+ # ruby-head comes with bundler and gem complains
121
+ # because installing bundler would overwrite the bundler binary.
122
+ # We now install bundler in the toolchain, hence nothing needs to be done
123
+ # in the tests.
124
+ if false && echo "$RVM_RUBY" |grep -q jruby; then
125
+ gem install bundler -v '<2'
126
+ fi
127
+ fi
128
+ }
@@ -0,0 +1,21 @@
1
+ require 'mongo'
2
+
3
+ describe 'Clean exit' do
4
+
5
+ before(:all) do
6
+ unless %w(1 true yes).include?(ENV['SOLO'])
7
+ skip 'Set SOLO=1 in environment to run solo tests'
8
+ end
9
+ end
10
+
11
+ context 'with SRV URI' do
12
+ let(:uri) do
13
+ 'mongodb+srv://test1.test.build.10gen.cc/?tls=false'
14
+ end
15
+
16
+ it 'exits cleanly' do
17
+ client = Mongo::Client.new(uri)
18
+ client.database.collection_names.to_a
19
+ end
20
+ end
21
+ end
@@ -188,10 +188,14 @@ class ClientRegistry
188
188
  end
189
189
  private :new_global_client
190
190
 
191
- def new_local_client(*args)
192
- Mongo::Client.new(*args).tap do |client|
193
- @lock.synchronize do
194
- @local_clients << client
191
+ def new_local_client(*args, &block)
192
+ if block_given?
193
+ Mongo::Client.new(*args, &block)
194
+ else
195
+ Mongo::Client.new(*args).tap do |client|
196
+ @lock.synchronize do
197
+ @local_clients << client
198
+ end
195
199
  end
196
200
  end
197
201
  end