@@ -53,6 +53,10 @@ module OperationFailure::Family
5353 # @api experimental
5454 attr_reader :server_message
5555
56+ # @return [ String | nil ] The address ("host:port") of the server
57+ # that produced this error, if known.
58+ attr_reader :server_address
59+
5660 # Error codes and code names that should result in a failing getMore
5761 # command on a change stream NOT being resumed.
5862 #
@@ -172,6 +176,8 @@ def write_concern_error?
172176 # error document.
173177 # @option options [ String ] server_message The server-returned
174178 # error message parsed from the response.
179+ # @option options [ nil | String | Mongo::Address | Mongo::Server::Description ]
180+ # :server_address The address of the server that produced the error.
175181 # @option options [ Hash ] :write_concern_error_document The
176182 # server-supplied write concern error document, if any.
177183 # @option options [ Integer ] :write_concern_error_code Error code for
@@ -185,7 +191,8 @@ def write_concern_error?
185191 # @option options [ true | false ] :wtimeout Whether the error is a wtimeout.
186192 def initialize ( message = nil , result = nil , options = { } )
187193 @details = retrieve_details ( options [ :document ] )
188- super ( append_details ( message , @details ) )
194+ @server_address = normalize_server_address ( options [ :server_address ] )
195+ super ( append_server_address ( append_details ( message , @details ) ) )
189196
190197 @result = result
191198 @code = options [ :code ]
@@ -241,6 +248,38 @@ def append_details(message, details)
241248
242249 message + " -- #{ details . to_json } "
243250 end
251+
252+ # Append the server address suffix to the message when the
253+ # Mongo.include_server_address_in_errors flag is enabled and
254+ # a server address is known.
255+ #
256+ # @return [ String | nil ] the message with the suffix appended,
257+ # or the original message unchanged.
258+ def append_server_address ( message )
259+ return message unless Mongo . include_server_address_in_errors
260+ return message if @server_address . nil?
261+ return "(on #{ @server_address } )" if message . nil? || message . empty?
262+
263+ "#{ message } (on #{ @server_address } )"
264+ end
265+
266+ # Normalize a server_address option into a String "host:port" form.
267+ #
268+ # @param [ nil | String | Mongo::Address | Mongo::Server::Description ] value
269+ #
270+ # @return [ String | nil ] The normalized address, or nil.
271+ def normalize_server_address ( value )
272+ case value
273+ when nil then nil
274+ when String then value
275+ when Mongo ::Address then value . seed
276+ when Mongo ::Server ::Description
277+ value . address . is_a? ( Mongo ::Address ) ? value . address . seed : nil
278+ else
279+ raise ArgumentError ,
280+ "server_address must be nil, String, Mongo::Address, or Mongo::Server::Description; got #{ value . class } "
281+ end
282+ end
244283 end
245284
246285 # OperationFailure is the canonical implementor of the
0 commit comments