summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2014-05-05 22:58:16 -0400
committerEliot Horowitz <eliot@10gen.com>2014-05-06 12:06:58 -0400
commitaa170e9550ae7b88ae129e90d083d6f9373ce1da (patch)
treea83d49673c4e1d08f4f07cf19909ceb70de73ec3 /src/mongo/db/storage
parentefb6e34939db78e258d2fa18829b4cab3e0ea8bb (diff)
downloadmongo-aa170e9550ae7b88ae129e90d083d6f9373ce1da.tar.gz
SERVER-13639: move Extent sizing info all into ExtentManager
Diffstat (limited to 'src/mongo/db/storage')
-rw-r--r--src/mongo/db/storage/extent.cpp51
-rw-r--r--src/mongo/db/storage/extent.h14
-rw-r--r--src/mongo/db/storage/extent_manager.cpp53
-rw-r--r--src/mongo/db/storage/extent_manager.h23
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp39
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h5
6 files changed, 82 insertions, 103 deletions
diff --git a/src/mongo/db/storage/extent.cpp b/src/mongo/db/storage/extent.cpp
index aa442f869d1..df8f409f855 100644
--- a/src/mongo/db/storage/extent.cpp
+++ b/src/mongo/db/storage/extent.cpp
@@ -30,7 +30,6 @@
#include "mongo/db/storage/extent.h"
-#include "mongo/db/storage/data_file.h"
#include "mongo/db/storage/extent_manager.h"
#include "mongo/util/mongoutils/str.h"
@@ -38,46 +37,6 @@ namespace mongo {
BOOST_STATIC_ASSERT( sizeof(Extent)-4 == 48+128 );
- int Extent::initialSize(int len) {
- verify( len <= maxSize() );
-
- long long sz = len * 16;
- if ( len < 1000 )
- sz = len * 64;
-
- if ( sz >= maxSize() )
- return maxSize();
-
- if ( sz <= minSize() )
- return minSize();
-
- int z = ExtentManager::quantizeExtentSize( sz );
- verify( z >= len );
- return z;
- }
-
- int Extent::followupSize(int len, int lastExtentLen) {
- verify( len < Extent::maxSize() );
- int x = initialSize(len);
- // changed from 1.20 to 1.35 in v2.1.x to get to larger extent size faster
- int y = (int) (lastExtentLen < 4000000 ? lastExtentLen * 4.0 : lastExtentLen * 1.35);
- int sz = y > x ? y : x;
-
- if ( sz < lastExtentLen ) {
- // this means there was an int overflow
- // so we should turn it into maxSize
- return Extent::maxSize();
- }
- else if ( sz > Extent::maxSize() ) {
- return Extent::maxSize();
- }
-
- sz = ExtentManager::quantizeExtentSize( sz );
- verify( sz >= len );
-
- return sz;
- }
-
BSONObj Extent::dump() const {
return BSON( "loc" << myLoc.toString()
<< "xnext" << xnext.toString()
@@ -136,12 +95,13 @@ namespace mongo {
}
extentOk = false;
}
- if (length < minSize()) {
+ static const int minSize = 0x1000;
+ if (length < minSize) {
if (errors) {
StringBuilder sb;
sb << "length of extent " << diskLoc.toString()
<< " is " << length
- << ", which is less than minimum length of " << minSize();
+ << ", which is less than minimum length of " << minSize;
errors->push_back( sb.str() );
}
extentOk = false;
@@ -149,9 +109,4 @@ namespace mongo {
return extentOk;
}
- int Extent::maxSize() {
- return DataFile::maxSize() - DataFileHeader::HeaderSize - 16;
- }
-
-
}
diff --git a/src/mongo/db/storage/extent.h b/src/mongo/db/storage/extent.h
index 00ce898aa02..175180f2171 100644
--- a/src/mongo/db/storage/extent.h
+++ b/src/mongo/db/storage/extent.h
@@ -76,20 +76,6 @@ namespace mongo {
void assertOk() const { verify(isOk()); }
static int HeaderSize() { return sizeof(Extent)-4; }
-
- static int maxSize();
- static int minSize() { return 0x1000; }
- /**
- * @param len lengt of record we need
- * @param lastRecord size of last extent which is a factor in next extent size
- */
- static int followupSize(int len, int lastExtentLen);
-
- /** get a suggested size for the first extent in a namespace
- * @param len length of record we need to insert
- */
- static int initialSize(int len);
-
};
#pragma pack()
diff --git a/src/mongo/db/storage/extent_manager.cpp b/src/mongo/db/storage/extent_manager.cpp
index 96d3d4212cc..a9685f7859f 100644
--- a/src/mongo/db/storage/extent_manager.cpp
+++ b/src/mongo/db/storage/extent_manager.cpp
@@ -34,27 +34,66 @@
namespace mongo {
- int ExtentManager::quantizeExtentSize( int size ) {
+ int ExtentManager::quantizeExtentSize( int size ) const {
- if ( size == Extent::maxSize() ) {
+ if ( size == maxSize() ) {
// no point doing quantizing for the entire file
return size;
}
- verify( size <= Extent::maxSize() );
+ invariant( size <= maxSize() );
// make sizes align with VM page size
int newSize = (size + 0xfff) & 0xfffff000;
- if ( newSize > Extent::maxSize() ) {
- return Extent::maxSize();
+ if ( newSize > maxSize() ) {
+ return maxSize();
}
- if ( newSize < Extent::minSize() ) {
- return Extent::minSize();
+ if ( newSize < minSize() ) {
+ return minSize();
}
return newSize;
}
+ int ExtentManager::followupSize( int len, int lastExtentLen ) const {
+ invariant( len < maxSize() );
+ int x = initialSize(len);
+ // changed from 1.20 to 1.35 in v2.1.x to get to larger extent size faster
+ int y = (int) (lastExtentLen < 4000000 ? lastExtentLen * 4.0 : lastExtentLen * 1.35);
+ int sz = y > x ? y : x;
+
+ if ( sz < lastExtentLen ) {
+ // this means there was an int overflow
+ // so we should turn it into maxSize
+ return maxSize();
+ }
+ else if ( sz > maxSize() ) {
+ return maxSize();
+ }
+
+ sz = quantizeExtentSize( sz );
+ verify( sz >= len );
+
+ return sz;
+ }
+
+ int ExtentManager::initialSize( int len ) const {
+ invariant( len <= maxSize() );
+
+ long long sz = len * 16;
+ if ( len < 1000 )
+ sz = len * 64;
+
+ if ( sz >= maxSize() )
+ return maxSize();
+
+ if ( sz <= minSize() )
+ return minSize();
+
+ int z = ExtentManager::quantizeExtentSize( sz );
+ verify( z >= len );
+ return z;
+ }
}
diff --git a/src/mongo/db/storage/extent_manager.h b/src/mongo/db/storage/extent_manager.h
index b00a742309b..8d580d04ef7 100644
--- a/src/mongo/db/storage/extent_manager.h
+++ b/src/mongo/db/storage/extent_manager.h
@@ -128,9 +128,30 @@ namespace mongo {
bool preallocateOnly = false );
/**
+ * @return maximum size of an Extent
+ */
+ virtual int maxSize() const = 0;
+
+ /**
+ * @return minimum size of an Extent
+ */
+ virtual int minSize() const { return 0x1000; }
+
+ /**
+ * @param len lengt of record we need
+ * @param lastRecord size of last extent which is a factor in next extent size
+ */
+ virtual int followupSize( int len, int lastExtentLen ) const;
+
+ /** get a suggested size for the first extent in a namespace
+ * @param len length of record we need to insert
+ */
+ virtual int initialSize( int len ) const;
+
+ /**
* quantizes extent size to >= min + page boundary
*/
- static int quantizeExtentSize( int size );
+ virtual int quantizeExtentSize( int size ) const;
};
}
diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp
index b8b4a221d27..1073ba4e746 100644
--- a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp
+++ b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp
@@ -235,33 +235,14 @@ namespace mongo {
return e;
}
- int MmapV1ExtentManager::quantizeExtentSize( int size ) {
-
- if ( size == Extent::maxSize() ) {
- // no point doing quantizing for the entire file
- return size;
- }
-
- verify( size <= Extent::maxSize() );
-
- // make sizes align with VM page size
- int newSize = (size + 0xfff) & 0xfffff000;
-
- if ( newSize > Extent::maxSize() ) {
- return Extent::maxSize();
- }
-
- if ( newSize < Extent::minSize() ) {
- return Extent::minSize();
- }
-
- return newSize;
- }
-
void _quotaExceeded() {
uasserted(12501, "quota exceeded");
}
+ int MmapV1ExtentManager::maxSize() const {
+ return DataFile::maxSize() - DataFileHeader::HeaderSize - 16;
+ }
+
DiskLoc MmapV1ExtentManager::_createExtentInFile( TransactionExperiment* txn,
int fileNo,
DataFile* f,
@@ -279,7 +260,7 @@ namespace mongo {
}
}
- massert( 10358, "bad new extent size", size >= Extent::minSize() && size <= Extent::maxSize() );
+ massert( 10358, "bad new extent size", size >= minSize() && size <= maxSize() );
DiskLoc loc = f->allocExtentArea( txn, size );
loc.assertOk();
@@ -300,8 +281,8 @@ namespace mongo {
int maxFileNoForQuota ) {
size = quantizeExtentSize( size );
- if ( size > Extent::maxSize() )
- size = Extent::maxSize();
+ if ( size > maxSize() )
+ size = maxSize();
verify( size < DataFile::maxSize() );
@@ -352,11 +333,11 @@ namespace mongo {
}
if ( high <= 0 ) {
// overflowed
- high = max(approxSize, Extent::maxSize());
+ high = max(approxSize, maxSize());
}
- if ( high <= Extent::minSize() ) {
+ if ( high <= minSize() ) {
// the minimum extent size is 4097
- high = Extent::minSize() + 1;
+ high = minSize() + 1;
}
// scan free list looking for something suitable
diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h
index 678ff74a830..8c5f4bb656d 100644
--- a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h
+++ b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.h
@@ -143,10 +143,7 @@ namespace mongo {
*/
Extent* getExtent( const DiskLoc& loc, bool doSanityCheck = true ) const;
- /**
- * quantizes extent size to >= min + page boundary
- */
- static int quantizeExtentSize( int size );
+ virtual int maxSize() const;
private: