mirror of
https://github.com/matrix-construct/construct
synced 2024-12-27 07:54:05 +01:00
ircd::fs: Add fsync()/fdsync() w/ AIO.
This commit is contained in:
parent
6e0f53c00d
commit
adee757303
5 changed files with 161 additions and 7 deletions
|
@ -86,6 +86,7 @@ enum ircd::fs::index
|
||||||
#include "fd.h"
|
#include "fd.h"
|
||||||
#include "read.h"
|
#include "read.h"
|
||||||
#include "write.h"
|
#include "write.h"
|
||||||
|
#include "fsync.h"
|
||||||
#include "stdin.h"
|
#include "stdin.h"
|
||||||
|
|
||||||
struct ircd::fs::init
|
struct ircd::fs::init
|
||||||
|
|
29
include/ircd/fs/fsync.h
Normal file
29
include/ircd/fs/fsync.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Matrix Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#define HAVE_IRCD_FS_FSYNC_H
|
||||||
|
|
||||||
|
namespace ircd::fs
|
||||||
|
{
|
||||||
|
struct fsync_opts extern const fsync_opts_default;
|
||||||
|
|
||||||
|
void fdsync(const fd &, const fsync_opts & = fsync_opts_default);
|
||||||
|
void fsync(const fd &, const fsync_opts & = fsync_opts_default);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Options for a write operation
|
||||||
|
struct ircd::fs::fsync_opts
|
||||||
|
{
|
||||||
|
fsync_opts() = default;
|
||||||
|
|
||||||
|
/// Request priority (this option may be improved, avoid for now)
|
||||||
|
int16_t priority {0};
|
||||||
|
};
|
58
ircd/aio.cc
58
ircd/aio.cc
|
@ -12,6 +12,62 @@
|
||||||
#include <sys/eventfd.h>
|
#include <sys/eventfd.h>
|
||||||
#include "aio.h"
|
#include "aio.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// request::fsync
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::fs::aio::request::fsync::fsync(const int &fd,
|
||||||
|
const fsync_opts &opts)
|
||||||
|
:request{fd}
|
||||||
|
{
|
||||||
|
aio_reqprio = opts.priority;
|
||||||
|
aio_lio_opcode = IOCB_CMD_FSYNC;
|
||||||
|
|
||||||
|
aio_buf = 0;
|
||||||
|
aio_nbytes = 0;
|
||||||
|
aio_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::fs::fsync__aio(const fd &fd,
|
||||||
|
const fsync_opts &opts)
|
||||||
|
{
|
||||||
|
aio::request::fsync request
|
||||||
|
{
|
||||||
|
fd, opts
|
||||||
|
};
|
||||||
|
|
||||||
|
request();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// request::fdsync
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::fs::aio::request::fdsync::fdsync(const int &fd,
|
||||||
|
const fsync_opts &opts)
|
||||||
|
:request{fd}
|
||||||
|
{
|
||||||
|
aio_reqprio = opts.priority;
|
||||||
|
aio_lio_opcode = IOCB_CMD_FDSYNC;
|
||||||
|
|
||||||
|
aio_buf = 0;
|
||||||
|
aio_nbytes = 0;
|
||||||
|
aio_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::fs::fdsync__aio(const fd &fd,
|
||||||
|
const fsync_opts &opts)
|
||||||
|
{
|
||||||
|
aio::request::fdsync request
|
||||||
|
{
|
||||||
|
fd, opts
|
||||||
|
};
|
||||||
|
|
||||||
|
request();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// request::read
|
// request::read
|
||||||
//
|
//
|
||||||
|
@ -212,7 +268,7 @@ noexcept try
|
||||||
|
|
||||||
// The count should be at least 1 event. The only reason to return 0 might
|
// The count should be at least 1 event. The only reason to return 0 might
|
||||||
// be related to an INTR; this assert will find out and may be commented.
|
// be related to an INTR; this assert will find out and may be commented.
|
||||||
assert(count > 0);
|
//assert(count > 0);
|
||||||
|
|
||||||
for(ssize_t i(0); i < count; ++i)
|
for(ssize_t i(0); i < count; ++i)
|
||||||
handle_event(event[i]);
|
handle_event(event[i]);
|
||||||
|
|
22
ircd/aio.h
22
ircd/aio.h
|
@ -21,7 +21,7 @@ struct ircd::fs::aio
|
||||||
struct request;
|
struct request;
|
||||||
|
|
||||||
/// Maximum number of events we can submit to kernel
|
/// Maximum number of events we can submit to kernel
|
||||||
static constexpr const size_t &MAX_EVENTS {64};
|
static constexpr const size_t &MAX_EVENTS {512};
|
||||||
|
|
||||||
/// Internal semaphore for synchronization of this object
|
/// Internal semaphore for synchronization of this object
|
||||||
ctx::dock dock;
|
ctx::dock dock;
|
||||||
|
@ -46,7 +46,7 @@ struct ircd::fs::aio
|
||||||
void handle(const boost::system::error_code &, const size_t) noexcept;
|
void handle(const boost::system::error_code &, const size_t) noexcept;
|
||||||
void set_handle();
|
void set_handle();
|
||||||
|
|
||||||
bool wait_interrupt();
|
bool wait();
|
||||||
bool interrupt();
|
bool interrupt();
|
||||||
|
|
||||||
aio();
|
aio();
|
||||||
|
@ -59,6 +59,8 @@ struct ircd::fs::aio::request
|
||||||
{
|
{
|
||||||
struct read;
|
struct read;
|
||||||
struct write;
|
struct write;
|
||||||
|
struct fdsync;
|
||||||
|
struct fsync;
|
||||||
|
|
||||||
ssize_t retval {std::numeric_limits<ssize_t>::min()};
|
ssize_t retval {std::numeric_limits<ssize_t>::min()};
|
||||||
ssize_t errcode {0};
|
ssize_t errcode {0};
|
||||||
|
@ -76,6 +78,8 @@ namespace ircd::fs
|
||||||
{
|
{
|
||||||
const_buffer write__aio(const fd &, const const_buffer &, const write_opts &);
|
const_buffer write__aio(const fd &, const const_buffer &, const write_opts &);
|
||||||
const_buffer read__aio(const fd &, const mutable_buffer &, const read_opts &);
|
const_buffer read__aio(const fd &, const mutable_buffer &, const read_opts &);
|
||||||
|
void fdsync__aio(const fd &, const fsync_opts &);
|
||||||
|
void fsync__aio(const fd &, const fsync_opts &);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Read request control block
|
/// Read request control block
|
||||||
|
@ -91,3 +95,17 @@ struct ircd::fs::aio::request::write
|
||||||
{
|
{
|
||||||
write(const int &fd, const const_buffer &, const write_opts &);
|
write(const int &fd, const const_buffer &, const write_opts &);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// fdsync request control block
|
||||||
|
struct ircd::fs::aio::request::fdsync
|
||||||
|
:request
|
||||||
|
{
|
||||||
|
fdsync(const int &fd, const fsync_opts &);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// fsync request control block
|
||||||
|
struct ircd::fs::aio::request::fsync
|
||||||
|
:request
|
||||||
|
{
|
||||||
|
fsync(const int &fd, const fsync_opts &);
|
||||||
|
};
|
||||||
|
|
58
ircd/fs.cc
58
ircd/fs.cc
|
@ -163,6 +163,60 @@ ircd::fs::stdin::tty::write(const string_view &buf)
|
||||||
return syscall(::write, int(*this), buf.data(), buf.size());
|
return syscall(::write, int(*this), buf.data(), buf.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// fs/fsync.h
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::fs::fsync_opts
|
||||||
|
const ircd::fs::fsync_opts_default
|
||||||
|
{};
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::fs::fsync(const fd &fd,
|
||||||
|
const fsync_opts &opts)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
#ifdef IRCD_USE_AIO
|
||||||
|
if(likely(aioctx))
|
||||||
|
return fsync__aio(fd, opts);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
syscall(::fsync, fd);
|
||||||
|
}
|
||||||
|
catch(const std::exception &e)
|
||||||
|
{
|
||||||
|
throw filesystem_error
|
||||||
|
{
|
||||||
|
"%s", e.what()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ircd::fs::fdsync(const fd &fd,
|
||||||
|
const fsync_opts &opts)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
#ifdef IRCD_USE_AIO
|
||||||
|
if(likely(aioctx))
|
||||||
|
return fdsync__aio(fd, opts);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
syscall(::fdatasync, fd);
|
||||||
|
}
|
||||||
|
catch(const std::exception &e)
|
||||||
|
{
|
||||||
|
throw filesystem_error
|
||||||
|
{
|
||||||
|
"%s", e.what()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// fs/prefetch.h
|
||||||
|
//
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// fs/read.h
|
// fs/read.h
|
||||||
|
@ -172,10 +226,6 @@ ircd::fs::read_opts
|
||||||
const ircd::fs::read_opts_default
|
const ircd::fs::read_opts_default
|
||||||
{};
|
{};
|
||||||
|
|
||||||
//
|
|
||||||
// ircd::fs interface linkage
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
void
|
void
|
||||||
ircd::fs::prefetch(const fd &fd,
|
ircd::fs::prefetch(const fd &fd,
|
||||||
|
|
Loading…
Reference in a new issue