4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'lib/mongo_ha/networking.rb', line 4
def self.included(base)
base.class_eval do
def send_message_with_gle(operation, message, db_name, log_message=nil, write_concern=false)
docs = num_received = cursor_id = ''
(message, operation)
last_error_message = build_get_last_error_message(db_name, write_concern)
last_error_id = (last_error_message, Mongo::Constants::OP_QUERY)
packed_message = message.append!(last_error_message).to_s
sock = nil
begin
sock = checkout_writer
send_message_on_socket(packed_message, sock)
docs, num_received, cursor_id = receive(sock, last_error_id)
rescue Mongo::ConnectionFailure, Mongo::OperationFailure, Mongo::OperationTimeout => ex
raise ex
rescue SystemStackError, NoMemoryError, SystemCallError => ex
close
raise ex
ensure
checkin(sock) if sock
end
if num_received == 1
error = docs[0]['err'] || docs[0]['errmsg']
if error && error.include?("not master")
close
raise Mongo::ConnectionFailure.new(docs[0]['code'].to_s + ': ' + error, docs[0]['code'], docs[0])
elsif (!error.nil? && note = docs[0]['jnote'] || docs[0]['wnote']) code = docs[0]['code'] || Mongo::ErrorCode::BAD_VALUE raise Mongo::WriteConcernError.new(code.to_s + ': ' + note, code, docs[0])
elsif error
code = docs[0]['code'] || Mongo::ErrorCode::UNKNOWN_ERROR
error = "wtimeout" if error == "timeout"
raise Mongo::WriteConcernError.new(code.to_s + ': ' + error, code, docs[0]) if error == "wtimeout"
raise Mongo::OperationFailure.new(code.to_s + ': ' + error, code, docs[0])
end
end
docs[0]
end
end
end
|