diff --git a/lib/mongo/retryable/write_worker.rb b/lib/mongo/retryable/write_worker.rb index 303ff3af06..339a28b2f1 100644 --- a/lib/mongo/retryable/write_worker.rb +++ b/lib/mongo/retryable/write_worker.rb @@ -103,8 +103,9 @@ def write_with_retry(write_concern, ending_transaction: false, context:, &block) def nro_write_with_retry(write_concern, context:, &block) session = context.session server = select_server(cluster, ServerSelector.primary, session) + options = session&.client&.options || {} - if session&.client.options[:retry_writes] + if options[:retry_writes] begin server.with_connection(connection_global_id: context.connection_global_id) do |connection| yield connection, nil, context diff --git a/spec/mongo/retryable/write_worker_spec.rb b/spec/mongo/retryable/write_worker_spec.rb new file mode 100644 index 0000000000..db0cd9ffaa --- /dev/null +++ b/spec/mongo/retryable/write_worker_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Mongo::Retryable::WriteWorker do + describe '#nro_write_with_retry' do + context 'when session is nil' do + let(:retryable) do + authorized_client['write_worker_test'] + end + + let(:write_concern) do + Mongo::WriteConcern.get(w: 0) + end + + let(:write_worker) do + described_class.new(retryable) + end + + let(:context) do + instance_double(Mongo::Operation::Context).tap do |context| + allow(context).to receive(:session).and_return(nil) + end + end + + before do + # We avoid actual execution of the operation to speed up and simplify + # the spec. + allow(write_worker).to receive(:legacy_write_with_retry).and_return(nil) + end + + it 'does not raise' do + expect do + write_worker.nro_write_with_retry(write_concern, context: context) + end.not_to raise_error + end + end + end +end