1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
/* This test ensures that the usePowerOf2 user flag
* effectively reuses space. The test repeatedly inserts and
* then deletes a batch of variable-length strings, then checks
* that doing so does not cause the storageSize to grow. */
// A bunch of strings of length 0 to 100
var var_length_strings =
[ "" ,
"aaaaa" ,
"aaaaaaaaaa" ,
"aaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ]
//insert all the strings
var batch_insert = function(coll){
for ( i=0; i < var_length_strings.length; i++ ){
coll.insert( { a : var_length_strings[i] } );
}
}
//delete the same strings
var batch_delete = function(coll){
for ( i=0; i < var_length_strings.length; i++ ){
coll.remove( { a : var_length_strings[i] } );
}
}
//number of times to repeat batch inserts/deletes
var numrepeats = 1000;
var testStorageSize = function(ns){
//insert docs and measure storage size
batch_insert(ns);
var oldSize = ns.stats().storageSize;
//remove and add same docs a bunch of times
for ( n=0 ; n < numrepeats ; n++ ){
batch_delete(ns);
batch_insert(ns);
}
//check size didn't change
var newSize = ns.stats().storageSize;
assert.eq( oldSize , newSize , "storage size changed");
}
/****************** TEST 1 *****************************/
//create fresh collection, set flag to true, test storage size
var coll = "usepower1"
var t = db.getCollection(coll);
t.drop();
db.createCollection(coll);
var res = db.runCommand( { "collMod" : coll , "usePowerOf2Sizes" : true } );
assert.eq( res.ok , 1 , "collMod failed" );
res = db.runCommand( { "collMod" : coll , "usePowerOf2Sizess" : true } )
assert.eq( res.ok , 0 , "collMod should have failed: " + tojson( res ) )
testStorageSize(t);
/**************** Test 2 *****************************/
//repeat previous test, but with flag set at creation time
var coll = "usepower2"
var t = db.getCollection(coll);
t.drop();
db.runCommand({"create" : coll, "flags" : 1 });
testStorageSize(t);
|