The oplog starting in version 2.2.1 seemed to get a new format when updates are performed containing $set operations. This new format creates BSON documents in the rs.oplog collection where the $set key is included for each $set operation, whereas in versions prior to 2.2.1 there would only be a single $set key in the document and a subdocument would describe all the fields to be set. Since there are multiple $set keys, most drivers cannot parse these oplog documents, and will get exceptions while iterating through the oplog query results that contain any update operation with multiple $set updates.
Here is an example for creating the malformed oplog entries on a new 2.2.1 or 2.2.2 system:
rs0:PRIMARY> db.mycoll.save({_id:"unique-id-1234", "aaa":"0000", "bbb": "1111"})
rs0:PRIMARY> db.mycoll.update({_id:"unique-id-1234"}, {$set:{"aaa":"1234","bbb":"7654"}})
rs0:PRIMARY> use local
rs0:PRIMARY> db.oplog.rs.find().pretty()
{
"ts" : Timestamp(1353099630000, 1),
"h" : NumberLong(0),
"v" : 2,
"op" : "n",
"ns" : "",
"o" : {
"msg" : "initiating set"
}
}
{
"ts" : Timestamp(1353099716000, 1),
"h" : NumberLong("6562103115049336849"),
"v" : 2,
"op" : "i",
"ns" : "sample.mycoll",
"o" : {
"_id" : "unique-id-1234",
"aaa" : "0000",
"bbb" : "1111"
}
}
{
"ts" : Timestamp(1353099904000, 1),
"h" : NumberLong("-7902296395036453900"),
"v" : 2,
"op" : "u",
"ns" : "sample.mycoll",
"o2" : {
"_id" : "unique-id-1234"
},
"o" : {
"$set" : {
"aaa" : "1234"
},
"$set" : {
"aaa" : "1234"
}
}
}
You will notice the "o" subdocument contains two "$set" keys, and drivers can't handle this new format. In prior versions, including 2.2.0, I would see this type of oplog entry when performing a update on a document, setting multiple fields:
{
"ts" : Timestamp(1353074108000, 3),
"h" : NumberLong("-3950642131243057651"),
"op" : "u",
"ns" : "mydb.mycollection",
"o2" : {
"_id" : "my-unique-id-1234"
},
"o" : {
"$set" : {
"aaa" : "1234",
"bbb" : "2345",
"ccc" : "3456",
"ddd" : "4567",
"eee" : "5678",
"fff" : "6789",
"ggg" : "7890",
"hhh" : "asdf"
}
}
}
If it is helpful, here is the entire conversation in context.
- duplicates
-
SERVER-1606 Oplog entries contain repeated fields ($set)
-
- Closed
-
- related to
-
SERVER-1606 Oplog entries contain repeated fields ($set)
-
- Closed
-