2013-08-27 13:24:43 -04:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// On error inserting documents, traces back and shows where the document was dropped
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
function traceMissingDoc( coll, doc, mongos ) {
|
|
|
|
|
|
|
|
|
|
if (mongos) coll = mongos.getCollection(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 : coll + "" }).key;
|
|
|
|
|
|
|
|
|
|
// Project out the shard key
|
|
|
|
|
var shardKey = {};
|
|
|
|
|
for ( var k in shardKeyPatt ) {
|
|
|
|
|
if ( doc[k] == undefined ) {
|
|
|
|
|
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 ( var 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 ) {
|
|
|
|
|
query[prefix + '.' + k] = shardKey[k];
|
|
|
|
|
}
|
|
|
|
|
return query;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var addToOps = function( cursor ) {
|
|
|
|
|
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 ) {
|
2015-10-09 14:34:26 -04:00
|
|
|
return bsonWoCompare( opA.ts, opB.ts );
|
2013-08-27 13:24:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
allOps.sort( compareOps );
|
|
|
|
|
|
|
|
|
|
print( "Ops found for doc " + tojson( doc ) + " on each shard:\n" );
|
|
|
|
|
for ( var i = 0; i < allOps.length; i++ ) {
|
|
|
|
|
printjson( allOps[i] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return allOps;
|
|
|
|
|
}
|