From fe4113f77ef77a79741ed557be866df0e4a5272b Mon Sep 17 00:00:00 2001 From: Eliot Horowitz Date: Mon, 21 Apr 2014 17:33:59 -0400 Subject: SERVER-13638: add hidden interface for NamespaceDetails in RecordStoreV1 --- .../db/structure/catalog/namespace_details.cpp | 2 + src/mongo/db/structure/catalog/namespace_details.h | 2 +- .../catalog/namespace_details_rsv1_metadata.h | 129 +++++++++++++++++++++ src/mongo/db/structure/record_store_v1_base.cpp | 3 +- src/mongo/db/structure/record_store_v1_base.h | 58 ++++++++- src/mongo/db/structure/record_store_v1_capped.cpp | 6 +- src/mongo/db/structure/record_store_v1_capped.h | 2 +- .../structure/record_store_v1_capped_iterator.cpp | 4 +- src/mongo/db/structure/record_store_v1_simple.cpp | 4 +- src/mongo/db/structure/record_store_v1_simple.h | 2 +- 10 files changed, 194 insertions(+), 18 deletions(-) create mode 100644 src/mongo/db/structure/catalog/namespace_details_rsv1_metadata.h (limited to 'src/mongo/db/structure') diff --git a/src/mongo/db/structure/catalog/namespace_details.cpp b/src/mongo/db/structure/catalog/namespace_details.cpp index 0ad772b0cef..f281d266d70 100644 --- a/src/mongo/db/structure/catalog/namespace_details.cpp +++ b/src/mongo/db/structure/catalog/namespace_details.cpp @@ -68,6 +68,8 @@ namespace mongo { }; NamespaceDetails::NamespaceDetails( const DiskLoc &loc, bool capped ) { + BOOST_STATIC_ASSERT( sizeof(NamespaceDetails::Extra) <= sizeof(NamespaceDetails) ); + /* be sure to initialize new fields here -- doesn't default to zeroes the way we use it */ _firstExtent = _lastExtent = _capExtent = loc; _stats.datasize = _stats.nrecords = 0; diff --git a/src/mongo/db/structure/catalog/namespace_details.h b/src/mongo/db/structure/catalog/namespace_details.h index 68e563f8f47..80bacc669d9 100644 --- a/src/mongo/db/structure/catalog/namespace_details.h +++ b/src/mongo/db/structure/catalog/namespace_details.h @@ -155,7 +155,7 @@ namespace mongo { const DiskLoc& capExtent() const { return _capExtent; } void setCapExtent( const DiskLoc& loc ); - const DiskLoc capFirstNewRecord() const { return _capFirstNewRecord; } + const DiskLoc& capFirstNewRecord() const { return _capFirstNewRecord; } void setCapFirstNewRecord( const DiskLoc& loc ); bool capLooped() const { return _capFirstNewRecord.isValid(); } diff --git a/src/mongo/db/structure/catalog/namespace_details_rsv1_metadata.h b/src/mongo/db/structure/catalog/namespace_details_rsv1_metadata.h new file mode 100644 index 00000000000..eba482a99a6 --- /dev/null +++ b/src/mongo/db/structure/catalog/namespace_details_rsv1_metadata.h @@ -0,0 +1,129 @@ +// namespace_details_rsv1_metadata.h + +#include "mongo/db/structure/record_store_v1_base.h" + +namespace mongo { + + /* + * NOTE: NamespaceDetails will become a struct + * all dur, etc... will move here + */ + class NamespaceDetailsRSV1MetaData : public RecordStoreV1MetaData { + public: + explicit NamespaceDetailsRSV1MetaData( NamespaceDetails* details ) { + _details = details; + } + + virtual ~NamespaceDetailsRSV1MetaData(){} + + virtual int bucket(int size) const { + return _details->bucket( size ); + } + + virtual const DiskLoc& capExtent() const { + return _details->capExtent(); + } + + virtual void setCapExtent( const DiskLoc& loc ) { + _details->setCapExtent( loc ); + } + + virtual const DiskLoc& capFirstNewRecord() const { + return _details->capFirstNewRecord(); + } + + virtual void setCapFirstNewRecord( const DiskLoc& loc ) { + _details->setCapFirstNewRecord( loc ); + } + + virtual bool capLooped() const { + return _details->capLooped(); + } + + virtual void clearSystemFlags() { + _details->clearSystemFlags(); + } + + virtual long long dataSize() const { + return _details->dataSize(); + } + virtual long long numRecords() const { + return _details->numRecords(); + } + + virtual void incrementStats( long long dataSizeIncrement, + long long numRecordsIncrement ) { + _details->incrementStats( dataSizeIncrement, numRecordsIncrement ); + } + + virtual void setStats( long long dataSizeIncrement, + long long numRecordsIncrement ) { + _details->setStats( dataSizeIncrement, + numRecordsIncrement ); + } + + virtual const DiskLoc& deletedListEntry( int bucket ) const { + return _details->deletedListEntry( bucket ); + } + + virtual void setDeletedListEntry( int bucket, const DiskLoc& loc ) { + _details->setDeletedListEntry( bucket, loc ); + } + + virtual void orphanDeletedList() { + _details->orphanDeletedList(); + } + + virtual const DiskLoc& firstExtent() const { + return _details->firstExtent(); + } + + virtual void setFirstExtent( const DiskLoc& loc ) { + _details->setFirstExtent( loc ); + } + + virtual const DiskLoc& lastExtent() const { + return _details->lastExtent(); + } + + virtual void setLastExtent( const DiskLoc& loc ) { + _details->setLastExtent( loc ); + } + + virtual bool isCapped() const { + return _details->isCapped(); + } + + virtual bool isUserFlagSet( int flag ) const { + return _details->isUserFlagSet( flag ); + } + + virtual int lastExtentSize() const { + return _details->lastExtentSize(); + } + + virtual void setLastExtentSize( int newMax ) { + _details->setLastExtentSize( newMax ); + } + + virtual long long maxCappedDocs() const { + return _details->maxCappedDocs(); + } + + virtual double paddingFactor() const { + return _details->paddingFactor(); + } + + virtual void setPaddingFactor( double paddingFactor ) { + _details->setPaddingFactor( paddingFactor ); + } + + virtual int quantizePowerOf2AllocationSpace(int allocSize) const { + return _details->quantizePowerOf2AllocationSpace( allocSize ); + } + + private: + NamespaceDetails* _details; + }; + +} diff --git a/src/mongo/db/structure/record_store_v1_base.cpp b/src/mongo/db/structure/record_store_v1_base.cpp index cc619015b91..fa38ebb3e58 100644 --- a/src/mongo/db/structure/record_store_v1_base.cpp +++ b/src/mongo/db/structure/record_store_v1_base.cpp @@ -37,12 +37,11 @@ #include "mongo/db/storage/extent_manager.h" #include "mongo/db/storage/record.h" #include "mongo/db/structure/catalog/namespace_details.h" -#include "mongo/util/mmap.h" namespace mongo { RecordStoreV1Base::RecordStoreV1Base( const StringData& ns, - NamespaceDetails* details, + RecordStoreV1MetaData* details, ExtentManager* em, bool isSystemIndexes ) : RecordStore( ns ), diff --git a/src/mongo/db/structure/record_store_v1_base.h b/src/mongo/db/structure/record_store_v1_base.h index 510016b650f..230a2657124 100644 --- a/src/mongo/db/structure/record_store_v1_base.h +++ b/src/mongo/db/structure/record_store_v1_base.h @@ -38,13 +38,63 @@ namespace mongo { class CappedRecordStoreV1Iterator; class DocWriter; class ExtentManager; - class NamespaceDetails; class Record; + class RecordStoreV1MetaData { + public: + virtual ~RecordStoreV1MetaData(){} + + virtual int bucket(int size) const = 0; + + virtual const DiskLoc& capExtent() const = 0; + virtual void setCapExtent( const DiskLoc& loc ) = 0; + + virtual const DiskLoc& capFirstNewRecord() const = 0; + virtual void setCapFirstNewRecord( const DiskLoc& loc ) = 0; + + virtual bool capLooped() const = 0; + virtual void clearSystemFlags() = 0; + + virtual long long dataSize() const = 0; + virtual long long numRecords() const = 0; + + virtual void incrementStats( long long dataSizeIncrement, + long long numRecordsIncrement ) = 0; + + virtual void setStats( long long dataSizeIncrement, + long long numRecordsIncrement ) = 0; + + virtual const DiskLoc& deletedListEntry( int bucket ) const = 0; + virtual void setDeletedListEntry( int bucket, const DiskLoc& loc ) = 0; + virtual void orphanDeletedList() = 0; + + virtual const DiskLoc& firstExtent() const = 0; + virtual void setFirstExtent( const DiskLoc& loc ) = 0; + + virtual const DiskLoc& lastExtent() const = 0; + virtual void setLastExtent( const DiskLoc& loc ) = 0; + + virtual bool isCapped() const = 0; + + virtual bool isUserFlagSet( int flag ) const = 0; + + virtual int lastExtentSize() const = 0; + virtual void setLastExtentSize( int newMax ) = 0; + + virtual long long maxCappedDocs() const = 0; + + virtual double paddingFactor() const = 0; + + virtual void setPaddingFactor( double paddingFactor ) = 0; + + virtual int quantizePowerOf2AllocationSpace(int allocSize) const = 0; + + }; + class RecordStoreV1Base : public RecordStore { public: RecordStoreV1Base( const StringData& ns, - NamespaceDetails* details, + RecordStoreV1MetaData* details, ExtentManager* em, bool isSystemIndexes ); @@ -67,7 +117,7 @@ namespace mongo { // TODO: another sad one virtual const DeletedRecord* deletedRecordFor( const DiskLoc& loc ) const; - const NamespaceDetails* details() const { return _details; } + const RecordStoreV1MetaData* details() const { return _details.get(); } /** * @return the actual size to create @@ -112,7 +162,7 @@ namespace mongo { */ void _addRecordToRecListInExtent(Record* r, DiskLoc loc); - NamespaceDetails* _details; + scoped_ptr _details; ExtentManager* _extentManager; bool _isSystemIndexes; diff --git a/src/mongo/db/structure/record_store_v1_capped.cpp b/src/mongo/db/structure/record_store_v1_capped.cpp index 20c6933c2ba..add403210f7 100644 --- a/src/mongo/db/structure/record_store_v1_capped.cpp +++ b/src/mongo/db/structure/record_store_v1_capped.cpp @@ -60,7 +60,7 @@ namespace mongo { CappedRecordStoreV1::CappedRecordStoreV1( Collection* collection, const StringData& ns, - NamespaceDetails* details, + RecordStoreV1MetaData* details, ExtentManager* em, bool isSystemIndexes ) : RecordStoreV1Base( ns, details, em, isSystemIndexes ), @@ -315,7 +315,7 @@ namespace mongo { } void CappedRecordStoreV1::cappedCheckMigrate() { - // migrate old NamespaceDetails format + // migrate old RecordStoreV1MetaData format if ( _details->capExtent().a() == 0 && _details->capExtent().getOfs() == 0 ) { _details->setCapFirstNewRecord( DiskLoc().setInvalid() ); // put all the DeletedRecords in cappedListOfAllDeletedRecords() @@ -554,8 +554,6 @@ namespace mongo { void CappedRecordStoreV1::addDeletedRec( const DiskLoc& dloc ) { DeletedRecord* d = drec( dloc ); - BOOST_STATIC_ASSERT( sizeof(NamespaceDetails::Extra) <= sizeof(NamespaceDetails) ); - { Record *r = (Record *) getDur().writingPtr(d, sizeof(Record)); d = &r->asDeleted(); diff --git a/src/mongo/db/structure/record_store_v1_capped.h b/src/mongo/db/structure/record_store_v1_capped.h index d8a0252817a..52610ba97b0 100644 --- a/src/mongo/db/structure/record_store_v1_capped.h +++ b/src/mongo/db/structure/record_store_v1_capped.h @@ -43,7 +43,7 @@ namespace mongo { public: CappedRecordStoreV1( Collection* collection, const StringData& ns, - NamespaceDetails* details, + RecordStoreV1MetaData* details, ExtentManager* em, bool isSystemIndexes ); diff --git a/src/mongo/db/structure/record_store_v1_capped_iterator.cpp b/src/mongo/db/structure/record_store_v1_capped_iterator.cpp index 2d5c4b64bc3..44be4685adf 100644 --- a/src/mongo/db/structure/record_store_v1_capped_iterator.cpp +++ b/src/mongo/db/structure/record_store_v1_capped_iterator.cpp @@ -48,7 +48,7 @@ namespace mongo { if (_curr.isNull()) { - const NamespaceDetails* nsd = _recordStore->details(); + const RecordStoreV1MetaData* nsd = _recordStore->details(); // If a start position isn't specified, we fill one out from the start of the // collection. @@ -140,7 +140,7 @@ namespace mongo { DiskLoc CappedRecordStoreV1Iterator::getNextCapped(const DiskLoc& dl) { invariant(!dl.isNull()); - NamespaceDetails* details = _recordStore->_details; + const RecordStoreV1MetaData* details = _recordStore->details(); if (CollectionScanParams::FORWARD == _direction) { // If it's not looped, it's easy. diff --git a/src/mongo/db/structure/record_store_v1_simple.cpp b/src/mongo/db/structure/record_store_v1_simple.cpp index 0964821b646..8a64e735d3d 100644 --- a/src/mongo/db/structure/record_store_v1_simple.cpp +++ b/src/mongo/db/structure/record_store_v1_simple.cpp @@ -42,7 +42,6 @@ #include "mongo/db/storage/record.h" #include "mongo/db/structure/catalog/namespace_details.h" #include "mongo/db/structure/record_store_v1_simple_iterator.h" -#include "mongo/util/mmap.h" #include "mongo/util/progress_meter.h" #include "mongo/util/touch_pages.h" @@ -62,7 +61,7 @@ namespace mongo { &freelistIterations ); SimpleRecordStoreV1::SimpleRecordStoreV1( const StringData& ns, - NamespaceDetails* details, + RecordStoreV1MetaData* details, ExtentManager* em, bool isSystemIndexes ) : RecordStoreV1Base( ns, details, em, isSystemIndexes ) { @@ -263,7 +262,6 @@ namespace mongo { void SimpleRecordStoreV1::addDeletedRec( const DiskLoc& dloc ) { DeletedRecord* d = drec( dloc ); - BOOST_STATIC_ASSERT( sizeof(NamespaceDetails::Extra) <= sizeof(NamespaceDetails) ); { Record *r = (Record *) getDur().writingPtr(d, sizeof(Record)); diff --git a/src/mongo/db/structure/record_store_v1_simple.h b/src/mongo/db/structure/record_store_v1_simple.h index b921b410493..e653cf75cb2 100644 --- a/src/mongo/db/structure/record_store_v1_simple.h +++ b/src/mongo/db/structure/record_store_v1_simple.h @@ -41,7 +41,7 @@ namespace mongo { class SimpleRecordStoreV1 : public RecordStoreV1Base { public: SimpleRecordStoreV1( const StringData& ns, - NamespaceDetails* details, + RecordStoreV1MetaData* details, ExtentManager* em, bool isSystemIndexes ); -- cgit v1.2.1