-
Type: Improvement
-
Resolution: Unresolved
-
Priority: Minor - P4
-
None
-
Affects Version/s: 4.4.2, 4.9.0-alpha4
-
Component/s: None
-
Server Programmability
When I perform an insert that fails due to unique index violation, mongod does not return error code name but mongos does.
Test program:
require 'mongo' require 'byebug' def test(port) client = Mongo::Client.new(["localhost:#{port}"], database: 'test') coll = client['foo'] coll.delete_many coll.insert_one(_id: 1) begin coll.insert_one(_id: 1) rescue Mongo::Error::OperationFailure => e pp e.document end end [14400, 14420, 14440, 14900, 14920, 14940].each do |port| puts puts "Testing #{port}" test(port) end
Legend:
14400 4.4 standalone
14420 4.4 replica set
14440 4.4 sharded cluster
14900 4.9 standalone
14920 4.9 replica set
14940 4.9 sharded cluster
Results:
Testing 14400 {"n"=>0, "writeErrors"=> [{"index"=>0, "code"=>11000, "keyPattern"=>{"_id"=>1}, "keyValue"=>{"_id"=>1}, "errmsg"=> "E11000 duplicate key error collection: test.foo index: _id_ dup key: { _id: 1 }"}], "ok"=>1.0} Testing 14420 {"n"=>0, "writeErrors"=> [{"index"=>0, "code"=>11000, "keyPattern"=>{"_id"=>1}, "keyValue"=>{"_id"=>1}, "errmsg"=> "E11000 duplicate key error collection: test.foo index: _id_ dup key: { _id: 1 }"}], "opTime"=> {"ts"=> #<BSON::Timestamp:0x00005567763138b8 @increment=2, @seconds=1616946710>, "t"=>1}, "electionId"=>BSON::ObjectId('7fffffff0000000000000001'), "ok"=>1.0, "$clusterTime"=> {"clusterTime"=> #<BSON::Timestamp:0x0000556776313688 @increment=3, @seconds=1616946710>, "signature"=> {"hash"=><BSON::Binary:0x1660 type=generic data=0x0000000000000000...>, "keyId"=>0}}, "operationTime"=> #<BSON::Timestamp:0x0000556776313430 @increment=2, @seconds=1616946710>} Testing 14440 {"n"=>0, "writeErrors"=> [{"index"=>0, "code"=>11000, "codeName"=>"DuplicateKey", "errmsg"=> "E11000 duplicate key error collection: test.foo index: _id_ dup key: { _id: 1 }"}], "ok"=>1.0, "operationTime"=> #<BSON::Timestamp:0x00005567761da370 @increment=3, @seconds=1616946710>, "$clusterTime"=> {"clusterTime"=> #<BSON::Timestamp:0x00005567761da000 @increment=4, @seconds=1616946710>, "signature"=> {"hash"=><BSON::Binary:0x1780 type=generic data=0x0000000000000000...>, "keyId"=>0}}} Testing 14900 {"n"=>0, "writeErrors"=> [{"index"=>0, "code"=>11000, "keyPattern"=>{"_id"=>1}, "keyValue"=>{"_id"=>1}, "errmsg"=> "E11000 duplicate key error collection: test.foo index: _id_ dup key: { _id: 1 }"}], "ok"=>1.0} Testing 14920 {"n"=>0, "electionId"=>BSON::ObjectId('7fffffff0000000000000001'), "opTime"=> {"ts"=> #<BSON::Timestamp:0x0000556775c21820 @increment=2, @seconds=1616946710>, "t"=>1}, "writeErrors"=> [{"index"=>0, "code"=>11000, "keyPattern"=>{"_id"=>1}, "keyValue"=>{"_id"=>1}, "errmsg"=> "E11000 duplicate key error collection: test.foo index: _id_ dup key: { _id: 1 }"}], "ok"=>1.0, "$clusterTime"=> {"clusterTime"=> #<BSON::Timestamp:0x0000556775c37468 @increment=3, @seconds=1616946710>, "signature"=> {"hash"=><BSON::Binary:0x2120 type=generic data=0x0000000000000000...>, "keyId"=>0}}, "operationTime"=> #<BSON::Timestamp:0x0000556775c37080 @increment=2, @seconds=1616946710>} Testing 14940 {"n"=>0, "writeErrors"=> [{"index"=>0, "code"=>11000, "codeName"=>"DuplicateKey", "errmsg"=> "E11000 duplicate key error collection: test.foo index: _id_ dup key: { _id: 1 }"}], "ok"=>1.0, "$clusterTime"=> {"clusterTime"=> #<BSON::Timestamp:0x000055677654c080 @increment=10, @seconds=1616946710>, "signature"=> {"hash"=><BSON::Binary:0x2240 type=generic data=0x0000000000000000...>, "keyId"=>0}}, "operationTime"=> #<BSON::Timestamp:0x0000556776533e40 @increment=9, @seconds=1616946710>}
On both 4.4 and 4.9, sharded cluster responses include codeName and neither standalone nor mongos responses do.
Since the error originates in a mongod, mongod should be able to fill in the code name also?
Tested on 4.9.0-alpha7.