summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/trace_missing_docs.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/trace_missing_docs.js')
-rw-r--r--src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/trace_missing_docs.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/trace_missing_docs.js b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/trace_missing_docs.js
new file mode 100644
index 00000000000..285d9afcdcd
--- /dev/null
+++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/trace_missing_docs.js
@@ -0,0 +1,102 @@
+
+//
+// On error inserting documents, traces back and shows where the document was dropped
+//
+
+function traceMissingDoc(coll, doc, mongos) {
+ if (mongos) {
+ coll = mongos.getCollection(String(coll));
+ } else {
+ mongos = coll.getMongo();
+ }
+
+ var config = mongos.getDB("config");
+ var shards = config.shards.find().toArray();
+ for (var i = 0; i < shards.length; i++) {
+ shards[i].conn = new Mongo(shards[i].host);
+ }
+
+ var shardKeyPatt = config.collections.findOne({_id: String(coll)}).key;
+
+ // Project out the shard key
+ var shardKey = {};
+ for (var k in shardKeyPatt) {
+ if (!shardKeyPatt.hasOwnProperty(k)) {
+ continue;
+ }
+ if (doc[k] === undefined || docs[k] === null) {
+ jsTest.log("Shard key " + tojson(shardKey)
+ + " not found in doc " + tojson(doc)
+ + ", falling back to _id search...");
+ shardKeyPatt = {_id: 1};
+ shardKey = {_id: doc['_id']};
+ break;
+ }
+ shardKey[k] = doc[k];
+ }
+
+ if (doc['_id'] === undefined) {
+ jsTest.log("Id not found in doc " + tojson(doc) + " cannot trace oplog entries.");
+ return;
+ }
+
+ jsTest.log("Using shard key : " + tojson(shardKey));
+
+ var allOps = [];
+ for (i = 0; i < shards.length; i++) {
+ var oplog = shards[i].conn.getCollection("local.oplog.rs");
+ if (!oplog.findOne()) {
+ oplog = shards[i].conn.getCollection("local.oplog.$main");
+ }
+
+ if (!oplog.findOne()) {
+ jsTest.log("No oplog was found on shard " + shards[i]._id);
+ continue;
+ }
+
+ var addKeyQuery = function(query, prefix) {
+ for (var k in shardKey) { // eslint-disable-line guard-for-in
+ query[prefix + '.' + k] = shardKey[k];
+ }
+ return query;
+ };
+
+ var addToOps = function(cursor) { // eslint-disable-line no-loop-func
+ cursor.forEach(function(doc) {
+ doc.shard = shards[i]._id;
+ doc.realTime = new Date(doc.ts.getTime() * 1000);
+ allOps.push(doc);
+ });
+ };
+
+ // Find ops
+ addToOps(oplog.find(addKeyQuery({op: 'i'}, 'o')));
+ var updateQuery = {
+ $or: [
+ addKeyQuery({op: 'u'}, 'o2'),
+ {op: 'u', 'o2._id': doc['_id']},
+ ],
+ };
+ addToOps(oplog.find(updateQuery));
+ addToOps(oplog.find({op: 'd', 'o._id': doc['_id']}));
+ }
+
+ var compareOps = function(opA, opB) {
+ if (opA.ts < opB.ts) {
+ return -1;
+ }
+ if (opB.ts < opA.ts) {
+ return 1;
+ }
+ return 0;
+ };
+
+ allOps.sort(compareOps);
+
+ print("Ops found for doc " + tojson(doc) + " on each shard:\n");
+ for (i = 0; i < allOps.length; i++) {
+ printjson(allOps[i]);
+ }
+
+ return allOps;
+}