Details
Description
If NamespaceDetails::getRecordAllocationSize() is passed a value that is a power of 2, and Flag_UsePowerOf2Sizes is enabled, the function will return the next power of two (or the next 1mb increment if >= 4mb).
This is only an issue in (potentially rare) cases when getRecordAllocationSize() is passed a value that is already quantized.
Test
c = db.c;
|
|
|
c.drop();
|
db.createCollection( 'c' );
|
printjson( db.runCommand( { collMod:'c', usePowerOf2Sizes:true } ) );
|
|
big = new Array( 1024 * 1024 - 41 ).toString();
|
doc = { _id:0, b:big };
|
assert.eq( 0x100000 - 0x10, Object.bsonsize( doc ) );
|
|
// A doc of size 0x100000 - 0x10 triggers a record allocation request of size 0x100000.
|
c.insert( doc );
|
|
// But the actual record size allocated is 0x200000. This can be seen by adding logging.
|
printjson( c.dataSize() ); // 0x200000 - 0x10
|
|
|
c.drop();
|
db.createCollection( 'c' );
|
printjson( db.runCommand( { collMod:'c', usePowerOf2Sizes:true } ) );
|
|
big = new Array( 16 * 1024 * 1024 - 41 ).toString();
|
doc = { _id:0, b:big };
|
assert.eq( 0x1000000 - 0x10, Object.bsonsize( doc ) );
|
// A doc of size 0x1000000 - 0x10 triggers a record allocation request of size 0x1000000.
|
c.insert( doc );
|
|
// But the actual record size allocated is 0x1100000. This can be seen by adding logging.
|
printjson( c.dataSize() ); // 0x1100000 - 0x10
|