Files
mongo/jstests/sharding/sync7.js
greg 737a20b8fa Fixes for distributed lock handling time skew.
In general, the current distributed lock is susceptible to time skew in config servers and mongos clients.  This update
uses an algorithm that checks for time skew, as well as providing some more robust tests to make sure a distributed
lock cannot be forced prematurely.  Some documentation on the website, currently hidden from non-10gen, gives more
info.
2011-03-01 14:15:26 -05:00

64 lines
2.5 KiB
JavaScript

// Test that the clock skew of the distributed lock disallows getting locks for moving and splitting.
s = new ShardingTest( "moveDistLock", 3, 0, undefined, { sync : true } );
s._connections[0].getDB( "admin" ).runCommand( { _skewClockCommand : 1, skew : 15000 } )
s._connections[1].getDB( "admin" ).runCommand( { _skewClockCommand : 1, skew : -16000 } )
// We need to start another mongos after skewing the clock, since the first mongos will have already
// tested the config servers (via the balancer) before we manually skewed them
otherMongos = startMongos( { port : 30020, v : 0, configdb : s._configDB, logpath : "/dev/null" } );
// Initialize DB data
initDB = function(name) {
var db = s.getDB( name );
var c = db.foo;
c.save( { a : 1 } );
c.save( { a : 2 } );
c.save( { a : 3 } );
assert( 3, c.count() );
return s.getServer( name );
}
from = initDB( "test1" );
to = s.getAnother( from );
s.printShardingStatus();
// Make sure we can't move when our clock skew is so high
result = otherMongos.getDB( "admin" ).runCommand( { moveprimary : "test1", to : to.name } );
s.printShardingStatus();
assert.eq( result.ok, 0, "Move command should not have succeeded!" )
// Enable sharding on DB and collection
result = otherMongos.getDB("admin").runCommand( { enablesharding : "test1" } );
result = otherMongos.getDB("test1").foo.ensureIndex( { a : 1 } );
result = otherMongos.getDB("admin").runCommand( { shardcollection : "test1.foo", key : { a : 1 } } );
print(" Collection Sharded! ")
// Make sure we can't split when our clock skew is so high
result = otherMongos.getDB( "admin" ).runCommand( { split : "test1.foo", find : { a : 2 } } );
assert.eq( result.ok, 0, "Split command should not have succeeded!")
// Adjust clock back in bounds
s._connections[1].getDB( "admin" ).runCommand( { _skewClockCommand : 1, skew : 0 } )
print(" Clock adjusted back to in-bounds. ");
// Make sure we can now split
result = otherMongos.getDB( "admin" ).runCommand( { split : "test1.foo", find : { a : 2 } } );
s.printShardingStatus();
assert.eq( result.ok, 1, "Split command should have succeeded!")
// Make sure we can now move
result = otherMongos.getDB( "admin" ).runCommand( { moveprimary : "test1", to : to.name } );
s.printShardingStatus();
assert.eq( result.ok, 1, "Move command should have succeeded!" )
// Make sure we can now move again (getting the lock twice)
result = otherMongos.getDB( "admin" ).runCommand( { moveprimary : "test1", to : from.name } );
s.printShardingStatus();
assert.eq( result.ok, 1, "Move command should have succeeded again!" )
s.stop();