Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Narrow journal aio_lock locking scope in write_aio_bl #5670

Merged
merged 2 commits into from Dec 4, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 14 additions & 3 deletions src/os/FileJournal.cc
Expand Up @@ -1417,7 +1417,6 @@ void FileJournal::do_aio_write(bufferlist& bl)
*/
int FileJournal::write_aio_bl(off64_t& pos, bufferlist& bl, uint64_t seq)
{
Mutex::Locker locker(aio_lock);
align_bl(pos, bl);

dout(20) << "write_aio_bl " << pos << "~" << bl.length() << " seq " << seq << dendl;
Expand All @@ -1439,6 +1438,9 @@ int FileJournal::write_aio_bl(off64_t& pos, bufferlist& bl, uint64_t seq)
bufferlist tbl;
bl.splice(0, len, &tbl); // move bytes from bl -> tbl

// lock only aio_queue, current aio, aio_num, aio_bytes, which may be
// modified in check_aio_completion
aio_lock.Lock();
aio_queue.push_back(aio_info(tbl, pos, bl.length() > 0 ? 0 : seq));
aio_info& aio = aio_queue.back();
aio.iov = iov;
Expand All @@ -1450,13 +1452,20 @@ int FileJournal::write_aio_bl(off64_t& pos, bufferlist& bl, uint64_t seq)

aio_num++;
aio_bytes += aio.len;

// need to save current aio len to update write_pos later because current
// aio could be ereased from aio_queue once it is done
uint64_t cur_len = aio.len;
// unlock aio_lock because following io_submit might take time to return
aio_lock.Unlock();

iocb *piocb = &aio.iocb;
int attempts = 10;
do {
int r = io_submit(aio_ctx, 1, &piocb);
dout(20) << "write_aio_bl io_submit return value: " << r << dendl;
if (r < 0) {
derr << "io_submit to " << aio.off << "~" << aio.len
derr << "io_submit to " << aio.off << "~" << cur_len
<< " got " << cpp_strerror(r) << dendl;
if (r == -EAGAIN && attempts-- > 0) {
usleep(500);
Expand All @@ -1467,9 +1476,11 @@ int FileJournal::write_aio_bl(off64_t& pos, bufferlist& bl, uint64_t seq)
break;
}
} while (true);
pos += aio.len;
pos += cur_len;
}
aio_lock.Lock();
write_finish_cond.Signal();
aio_lock.Unlock();
return 0;
}
#endif
Expand Down