summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/btree.cpp20
-rw-r--r--db/btree.h5
-rw-r--r--db/db.h3
-rw-r--r--db/dbcommands.cpp1
-rw-r--r--db/diskloc.h10
-rw-r--r--db/namespace.cpp3
-rw-r--r--db/pdfile.cpp19
-rw-r--r--db/pdfile.h14
-rw-r--r--dbtests/btreetests.cpp5
-rw-r--r--dbtests/pdfiletests.cpp38
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.
diff --git a/db/db.h b/db/db.h
index 0129f512c19..fa9238a44d1 100644
--- a/db/db.h
+++ b/db/db.h
@@ -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;