@@ -55,7 +55,7 @@ namespace mongo {
5555 }
5656
5757 Record* RecordStoreV1Base::recordFor ( const DiskLoc& loc ) const {
58- return _extentManager->recordFor ( loc );
58+ return _extentManager->recordForV1 ( loc );
5959 }
6060
6161 const DeletedRecord* RecordStoreV1Base::deletedRecordFor ( const DiskLoc& loc ) const {
@@ -72,6 +72,72 @@ namespace mongo {
7272 return _extentManager->getExtent ( loc );
7373 }
7474
75+ DiskLoc RecordStoreV1Base::_getExtentLocForRecord ( const DiskLoc& loc ) const {
76+ return _extentManager->extentLocForV1 ( loc );
77+ }
78+
79+
80+ DiskLoc RecordStoreV1Base::getNextRecord ( const DiskLoc& loc ) const {
81+ DiskLoc next = getNextRecordInExtent ( loc );
82+ if ( !next.isNull () )
83+ return next;
84+
85+ // now traverse extents
86+
87+ Extent* e = _getExtent ( _getExtentLocForRecord (loc) );
88+ while ( 1 ) {
89+ if ( e->xnext .isNull () )
90+ return DiskLoc (); // end of collection
91+ e = _getExtent ( e->xnext );
92+ if ( !e->firstRecord .isNull () )
93+ break ;
94+ // entire extent could be empty, keep looking
95+ }
96+ return e->firstRecord ;
97+ }
98+
99+ DiskLoc RecordStoreV1Base::getPrevRecord ( const DiskLoc& loc ) const {
100+ DiskLoc prev = getPrevRecordInExtent ( loc );
101+ if ( !prev.isNull () )
102+ return prev;
103+
104+ // now traverse extents
105+
106+ Extent *e = _getExtent (_getExtentLocForRecord (loc));
107+ while ( 1 ) {
108+ if ( e->xprev .isNull () )
109+ return DiskLoc (); // end of collection
110+ e = _getExtent ( e->xprev );
111+ if ( !e->firstRecord .isNull () )
112+ break ;
113+ // entire extent could be empty, keep looking
114+ }
115+ return e->lastRecord ;
116+
117+ }
118+
119+ DiskLoc RecordStoreV1Base::getNextRecordInExtent ( const DiskLoc& loc ) const {
120+ int nextOffset = recordFor ( loc )->nextOfs ();
121+
122+ if ( nextOffset == DiskLoc::NullOfs )
123+ return DiskLoc ();
124+
125+ fassert ( 17441 , abs (nextOffset) >= 8 ); // defensive
126+ return DiskLoc ( loc.a (), nextOffset );
127+ }
128+
129+ DiskLoc RecordStoreV1Base::getPrevRecordInExtent ( const DiskLoc& loc ) const {
130+ int prevOffset = recordFor ( loc )->prevOfs ();
131+
132+ if ( prevOffset == DiskLoc::NullOfs )
133+ return DiskLoc ();
134+
135+ fassert ( 17442 , abs (prevOffset) >= 8 ); // defensive
136+ return DiskLoc ( loc.a (), prevOffset );
137+
138+ }
139+
140+
75141 StatusWith<DiskLoc> RecordStoreV1Base::insertRecord ( const DocWriter* doc, int quotaMax ) {
76142 int lenWHdr = doc->documentSize () + Record::HeaderSize;
77143 if ( doc->addPadding () )
@@ -124,21 +190,21 @@ namespace mongo {
124190 /* remove ourself from the record next/prev chain */
125191 {
126192 if ( todelete->prevOfs () != DiskLoc::NullOfs ) {
127- DiskLoc prev = _extentManager-> getPrevRecordInExtent ( dl );
193+ DiskLoc prev = getPrevRecordInExtent ( dl );
128194 Record* prevRecord = recordFor ( prev );
129195 getDur ().writingInt ( prevRecord->nextOfs () ) = todelete->nextOfs ();
130196 }
131197
132198 if ( todelete->nextOfs () != DiskLoc::NullOfs ) {
133- DiskLoc next = _extentManager-> getNextRecord ( dl );
199+ DiskLoc next = getNextRecord ( dl );
134200 Record* nextRecord = recordFor ( next );
135201 getDur ().writingInt ( nextRecord->prevOfs () ) = todelete->prevOfs ();
136202 }
137203 }
138204
139205 /* remove ourself from extent pointers */
140206 {
141- Extent *e = getDur ().writing ( _extentManager-> extentFor ( dl ) );
207+ Extent *e = getDur ().writing ( _getExtent ( _getExtentLocForRecord ( dl ) ) );
142208 if ( e->firstRecord == dl ) {
143209 if ( todelete->nextOfs () == DiskLoc::NullOfs )
144210 e->firstRecord .Null ();
@@ -179,7 +245,7 @@ namespace mongo {
179245
180246 void RecordStoreV1Base::_addRecordToRecListInExtent (Record *r, DiskLoc loc) {
181247 dassert ( recordFor (loc) == r );
182- Extent *e = _extentManager-> extentFor ( loc );
248+ Extent *e = _getExtent ( _getExtentLocForRecord ( loc ) );
183249 if ( e->lastRecord .isNull () ) {
184250 Extent::FL *fl = getDur ().writing (e->fl ());
185251 fl->firstRecord = fl->lastRecord = loc;
0 commit comments