1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-28 01:58:17 +03:00

Add an optimization to pthread aio writes to also do fsync if requested.

Should help by ensuring complete writes done in sub-thread, not in
the main thread.
This commit is contained in:
Jeremy Allison 2012-07-12 10:57:47 -07:00
parent 622eb59eb4
commit cb405947ca
3 changed files with 25 additions and 0 deletions

View File

@ -40,6 +40,7 @@ struct aio_private_data {
int ret_errno;
bool cancelled;
bool write_command;
bool flush_write;
};
/* List of outstanding requests we have. */
@ -115,6 +116,14 @@ static void aio_worker(void *private_data)
(const void *)pd->aiocb->aio_buf,
pd->aiocb->aio_nbytes);
}
if (pd->ret_size != -1 && pd->flush_write) {
/*
* Optimization - flush if requested.
* Ignore error as upper layer will
* also do this.
*/
(void)fsync(pd->aiocb->aio_fildes);
}
} else {
pd->ret_size = sys_pread(pd->aiocb->aio_fildes,
(void *)pd->aiocb->aio_buf,
@ -229,6 +238,12 @@ static int aio_pthread_write(struct vfs_handle_struct *handle,
}
pd->write_command = true;
if (lp_strict_sync(SNUM(fsp->conn)) &&
(lp_syncalways(SNUM(fsp->conn)) ||
aio_write_through_requested(aio_ex))) {
pd->flush_write = true;
}
ret = pthreadpool_add_job(pool, pd->jobid, aio_worker, (void *)pd);
if (ret) {

View File

@ -52,6 +52,15 @@ struct aio_extra {
int (*handle_completion)(struct aio_extra *ex, int errcode);
};
/****************************************************************************
Accessor function to return write_through state.
*****************************************************************************/
bool aio_write_through_requested(struct aio_extra *aio_ex)
{
return aio_ex->write_through;
}
/****************************************************************************
Initialize the signal handler for aio read/write.
*****************************************************************************/

View File

@ -64,6 +64,7 @@ void srv_set_signing(struct smbd_server_connection *conn,
/* The following definitions come from smbd/aio.c */
bool aio_write_through_requested(struct aio_extra *aio_ex);
bool initialize_async_io_handler(void);
NTSTATUS schedule_aio_read_and_X(connection_struct *conn,
struct smb_request *req,