/** we will build an output buffer ourself and then use O_DIRECT we could be in read lock for this caller handles locking @return partially populated sectheader and _ab set */ static void _PREPLOGBUFFER(JSectHeader& h, AlignedBuilder& bb) { // Add the JSectHeader // Invalidate the total length, we will fill it in later. h.setSectionLen(0xffffffff); h.seqNumber = getLastDataFileFlushTime(); h.fileId = j.curFileId(); // Ops other than basic writes (DurOp's) go first const std::vector<std::shared_ptr<DurOp>>& durOps = commitJob.ops(); for (std::vector<std::shared_ptr<DurOp>>::const_iterator i = durOps.begin(); i != durOps.end(); i++) { (*i)->serialize(bb); } // Write intents const std::vector<WriteIntent>& intents = commitJob.getIntentsSorted(); if (!intents.empty()) { prepBasicWrites(bb, intents); } }
/** we will build an output buffer ourself and then use O_DIRECT we could be in read lock for this caller handles locking */ static void PREPLOGBUFFER() { assert( cmdLine.dur ); AlignedBuilder& bb = commitJob._ab; bb.reset(); unsigned lenOfs; // JSectHeader { bb.appendStr("\nHH\n", false); lenOfs = bb.skip(4); } // ops other than basic writes { for( vector< shared_ptr<DurOp> >::iterator i = commitJob.ops().begin(); i != commitJob.ops().end(); ++i ) { (*i)->serialize(bb); } } // write intents { scoped_lock lk(privateViews._mutex()); string lastFilePath; for( vector<WriteIntent>::iterator i = commitJob.writes().begin(); i != commitJob.writes().end(); i++ ) { size_t ofs; MongoMMF *mmf = privateViews._find(i->p, ofs); if( mmf == 0 ) { string s = str::stream() << "view pointer cannot be resolved " << (size_t) i->p; journalingFailure(s.c_str()); // asserts return; } if( !mmf->willNeedRemap() ) { mmf->willNeedRemap() = true; // usually it will already be dirty so don't bother writing then } //size_t ofs = ((char *)i->p) - ((char*)mmf->getView().p); i->w_ptr = ((char*)mmf->view_write()) + ofs; if( mmf->filePath() != lastFilePath ) { lastFilePath = mmf->filePath(); JDbContext c; bb.appendStruct(c); bb.appendStr(lastFilePath); } JEntry e; e.len = i->len; assert( ofs <= 0x80000000 ); e.ofs = (unsigned) ofs; e.fileNo = mmf->fileSuffixNo(); bb.appendStruct(e); bb.appendBuf(i->p, i->len); } } { JSectFooter f(bb.buf(), bb.len()); bb.appendStruct(f); } { assert( 0xffffe000 == (~(Alignment-1)) ); unsigned L = (bb.len() + Alignment-1) & (~(Alignment-1)); // fill to alignment dassert( L >= (unsigned) bb.len() ); *((unsigned*)bb.atOfs(lenOfs)) = L; unsigned padding = L - bb.len(); bb.skip(padding); dassert( bb.len() % Alignment == 0 ); } return; }