diff options
Diffstat (limited to 'jstests/repl/dbcase.js')
-rw-r--r-- | jstests/repl/dbcase.js | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/jstests/repl/dbcase.js b/jstests/repl/dbcase.js new file mode 100644 index 0000000..10a5a61 --- /dev/null +++ b/jstests/repl/dbcase.js @@ -0,0 +1,95 @@ +// Test db case checking with replication SERVER-2111 + +baseName = "jstests_repl_dbcase"; + +rt = new ReplTest( baseName ); + +m = rt.start( true ); +s = rt.start( false ); + +n1 = "dbname"; +n2 = "dbNAme"; + +/** + * The value of n should be n1 or n2. Check that n is soon present while its + * opposite is not present. + */ +function check( n ) { + assert.soon( function() { + try { + // Our db name changes may trigger an exception - SERVER-3189. + names = s.getDBNames(); + } catch (e) { + return false; + } + n1Idx = names.indexOf( n1 ); + n2Idx = names.indexOf( n2 ); + if ( n1Idx != -1 && n2Idx != -1 ) { + // n1 and n2 may both be reported as present transiently. + return false; + } + // Return true if we matched expected n. + return -1 != names.indexOf( n ); + } ); +} + +/** Allow some time for additional operations to be processed by the slave. */ +function checkTwice( n ) { + check( n ); + // zzz is expected to be cloned after n1 and n2 because of its position in the alphabet. + m.getDB( "zzz" ).c.save( {} ); + assert.soon( function() { return s.getDB( "zzz" ).c.count(); } ) + check( n ); + m.getDB( "zzz" ).dropDatabase(); +} + +/** + * The slave may create in memory db names on the master matching old dbs it is + * attempting to clone. This function forces operation 'cmd' by deleting those + * in memory dbs if necessary. This function should only be called in cases where + * 'cmd' would succeed if not for the in memory dbs on master created by the slave. + */ +function force( cmd ) { + print( "cmd: " + cmd ); + eval( cmd ); + while( m1.getLastError() ) { + sleep( 100 ); + m1.dropDatabase(); + m2.dropDatabase(); + eval( cmd ); + } +} + +m1 = m.getDB( n1 ); +m2 = m.getDB( n2 ); + +m1.c.save( {} ); +m2.c.save( {} ); // will fail due to conflict +check( n1 ); + +m1.dropDatabase(); +force( "m2.c.save( {} );" ); // will now succeed +check( n2 ); + +m2.dropDatabase(); +force( "m1.c.save( {} );" ); +check( n1 ); + +for( i = 0; i < 5; ++i ) { + m1.dropDatabase(); + force( "m2.c.save( {} );" ); + m2.dropDatabase(); + force( "m1.c.save( {} );" ); +} +checkTwice( n1 ); + +m1.dropDatabase(); +force( "m2.c.save( {} );" ); + +for( i = 0; i < 5; ++i ) { + m2.dropDatabase(); + force( "m1.c.save( {} );" ); + m1.dropDatabase(); + force( "m2.c.save( {} );" ); +} +checkTwice( n2 ); |