/** basic write ops / write intents. note there is no particular order to these : if we have two writes to the same location during the group commit interval, it is likely (although not assured) that it is journaled here once. */ static void prepBasicWrites(AlignedBuilder& bb) { scoped_lock lk(privateViews._mutex()); // each time events switch to a different database we journal a JDbContext // switches will be rare as we sort by memory location first and we batch commit. RelativePath lastDbPath; assertNothingSpooled(); const vector<WriteIntent>& _intents = commitJob.getIntentsSorted(); assert( !_intents.empty() ); WriteIntent last; for( vector<WriteIntent>::const_iterator i = _intents.begin(); i != _intents.end(); i++ ) { if( i->start() < last.end() ) { // overlaps last.absorb(*i); } else { // discontinuous if( i != _intents.begin() ) prepBasicWrite_inlock(bb, &last, lastDbPath); last = *i; } } prepBasicWrite_inlock(bb, &last, lastDbPath); }
/** basic write ops / write intents. note there is no particular order to these : if we have two writes to the same location during the group commit interval, it is likely (although not assured) that it is journaled here once. */ static void prepBasicWrites(AlignedBuilder& bb, const std::vector<WriteIntent>& intents) { stdx::lock_guard<stdx::mutex> lk(privateViews._mutex()); // Each time write intents switch to a different database we journal a JDbContext. // Switches will be rare as we sort by memory location first and we batch commit. RelativePath lastDbPath; invariant(!intents.empty()); WriteIntent last; for (std::vector<WriteIntent>::const_iterator i = intents.begin(); i != intents.end(); i++) { if (i->start() < last.end()) { // overlaps last.absorb(*i); } else { // discontinuous if (i != intents.begin()) { prepBasicWrite_inlock(bb, &last, lastDbPath); } last = *i; } } prepBasicWrite_inlock(bb, &last, lastDbPath); }
/** basic write ops / write intents. note there is no particular order to these : if we have two writes to the same location during the group commit interval, it is likely (although not assured) that it is journaled here once. */ static void prepBasicWrites(AlignedBuilder& bb) { scoped_lock lk(privateViews._mutex()); // each time events switch to a different database we journal a JDbContext // switches will be rare as we sort by memory location first and we batch commit. RelativePath lastDbPath; const vector<WriteIntent>& _intents = commitJob.getIntentsSorted(); // right now the durability code assumes there is at least one write intent // this does not have to be true in theory as i could just add or delete a file // callers have to ensure they do at least something for now even though its ugly // until this can be addressed fassert( 17388, !_intents.empty() ); WriteIntent last; for( vector<WriteIntent>::const_iterator i = _intents.begin(); i != _intents.end(); i++ ) { if( i->start() < last.end() ) { // overlaps last.absorb(*i); } else { // discontinuous if( i != _intents.begin() ) prepBasicWrite_inlock(bb, &last, lastDbPath); last = *i; } } prepBasicWrite_inlock(bb, &last, lastDbPath); }
void WriteIntent::absorb(const WriteIntent& other) { dassert(overlaps(other)); void* newStart = min(start(), other.start()); p = max(p, other.p); len = (char*)p - (char*)newStart; dassert(contains(other)); }