diff options
-rw-r--r-- | db/btree.cpp | 20 | ||||
-rw-r--r-- | db/btree.h | 5 | ||||
-rw-r--r-- | db/db.h | 3 | ||||
-rw-r--r-- | db/dbcommands.cpp | 1 | ||||
-rw-r--r-- | db/diskloc.h | 10 | ||||
-rw-r--r-- | db/namespace.cpp | 3 | ||||
-rw-r--r-- | db/pdfile.cpp | 19 | ||||
-rw-r--r-- | db/pdfile.h | 14 | ||||
-rw-r--r-- | dbtests/btreetests.cpp | 5 | ||||
-rw-r--r-- | dbtests/pdfiletests.cpp | 38 |
10 files changed, 59 insertions, 59 deletions
diff --git a/db/btree.cpp b/db/btree.cpp index 43b155aa16d..86982c7468b 100644 --- a/db/btree.cpp +++ b/db/btree.cpp @@ -37,6 +37,10 @@ namespace mongo { return dur::writing(b); } + _KeyNode& _KeyNode::writing() { + return *dur::writing(this); + } + KeyNode::KeyNode(const BucketBasics& bb, const _KeyNode &k) : prevChildBucket(k.prevChildBucket), recordLoc(k.recordLoc), key(bb.data+k.keyDataOfs()) @@ -773,7 +777,7 @@ found: p->pushBack(splitkey.recordLoc, splitkey.key, order, thisLoc); p->nextChild = rLoc; p->assertValid( order ); - parent = idx.head = L; + parent = idx.head.writing() = L; if ( split_debug ) out() << " we were root, making new root:" << hex << parent.getOfs() << dec << endl; rLoc.btreemod()->parent = parent; @@ -1071,17 +1075,17 @@ found: log(4) << "btree _insert: reusing unused key" << endl; massert( 10285 , "_insert: reuse key but lchild is not null", lChild.isNull()); massert( 10286 , "_insert: reuse key but rchild is not null", rChild.isNull()); - kn.setUsed(); + kn.writing().setUsed(); return 0; } DEV { - out() << "_insert(): key already exists in index (ok for background:true)\n"; - out() << " " << idx.indexNamespace().c_str() << " thisLoc:" << thisLoc.toString() << '\n'; - out() << " " << key.toString() << '\n'; - out() << " " << "recordLoc:" << recordLoc.toString() << " pos:" << pos << endl; - out() << " old l r: " << childForPos(pos).toString() << ' ' << childForPos(pos+1).toString() << endl; - out() << " new l r: " << lChild.toString() << ' ' << rChild.toString() << endl; + log() << "_insert(): key already exists in index (ok for background:true)\n"; + log() << " " << idx.indexNamespace().c_str() << " thisLoc:" << thisLoc.toString() << '\n'; + log() << " " << key.toString() << '\n'; + log() << " " << "recordLoc:" << recordLoc.toString() << " pos:" << pos << endl; + log() << " old l r: " << childForPos(pos).toString() << ' ' << childForPos(pos+1).toString() << endl; + log() << " new l r: " << lChild.toString() << ' ' << rChild.toString() << endl; } alreadyInIndex(); } diff --git a/db/btree.h b/db/btree.h index 63b1b1aa148..689e62a2ec2 100644 --- a/db/btree.h +++ b/db/btree.h @@ -27,6 +27,7 @@ namespace mongo { #pragma pack(1) struct _KeyNode { + _KeyNode& writing(); DiskLoc prevChildBucket; // the lchild DiskLoc recordLoc; // location of the record associated with the key short keyDataOfs() const { @@ -41,9 +42,7 @@ namespace mongo { _kdo = s; assert(s>=0); } - void setUsed() { - recordLoc.GETOFS() &= ~1; - } + void setUsed() { recordLoc.GETOFS() &= ~1; } void setUnused() { /* Setting ofs to odd is the sentinel for unused, as real recordLoc's are always even numbers. @@ -48,8 +48,7 @@ namespace mongo { typedef map<string,Database*> DBs; typedef map<string,DBs> Paths; - DatabaseHolder() : _size(0){ - } + DatabaseHolder() : _size(0) { } bool isLoaded( const string& ns , const string& path ) const { dbMutex.assertAtLeastReadLocked(); diff --git a/db/dbcommands.cpp b/db/dbcommands.cpp index 28f0ebb6705..e80802a8f52 100644 --- a/db/dbcommands.cpp +++ b/db/dbcommands.cpp @@ -501,6 +501,7 @@ namespace mongo { BackgroundOperation::assertNoBgOpInProgForNs(ns); + d = dur::writing(d); d->aboutToDeleteAnIndex(); /* there may be pointers pointing at keys in the btree(s). kill them. */ diff --git a/db/diskloc.h b/db/diskloc.h index 0f675c25d90..55a6c677026 100644 --- a/db/diskloc.h +++ b/db/diskloc.h @@ -71,9 +71,7 @@ namespace mongo { _a = -2; ofs = 0; } - bool isValid() const { - return _a != -2; - } + bool isValid() const { return _a != -2; } string toString() const { if ( isNull() ) @@ -83,11 +81,9 @@ namespace mongo { return ss.str(); } - BSONObj toBSONObj() const { - return BSON( "file" << _a << "offset" << ofs ); - } + BSONObj toBSONObj() const { return BSON( "file" << _a << "offset" << ofs ); } - int a() const { return _a; } + int a() const { return _a; } int& GETOFS() { return ofs; } int getOfs() const { return ofs; } diff --git a/db/namespace.cpp b/db/namespace.cpp index 0e183680fea..c6130f5ca99 100644 --- a/db/namespace.cpp +++ b/db/namespace.cpp @@ -448,7 +448,10 @@ namespace mongo { /* you MUST call when adding an index. see pdfile.cpp */ IndexDetails& NamespaceDetails::addIndex(const char *thisns, bool resetTransient) { +#if !defined(_DEBUG) || !defined(_DURABLE) + // in debug durable mode the write view could be "this" not the nsdetails returned view... assert( nsdetails(thisns) == this ); +#endif IndexDetails *id; try { diff --git a/db/pdfile.cpp b/db/pdfile.cpp index 8e75ce41925..848ae4e38d4 100644 --- a/db/pdfile.cpp +++ b/db/pdfile.cpp @@ -492,13 +492,13 @@ namespace mongo { Extent *e = best; // remove from the free list if( !e->xprev.isNull() ) - e->xprev.ext()->xnext = e->xnext; + e->xprev.ext()->xnext.writing() = e->xnext; if( !e->xnext.isNull() ) - e->xnext.ext()->xprev = e->xprev; + e->xnext.ext()->xprev.writing() = e->xprev; if( f->firstExtent == e->myLoc ) - f->firstExtent = e->xnext; + f->firstExtent.writing() = e->xnext; if( f->lastExtent == e->myLoc ) - f->lastExtent = e->xprev; + f->lastExtent.writing() = e->xprev; // use it OCCASIONALLY if( n > 512 ) log() << "warning: newExtent " << n << " scanned\n"; @@ -515,7 +515,9 @@ namespace mongo { /*---------------------------------------------------------------------*/ DiskLoc Extent::reuse(const char *nsname) { - /*TODOMMF - work to do when extent is freed. */ + return dur::writing(this)->_reuse(nsname); + } + DiskLoc Extent::_reuse(const char *nsname) { log(3) << "reset extent was:" << nsDiagnostic.toString() << " now:" << nsname << '\n'; massert( 10360 , "Extent::reset bad magic value", magic == 0x41424344 ); xnext.Null(); @@ -528,12 +530,9 @@ namespace mongo { emptyLoc.inc( (int) (_extentData-(char*)this) ); int delRecLength = length - (_extentData - (char *) this); - //DeletedRecord *empty1 = (DeletedRecord *) extentData; - DeletedRecord *empty = DataFileMgr::makeDeletedRecord(emptyLoc, delRecLength);//(DeletedRecord *) getRecord(emptyLoc); - //assert( empty == empty1 ); - - // do we want to zero the record? memset(empty, ...) + DeletedRecord *empty = DataFileMgr::makeDeletedRecord(emptyLoc, delRecLength);//(DeletedRecord *) getRecord(emptyLoc); + empty = dur::writing(empty); empty->lengthWithHeaders = delRecLength; empty->extentOfs = myLoc.getOfs(); empty->nextDeleted.Null(); diff --git a/db/pdfile.h b/db/pdfile.h index 1d4001658b8..78af6711e0e 100644 --- a/db/pdfile.h +++ b/db/pdfile.h @@ -236,9 +236,7 @@ namespace mongo { /* like init(), but for a reuse case */ DiskLoc reuse(const char *nsname); - void assertOk() { - assert(magic == 0x41424344); - } + void assertOk() { assert(magic == 0x41424344); } Record* newRecord(int len); @@ -250,14 +248,12 @@ namespace mongo { return (Record *) (((char *) this) + x); } - Extent* getNextExtent() { - return xnext.isNull() ? 0 : DataFileMgr::getExtent(xnext); - } - Extent* getPrevExtent() { - return xprev.isNull() ? 0 : DataFileMgr::getExtent(xprev); - } + Extent* getNextExtent() { return xnext.isNull() ? 0 : DataFileMgr::getExtent(xnext); } + Extent* getPrevExtent() { return xprev.isNull() ? 0 : DataFileMgr::getExtent(xprev); } static int maxSize(); + private: + DiskLoc _reuse(const char *nsname); }; /* diff --git a/dbtests/btreetests.cpp b/dbtests/btreetests.cpp index a90a0975c88..398e852289b 100644 --- a/dbtests/btreetests.cpp +++ b/dbtests/btreetests.cpp @@ -360,8 +360,9 @@ namespace BtreeTests { c->advance(); } // too much work to try to make this happen through inserts and deletes - const_cast< DiskLoc& >( bt()->keyNode( 1 ).prevChildBucket ) = DiskLoc(); - const_cast< DiskLoc& >( bt()->keyNode( 1 ).recordLoc ).GETOFS() |= 1; // make unused + // we are intentionally manipulating the btree bucket directly here + dur::writingDiskLoc( const_cast< DiskLoc& >( bt()->keyNode( 1 ).prevChildBucket ) ) = DiskLoc(); + dur::writingInt( const_cast< DiskLoc& >( bt()->keyNode( 1 ).recordLoc ).GETOFS() ) |= 1; // make unused BSONObj k = BSON( "a" << toInsert ); Base::insert( k ); } diff --git a/dbtests/pdfiletests.cpp b/dbtests/pdfiletests.cpp index 7e92783d9e8..f6ab33fdb61 100644 --- a/dbtests/pdfiletests.cpp +++ b/dbtests/pdfiletests.cpp @@ -71,6 +71,7 @@ namespace PdfileTests { BSONObj o = b.done(); int len = o.objsize(); Extent *e = ext.ext(); + e = dur::writing(e); int ofs; if ( e->lastRecord.isNull() ) ofs = ext.getOfs() + ( e->_extentData - (char *)e ); @@ -78,6 +79,7 @@ namespace PdfileTests { ofs = e->lastRecord.getOfs() + e->lastRecord.rec()->lengthWithHeaders; DiskLoc dl( ext.a(), ofs ); Record *r = dl.rec(); + r = dur::writing(r); r->lengthWithHeaders = Record::HeaderSize + len; r->extentOfs = e->myLoc.getOfs(); r->nextOfs = DiskLoc::NullOfs; @@ -86,7 +88,7 @@ namespace PdfileTests { if ( e->firstRecord.isNull() ) e->firstRecord = dl; else - e->lastRecord.rec()->nextOfs = ofs; + dur::writingInt(e->lastRecord.rec()->nextOfs) = ofs; e->lastRecord = dl; return dl; } @@ -110,7 +112,7 @@ namespace PdfileTests { class EmptyLooped : public Base { virtual void prepare() { - nsd()->capFirstNewRecord = DiskLoc(); + dur::writing(nsd())->capFirstNewRecord = DiskLoc(); } virtual int count() const { return 0; @@ -119,7 +121,7 @@ namespace PdfileTests { class EmptyMultiExtentLooped : public Base { virtual void prepare() { - nsd()->capFirstNewRecord = DiskLoc(); + dur::writing( nsd() ) ->capFirstNewRecord = DiskLoc(); } virtual int count() const { return 0; @@ -131,7 +133,7 @@ namespace PdfileTests { class Single : public Base { virtual void prepare() { - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 0 ); + dur::writing( nsd() )->capFirstNewRecord = insert( nsd()->capExtent, 0 ); } virtual int count() const { return 1; @@ -140,7 +142,7 @@ namespace PdfileTests { class NewCapFirst : public Base { virtual void prepare() { - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 0 ); + dur::writing( nsd() )->capFirstNewRecord = insert( nsd()->capExtent, 0 ); insert( nsd()->capExtent, 1 ); } virtual int count() const { @@ -151,7 +153,7 @@ namespace PdfileTests { class NewCapLast : public Base { virtual void prepare() { insert( nsd()->capExtent, 0 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 1 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 1 ); } virtual int count() const { return 2; @@ -161,7 +163,7 @@ namespace PdfileTests { class NewCapMiddle : public Base { virtual void prepare() { insert( nsd()->capExtent, 0 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 1 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 1 ); insert( nsd()->capExtent, 2 ); } virtual int count() const { @@ -173,7 +175,7 @@ namespace PdfileTests { virtual void prepare() { insert( nsd()->capExtent, 0 ); insert( nsd()->lastExtent, 1 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 2 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 2 ); insert( nsd()->capExtent, 3 ); } virtual int count() const { @@ -186,10 +188,10 @@ namespace PdfileTests { class LastExtent : public Base { virtual void prepare() { - nsd()->capExtent = nsd()->lastExtent; + nsd()->capExtent.writing() = nsd()->lastExtent; insert( nsd()->capExtent, 0 ); insert( nsd()->firstExtent, 1 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 2 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 2 ); insert( nsd()->capExtent, 3 ); } virtual int count() const { @@ -202,11 +204,11 @@ namespace PdfileTests { class MidExtent : public Base { virtual void prepare() { - nsd()->capExtent = nsd()->firstExtent.ext()->xnext; + nsd()->capExtent.writing() = nsd()->firstExtent.ext()->xnext; insert( nsd()->capExtent, 0 ); insert( nsd()->lastExtent, 1 ); insert( nsd()->firstExtent, 2 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 3 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 3 ); insert( nsd()->capExtent, 4 ); } virtual int count() const { @@ -219,10 +221,10 @@ namespace PdfileTests { class AloneInExtent : public Base { virtual void prepare() { - nsd()->capExtent = nsd()->firstExtent.ext()->xnext; + nsd()->capExtent.writing() = nsd()->firstExtent.ext()->xnext; insert( nsd()->lastExtent, 0 ); insert( nsd()->firstExtent, 1 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 2 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 2 ); } virtual int count() const { return 3; @@ -234,10 +236,10 @@ namespace PdfileTests { class FirstInExtent : public Base { virtual void prepare() { - nsd()->capExtent = nsd()->firstExtent.ext()->xnext; + nsd()->capExtent.writing() = nsd()->firstExtent.ext()->xnext; insert( nsd()->lastExtent, 0 ); insert( nsd()->firstExtent, 1 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 2 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 2 ); insert( nsd()->capExtent, 3 ); } virtual int count() const { @@ -250,11 +252,11 @@ namespace PdfileTests { class LastInExtent : public Base { virtual void prepare() { - nsd()->capExtent = nsd()->firstExtent.ext()->xnext; + nsd()->capExtent.writing() = nsd()->firstExtent.ext()->xnext; insert( nsd()->capExtent, 0 ); insert( nsd()->lastExtent, 1 ); insert( nsd()->firstExtent, 2 ); - nsd()->capFirstNewRecord = insert( nsd()->capExtent, 3 ); + nsd()->capFirstNewRecord.writing() = insert( nsd()->capExtent, 3 ); } virtual int count() const { return 4; |