mirror of
https://github.com/matrix-construct/construct
synced 2024-09-27 11:18:51 +02:00
ircd::fs::aio: Add debug mechanism to warn read will block io_submit(2).
This commit is contained in:
parent
0c7dcf6cc7
commit
04020da7e4
2 changed files with 41 additions and 2 deletions
|
@ -197,12 +197,46 @@ ircd::fs::aio::read(const fd &fd,
|
||||||
const scope_count cur_reads{stats.cur_reads};
|
const scope_count cur_reads{stats.cur_reads};
|
||||||
stats.max_reads = std::max(stats.max_reads, stats.cur_reads);
|
stats.max_reads = std::max(stats.max_reads, stats.cur_reads);
|
||||||
|
|
||||||
// Make request; blocks ircd::ctx until completed or throw.
|
#if defined(RB_DEBUG_FS_AIO_READ_BLOCKING)
|
||||||
const size_t bytes
|
request.aio_rw_flags |= support_nowait? RWF_NOWAIT : 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t bytes
|
||||||
{
|
{
|
||||||
request()
|
request()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(RB_DEBUG_FS_AIO_READ_BLOCKING)
|
||||||
|
const bool would_block
|
||||||
|
{
|
||||||
|
opts.blocking &&
|
||||||
|
request.aio_rw_flags & RWF_NOWAIT &&
|
||||||
|
request.retval == -1 &&
|
||||||
|
request.errcode == EAGAIN
|
||||||
|
};
|
||||||
|
|
||||||
|
if(would_block)
|
||||||
|
{
|
||||||
|
log::dwarning
|
||||||
|
{
|
||||||
|
log, "read blocks io_submit(): fd:%d size:%zu off:%zd op:%u pri:%u in_flight:%zu qcount:%zu",
|
||||||
|
request.aio_fildes,
|
||||||
|
request.aio_nbytes,
|
||||||
|
request.aio_offset,
|
||||||
|
request.aio_lio_opcode,
|
||||||
|
request.aio_reqprio,
|
||||||
|
system->in_flight,
|
||||||
|
system->qcount,
|
||||||
|
};
|
||||||
|
|
||||||
|
assert(bytes == 0);
|
||||||
|
request.aio_rw_flags &= ~RWF_NOWAIT;
|
||||||
|
request.retval = -2;
|
||||||
|
request.errcode = 0;
|
||||||
|
bytes = request();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
stats.bytes_read += bytes;
|
stats.bytes_read += bytes;
|
||||||
stats.reads++;
|
stats.reads++;
|
||||||
return bytes;
|
return bytes;
|
||||||
|
|
|
@ -12,6 +12,11 @@
|
||||||
#define HAVE_FS_AIO_H
|
#define HAVE_FS_AIO_H
|
||||||
#include <linux/aio_abi.h>
|
#include <linux/aio_abi.h>
|
||||||
|
|
||||||
|
/// Define this to try all read requests with RWF_NOWAIT first and indicate
|
||||||
|
/// EAGAIN failure with a log dwarning. On EAGAIN the request is resubmitted
|
||||||
|
/// without RWF_NOWAIT if the user expected blocking behavior.
|
||||||
|
//#define RB_DEBUG_FS_AIO_READ_BLOCKING
|
||||||
|
|
||||||
namespace ircd::fs::aio
|
namespace ircd::fs::aio
|
||||||
{
|
{
|
||||||
struct system;
|
struct system;
|
||||||
|
|
Loading…
Reference in a new issue