From 597d4eb142d847047db3a8cbc0e295e102b127e6 Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Fri, 16 Jul 2021 10:11:39 -0700 Subject: [PATCH 1/9] fd_sync_io_uring --- .gitignore | 8 + WORKSPACE | 10 + riegeli/bytes/BUILD | 19 ++ riegeli/bytes/fd_io_uring_writer.cc | 281 +++++++++++++++++ riegeli/bytes/fd_io_uring_writer.h | 416 ++++++++++++++++++++++++++ riegeli/iouring/BUILD | 17 ++ riegeli/iouring/fd_async_io_uring.cc | 0 riegeli/iouring/fd_async_io_uring.h | 0 riegeli/iouring/fd_io_uring.h | 38 +++ riegeli/iouring/fd_io_uring_options.h | 144 +++++++++ riegeli/iouring/fd_sync_io_uring.cc | 130 ++++++++ riegeli/iouring/fd_sync_io_uring.h | 76 +++++ third_party/liburing.BUILD | 38 +++ 13 files changed, 1177 insertions(+) create mode 100644 .gitignore create mode 100644 riegeli/bytes/fd_io_uring_writer.cc create mode 100644 riegeli/bytes/fd_io_uring_writer.h create mode 100644 riegeli/iouring/BUILD create mode 100644 riegeli/iouring/fd_async_io_uring.cc create mode 100644 riegeli/iouring/fd_async_io_uring.h create mode 100644 riegeli/iouring/fd_io_uring.h create mode 100644 riegeli/iouring/fd_io_uring_options.h create mode 100644 riegeli/iouring/fd_sync_io_uring.cc create mode 100644 riegeli/iouring/fd_sync_io_uring.h create mode 100644 third_party/liburing.BUILD diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..96b9adcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.vscode/ +bazel-bin +bazel-out +bazel-riegeli +bazel-testlogs +test/ +.bazelversion +configure.bazelrc \ No newline at end of file diff --git a/WORKSPACE b/WORKSPACE index 3f8f0e98..fffdb8f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -68,6 +68,16 @@ http_archive( ], ) +http_archive( + name = "liburing", + build_file = "//third_party:liburing.BUILD", + sha256 = "ca069ecc4aa1baf1031bd772e4e97f7e26dfb6bb733d79f70159589b22ab4dc0", + strip_prefix = "liburing-liburing-2.0", + urls = [ + "https://github.com/axboe/liburing/archive/refs/tags/liburing-2.0.tar.gz", + ], +) + http_archive( name = "highwayhash", build_file = "//third_party:highwayhash.BUILD", diff --git a/riegeli/bytes/BUILD b/riegeli/bytes/BUILD index 3fae4a58..102fe997 100644 --- a/riegeli/bytes/BUILD +++ b/riegeli/bytes/BUILD @@ -471,6 +471,25 @@ cc_library( ], ) +cc_library( + name = "fd_io_uring_writer", + srcs = [ + "fd_dependency.h", + "fd_io_uring_writer.cc", + ], + hdrs = ["fd_io_uring_writer.h"], + deps = [ + ":buffered_writer", + "//riegeli/base", + "//riegeli/base:status", + "//riegeli/iouring:fd_sync_io_uring", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/status", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/types:optional", + ], +) + cc_library( name = "fd_reader", srcs = [ diff --git a/riegeli/bytes/fd_io_uring_writer.cc b/riegeli/bytes/fd_io_uring_writer.cc new file mode 100644 index 00000000..2d6bbc50 --- /dev/null +++ b/riegeli/bytes/fd_io_uring_writer.cc @@ -0,0 +1,281 @@ +// Make `pwrite()` and `ftruncate()` available. +#if !defined(_XOPEN_SOURCE) || _XOPEN_SOURCE < 500 +#undef _XOPEN_SOURCE +#define _XOPEN_SOURCE 500 +#endif + +// Make `off_t` 64-bit even on 32-bit systems. +#undef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 + +#include "riegeli/bytes/fd_io_uring_writer.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "absl/base/optimization.h" +#include "absl/status/status.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" +#include "riegeli/base/base.h" +#include "riegeli/base/errno_mapping.h" +#include "riegeli/base/status.h" +#include "riegeli/bytes/buffered_writer.h" + +namespace riegeli { + +void FdIoUringWriterBase::Initialize(int dest, absl::optional assumed_pos, + absl::optional independent_pos) { + RIEGELI_ASSERT_GE(dest, 0) + << "Failed precondition of FdIoUringWriter: negative file descriptor"; + SetFilename(dest); + InitializePos(dest, assumed_pos, independent_pos); +} + +inline void FdIoUringWriterBase::SetFilename(int dest) { + if (dest == 1) { + filename_ = "/dev/stdout"; + } else if (dest == 2) { + filename_ = "/dev/stderr"; + } else { + filename_ = absl::StrCat("/proc/self/fd/", dest); + } +} + +int FdIoUringWriterBase::OpenFd(absl::string_view filename, int flags, + mode_t permissions) { + RIEGELI_ASSERT((flags & O_ACCMODE) == O_WRONLY || + (flags & O_ACCMODE) == O_RDWR) + << "Failed precondition of FdIoUringWriter: " + "flags must include either O_WRONLY or O_RDWR"; + // TODO: When `absl::string_view` becomes C++17 `std::string_view`: + // `filename_ = filename` + filename_.assign(filename.data(), filename.size()); +again: + const int dest = open(filename_.c_str(), flags, permissions); + if (ABSL_PREDICT_FALSE(dest < 0)) { + if (errno == EINTR) goto again; + FailOperation("open()"); + return -1; + } + return dest; +} + +inline void FdIoUringWriterBase::InitializePos( + int dest, absl::optional assumed_pos, + absl::optional independent_pos) { + int flags = 0; + if (assumed_pos == absl::nullopt && independent_pos == absl::nullopt) { + // Flags are needed only if `assumed_pos == absl::nullopt` and + // `independent_pos == absl::nullopt`. Avoid `fcntl()` otherwise. + flags = fcntl(dest, F_GETFL); + if (ABSL_PREDICT_FALSE(flags < 0)) { + FailOperation("fcntl()"); + return; + } + } + return InitializePos(dest, flags, assumed_pos, independent_pos); +} + +void FdIoUringWriterBase::InitializePos(int dest, int flags, + absl::optional assumed_pos, + absl::optional independent_pos) { + RIEGELI_ASSERT(assumed_pos == absl::nullopt || + independent_pos == absl::nullopt) + << "Failed precondition of FdIoUringWriterBase: " + "Options::assumed_pos() and Options::independent_pos() are both set"; + RIEGELI_ASSERT(!supports_random_access_) + << "Failed precondition of FdIoUringWriterBase::InitializePos(): " + "supports_random_access_ not reset"; + RIEGELI_ASSERT(!has_independent_pos_) + << "Failed precondition of FdIoUringWriterBase::InitializePos(): " + "has_independent_pos_ not reset"; + if (assumed_pos != absl::nullopt) { + if (ABSL_PREDICT_FALSE(*assumed_pos > + Position{std::numeric_limits::max()})) { + FailOverflow(); + return; + } + set_start_pos(*assumed_pos); + } else if (independent_pos != absl::nullopt) { + supports_random_access_ = true; + has_independent_pos_ = true; + if (ABSL_PREDICT_FALSE(*independent_pos > + Position{std::numeric_limits::max()})) { + FailOverflow(); + return; + } + set_start_pos(*independent_pos); + } else { + const off_t file_pos = + lseek(dest, 0, (flags & O_APPEND) != 0 ? SEEK_END : SEEK_CUR); + if (file_pos < 0) { + if (errno == ESPIPE) { + // Random access is not supported. Assume the current position as 0. + } else { + FailOperation("lseek()"); + } + return; + } + set_start_pos(IntCast(file_pos)); + supports_random_access_ = true; + } +} + +bool FdIoUringWriterBase::FailOperation(absl::string_view operation) { + const int error_number = errno; + RIEGELI_ASSERT_NE(error_number, 0) + << "Failed precondition of FdIoUringWriterBase::FailOperation(): " + "zero errno"; + return Fail( + ErrnoToCanonicalStatus(error_number, absl::StrCat(operation, " failed"))); +} + +void FdIoUringWriterBase::AnnotateFailure(absl::Status& status) { + RIEGELI_ASSERT(!status.ok()) + << "Failed precondition of Object::AnnotateFailure(): status not failed"; + status = Annotate(status, absl::StrCat("writing ", filename_)); + BufferedWriter::AnnotateFailure(status); +} + +bool FdIoUringWriterBase::WriteInternal(absl::string_view src) { + RIEGELI_ASSERT(!src.empty()) + << "Failed precondition of BufferedWriter::WriteInternal(): " + "nothing to write"; + RIEGELI_ASSERT(healthy()) + << "Failed precondition of BufferedWriter::WriteInternal(): " << status(); + const int dest = dest_fd(); + if (ABSL_PREDICT_FALSE(src.size() > + Position{std::numeric_limits::max()} - + start_pos())) { + return FailOverflow(); + } + do { + again: + const ssize_t length_written = + has_independent_pos_ + ? pwrite(dest, src.data(), + UnsignedMin(src.size(), + size_t{std::numeric_limits::max()}), + IntCast(start_pos())) + : write(dest, src.data(), + UnsignedMin(src.size(), + size_t{std::numeric_limits::max()})); + if (ABSL_PREDICT_FALSE(length_written < 0)) { + if (errno == EINTR) goto again; + return FailOperation(has_independent_pos_ ? "pwrite()" : "write()"); + } + RIEGELI_ASSERT_GT(length_written, 0) + << (has_independent_pos_ ? "pwrite()" : "write()") << " returned 0"; + RIEGELI_ASSERT_LE(IntCast(length_written), src.size()) + << (has_independent_pos_ ? "pwrite()" : "write()") + << " wrote more than requested"; + move_start_pos(IntCast(length_written)); + src.remove_prefix(IntCast(length_written)); + } while (!src.empty()); + return true; +} + +bool FdIoUringWriterBase::FlushImpl(FlushType flush_type) { + if (ABSL_PREDICT_FALSE(!BufferedWriter::FlushImpl(flush_type))) return false; + switch (flush_type) { + case FlushType::kFromObject: + case FlushType::kFromProcess: + return true; + case FlushType::kFromMachine: { + const int dest = dest_fd(); + if (ABSL_PREDICT_FALSE(fsync(dest) < 0)) { + return FailOperation("fsync()"); + } + return true; + } + } + RIEGELI_ASSERT_UNREACHABLE() + << "Unknown flush type: " << static_cast(flush_type); +} + +inline bool FdIoUringWriterBase::SeekInternal(int dest, Position new_pos) { + RIEGELI_ASSERT_EQ(buffer_size(), 0u) + << "Failed precondition of FdIoUringWriterBase::SeekInternal(): " + "buffer not empty"; + if (!has_independent_pos_) { + if (ABSL_PREDICT_FALSE(lseek(dest, IntCast(new_pos), SEEK_SET) < + 0)) { + return FailOperation("lseek()"); + } + } + set_start_pos(new_pos); + return true; +} + +bool FdIoUringWriterBase::SeekBehindBuffer(Position new_pos) { + RIEGELI_ASSERT_EQ(buffer_size(), 0u) + << "Failed precondition of BufferedWriter::SeekBehindBuffer(): " + "buffer not empty"; + if (ABSL_PREDICT_FALSE(!healthy())) return false; + const int dest = dest_fd(); + if (new_pos >= start_pos()) { + // Seeking forwards. + struct stat stat_info; + if (ABSL_PREDICT_FALSE(fstat(dest, &stat_info) < 0)) { + return FailOperation("fstat()"); + } + if (ABSL_PREDICT_FALSE(new_pos > IntCast(stat_info.st_size))) { + // File ends. + SeekInternal(dest, IntCast(stat_info.st_size)); + return false; + } + } + return SeekInternal(dest, new_pos); +} + +absl::optional FdIoUringWriterBase::SizeBehindBuffer() { + RIEGELI_ASSERT_EQ(buffer_size(), 0u) + << "Failed precondition of BufferedWriter::SizeBehindBuffer(): " + "buffer not empty"; + if (ABSL_PREDICT_FALSE(!healthy())) return absl::nullopt; + const int dest = dest_fd(); + struct stat stat_info; + if (ABSL_PREDICT_FALSE(fstat(dest, &stat_info) < 0)) { + FailOperation("fstat()"); + return absl::nullopt; + } + return IntCast(stat_info.st_size); +} + +bool FdIoUringWriterBase::TruncateBehindBuffer(Position new_size) { + RIEGELI_ASSERT_EQ(buffer_size(), 0u) + << "Failed precondition of BufferedWriter::TruncateBehindBuffer(): " + "buffer not empty"; + if (ABSL_PREDICT_FALSE(!healthy())) return false; + const int dest = dest_fd(); + if (new_size >= start_pos()) { + // Seeking forwards. + struct stat stat_info; + if (ABSL_PREDICT_FALSE(fstat(dest, &stat_info) < 0)) { + return FailOperation("fstat()"); + } + if (ABSL_PREDICT_FALSE(new_size > IntCast(stat_info.st_size))) { + // File ends. + SeekInternal(dest, IntCast(stat_info.st_size)); + return false; + } + } +again: + if (ABSL_PREDICT_FALSE(ftruncate(dest, IntCast(new_size)) < 0)) { + if (errno == EINTR) goto again; + return FailOperation("ftruncate()"); + } + return SeekInternal(dest, new_size); +} + +} // namespace riegeli diff --git a/riegeli/bytes/fd_io_uring_writer.h b/riegeli/bytes/fd_io_uring_writer.h new file mode 100644 index 00000000..a64ea95c --- /dev/null +++ b/riegeli/bytes/fd_io_uring_writer.h @@ -0,0 +1,416 @@ +#ifndef RIEGELI_BYTES_FD_IO_URING_WRITER_H_ +#define RIEGELI_BYTES_FD_IO_URING_WRITER_H_ + +#include +#include +#include + +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/optimization.h" +#include "absl/status/status.h" +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" +#include "riegeli/base/base.h" +#include "riegeli/base/dependency.h" +#include "riegeli/bytes/buffered_writer.h" +#include "riegeli/bytes/fd_dependency.h" + +#include "riegeli/iouring/fd_sync_io_uring.h" + +namespace riegeli { + +// Template parameter independent part of `FdIoUringWriter`. +class FdIoUringWriterBase : public BufferedWriter { + public: + class Options { + public: + Options() noexcept {} + + // Permissions to use in case a new file is created (9 bits). The effective + // permissions are modified by the process's umask. + // + // Default: `0666`. + Options& set_permissions(mode_t permissions) & { + permissions_ = permissions; + return *this; + } + Options&& set_permissions(mode_t permissions) && { + return std::move(set_permissions(permissions)); + } + mode_t permissions() const { return permissions_; } + + // If `absl::nullopt`, the current position reported by `pos()` corresponds + // to the current fd position if possible, otherwise 0 is assumed as the + // initial position. Random access is supported if the fd supports random + // access. + // + // If not `absl::nullopt`, this position is assumed initially, to be + // reported by `pos()`. It does not need to correspond to the current fd + // position. Random access is not supported. + // + // `assumed_pos()` and `independent_pos()` must not be both set. + // + // Default: `absl::nullopt`. + Options& set_assumed_pos(absl::optional assumed_pos) & { + assumed_pos_ = assumed_pos; + return *this; + } + Options&& set_assumed_pos(absl::optional assumed_pos) && { + return std::move(set_assumed_pos(assumed_pos)); + } + absl::optional assumed_pos() const { return assumed_pos_; } + + // If `absl::nullopt`, `FdIoUringWriter` writes at the current fd position. + // + // If not `absl::nullopt`, `FdIoUringWriter` writes starting from this position, + // without disturbing the current fd position. This is useful for multiple + // writers concurrently writing to disjoint regions of the same file. The fd + // must support `pwrite()`. + // + // `assumed_pos()` and `independent_pos()` must not be both set. + // + // Default: `absl::nullopt`. + Options& set_independent_pos(absl::optional independent_pos) & { + independent_pos_ = independent_pos; + return *this; + } + Options&& set_independent_pos(absl::optional independent_pos) && { + return std::move(set_independent_pos(independent_pos)); + } + absl::optional independent_pos() const { + return independent_pos_; + } + + // Tunes how much data is buffered before writing to the file. + // + // Default: `kDefaultBufferSize` (64K). + Options& set_buffer_size(size_t buffer_size) & { + RIEGELI_ASSERT_GT(buffer_size, 0u) + << "Failed precondition of FdIoUringWriterBase::Options::set_buffer_size(): " + "zero buffer size"; + buffer_size_ = buffer_size; + return *this; + } + Options&& set_buffer_size(size_t buffer_size) && { + return std::move(set_buffer_size(buffer_size)); + } + size_t buffer_size() const { return buffer_size_; } + + private: + mode_t permissions_ = 0666; + absl::optional assumed_pos_; + absl::optional independent_pos_; + size_t buffer_size_ = kDefaultBufferSize; + FdIoUringOptions options; + }; + + // Returns the fd being written to. If the fd is owned then changed to -1 by + // `Close()`, otherwise unchanged. + virtual int dest_fd() const = 0; + + // Returns the original name of the file being written to (or "/dev/stdout", + // "/dev/stderr", or "/proc/self/fd/" if fd was given). Unchanged by + // `Close()`. + const std::string& filename() const { return filename_; } + + bool SupportsRandomAccess() override { return supports_random_access_; } + + protected: + FdIoUringWriterBase() noexcept {} + + explicit FdIoUringWriterBase(size_t buffer_size); + + FdIoUringWriterBase(FdIoUringWriterBase&& that) noexcept; + FdIoUringWriterBase& operator=(FdIoUringWriterBase&& that) noexcept; + + void Reset(); + void Reset(size_t buffer_size); + void Initialize(int dest, absl::optional assumed_pos, + absl::optional independent_pos); + int OpenFd(absl::string_view filename, int flags, mode_t permissions); + void InitializePos(int dest, absl::optional assumed_pos, + absl::optional independent_pos); + void InitializePos(int dest, int flags, absl::optional assumed_pos, + absl::optional independent_pos); + ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation); + + void AnnotateFailure(absl::Status& status) override; + bool WriteInternal(absl::string_view src) override; + bool FlushImpl(FlushType flush_type) override; + bool SeekBehindBuffer(Position new_pos) override; + absl::optional SizeBehindBuffer() override; + bool TruncateBehindBuffer(Position new_size) override; + + private: + void SetFilename(int dest); + bool SeekInternal(int dest, Position new_pos); + + std::string filename_; + bool supports_random_access_ = false; + bool has_independent_pos_ = false; + + // Invariant: `start_pos() <= std::numeric_limits::max()` +}; + +// A `Writer` which writes to a file descriptor. +// +// The fd must support: +// * `fcntl()` - for the constructor from fd, +// if `Options::assumed_pos() == absl::nullopt` +// and `Options::independent_pos() == absl::nullopt` +// * `close()` - if the fd is owned +// * `write()` - if `Options::independent_pos() == absl::nullopt` +// * `pwrite()` - if `Options::independent_pos() != absl::nullopt` +// * `lseek()` - for `Seek()`, `Size()`, or `Truncate()` +// if `Options::independent_pos() == absl::nullopt` +// * `fstat()` - for `Seek()`, `Size()`, or `Truncate()` +// * `fsync()` - for `Flush(FlushType::kFromMachine)` +// * `ftruncate()` - for `Truncate()` +// +// `FdIoUringWriter` supports random access if +// `Options::assumed_pos() == absl::nullopt` and the fd supports random access +// (this is assumed if `Options::independent_pos() != absl::nullopt`, otherwise +// this is checked by calling `lseek()`). +// +// The `Dest` template parameter specifies the type of the object providing and +// possibly owning the fd being written to. `Dest` must support +// `Dependency`, e.g. `OwnedFd` (owned, default), `UnownedFd` +// (not owned). +// +// By relying on CTAD the template argument can be deduced as `OwnedFd` if the +// first constructor argument is a filename or an `int`, otherwise as the value +// type of the first constructor argument. This requires C++17. +// +// Until the `FdIoUringWriter` is closed or no longer used, the fd must not be closed; +// additionally, if `Options::independent_pos() == absl::nullopt`, the fd should +// not have its position changed, except that if random access is not used, +// careful interleaving of multiple writers is possible: `Flush()` is needed +// before switching to another writer, and `pos()` does not take other writers +// into account. +template +class FdIoUringWriter : public FdIoUringWriterBase { + public: + // Creates a closed `FdIoUringWriter`. + FdIoUringWriter() noexcept {} + + // Will write to the fd provided by `dest`. + explicit FdIoUringWriter(const Dest& dest, Options options = Options()); + explicit FdIoUringWriter(Dest&& dest, Options options = Options()); + + // Will write to the fd provided by a `Dest` constructed from elements of + // `dest_args`. This avoids constructing a temporary `Dest` and moving from + // it. + template + explicit FdIoUringWriter(std::tuple dest_args, + Options options = Options()); + + // Opens a file for writing. + // + // `flags` is the second argument of `open()`, typically one of: + // * `O_WRONLY | O_CREAT | O_TRUNC` + // * `O_WRONLY | O_CREAT | O_APPEND` + // + // `flags` must include either `O_WRONLY` or `O_RDWR`. + // + // If opening the file fails, `FdIoUringWriter` will be failed and closed. + explicit FdIoUringWriter(absl::string_view filename, int flags, + Options options = Options()); + + FdIoUringWriter(FdIoUringWriter&& that) noexcept; + FdIoUringWriter& operator=(FdIoUringWriter&& that) noexcept; + + // Makes `*this` equivalent to a newly constructed `FdIoUringWriter`. This avoids + // constructing a temporary `FdIoUringWriter` and moving from it. + void Reset(); + void Reset(const Dest& dest, Options options = Options()); + void Reset(Dest&& dest, Options options = Options()); + template + void Reset(std::tuple dest_args, Options options = Options()); + void Reset(absl::string_view filename, int flags, + Options options = Options()); + + // Returns the object providing and possibly owning the fd being written to. + // If the fd is owned then changed to -1 by `Close()`, otherwise unchanged. + Dest& dest() { return dest_.manager(); } + const Dest& dest() const { return dest_.manager(); } + int dest_fd() const override { return dest_.get(); } + + protected: + using FdIoUringWriterBase::Initialize; + void Initialize(absl::string_view filename, int flags, Options&& options); + + void Done() override; + + private: + // The object providing and possibly owning the fd being written to. + Dependency dest_; +}; + +// Support CTAD. +#if __cpp_deduction_guides +FdIoUringWriter()->FdIoUringWriter>; +template +explicit FdIoUringWriter(const Dest& dest, + FdIoUringWriterBase::Options options = FdIoUringWriterBase::Options()) + -> FdIoUringWriter::value, + OwnedFd, std::decay_t>>; +template +explicit FdIoUringWriter(Dest&& dest, + FdIoUringWriterBase::Options options = FdIoUringWriterBase::Options()) + -> FdIoUringWriter::value, + OwnedFd, std::decay_t>>; +template +explicit FdIoUringWriter(std::tuple dest_args, + FdIoUringWriterBase::Options options = FdIoUringWriterBase::Options()) + -> FdIoUringWriter>>; +explicit FdIoUringWriter(absl::string_view filename, int flags, + FdIoUringWriterBase::Options options = FdIoUringWriterBase::Options()) + ->FdIoUringWriter<>; +#endif + +// Implementation details follow. + +inline FdIoUringWriterBase::FdIoUringWriterBase(size_t buffer_size) + : BufferedWriter(buffer_size) {} + +inline FdIoUringWriterBase::FdIoUringWriterBase(FdIoUringWriterBase&& that) noexcept + : BufferedWriter(std::move(that)), + // Using `that` after it was moved is correct because only the base class + // part was moved. + filename_(std::move(that.filename_)), + supports_random_access_(that.supports_random_access_), + has_independent_pos_(that.has_independent_pos_) {} + +inline FdIoUringWriterBase& FdIoUringWriterBase::operator=(FdIoUringWriterBase&& that) noexcept { + BufferedWriter::operator=(std::move(that)); + // Using `that` after it was moved is correct because only the base class part + // was moved. + filename_ = std::move(that.filename_); + supports_random_access_ = that.supports_random_access_; + has_independent_pos_ = that.has_independent_pos_; + return *this; +} + +inline void FdIoUringWriterBase::Reset() { + BufferedWriter::Reset(); + filename_.clear(); + supports_random_access_ = false; + has_independent_pos_ = false; +} + +inline void FdIoUringWriterBase::Reset(size_t buffer_size) { + BufferedWriter::Reset(buffer_size); + // `filename_` was set by `OpenFd()` or will be set by `Initialize()`. + supports_random_access_ = false; + has_independent_pos_ = false; +} + +template +inline FdIoUringWriter::FdIoUringWriter(const Dest& dest, Options options) + : FdIoUringWriterBase(options.buffer_size()), dest_(dest) { + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); +} + +template +inline FdIoUringWriter::FdIoUringWriter(Dest&& dest, Options options) + : FdIoUringWriterBase(options.buffer_size()), dest_(std::move(dest)) { + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); +} + +template +template +inline FdIoUringWriter::FdIoUringWriter(std::tuple dest_args, + Options options) + : FdIoUringWriterBase(options.buffer_size()), dest_(std::move(dest_args)) { + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); +} + +template +inline FdIoUringWriter::FdIoUringWriter(absl::string_view filename, int flags, + Options options) { + Initialize(filename, flags, std::move(options)); +} + +template +inline FdIoUringWriter::FdIoUringWriter(FdIoUringWriter&& that) noexcept + : FdIoUringWriterBase(std::move(that)), + // Using `that` after it was moved is correct because only the base class + // part was moved. + dest_(std::move(that.dest_)) {} + +template +inline FdIoUringWriter& FdIoUringWriter::operator=(FdIoUringWriter&& that) noexcept { + FdIoUringWriterBase::operator=(std::move(that)); + // Using `that` after it was moved is correct because only the base class part + // was moved. + dest_ = std::move(that.dest_); + return *this; +} + +template +inline void FdIoUringWriter::Reset() { + FdIoUringWriterBase::Reset(); + dest_.Reset(); +} + +template +inline void FdIoUringWriter::Reset(const Dest& dest, Options options) { + FdIoUringWriterBase::Reset(options.buffer_size()); + dest_.Reset(dest); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); +} + +template +inline void FdIoUringWriter::Reset(Dest&& dest, Options options) { + FdIoUringWriterBase::Reset(options.buffer_size()); + dest_.Reset(std::move(dest)); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); +} + +template +template +inline void FdIoUringWriter::Reset(std::tuple dest_args, + Options options) { + FdIoUringWriterBase::Reset(options.buffer_size()); + dest_.Reset(std::move(dest_args)); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); +} + +template +inline void FdIoUringWriter::Reset(absl::string_view filename, int flags, + Options options) { + Reset(); + Initialize(filename, flags, std::move(options)); +} + +template +void FdIoUringWriter::Initialize(absl::string_view filename, int flags, + Options&& options) { + const int dest = OpenFd(filename, flags, options.permissions()); + if (ABSL_PREDICT_FALSE(dest < 0)) return; + FdIoUringWriterBase::Reset(options.buffer_size()); + dest_.Reset(std::forward_as_tuple(dest)); + InitializePos(dest_.get(), flags, options.assumed_pos(), + options.independent_pos()); +} + +template +void FdIoUringWriter::Done() { + FdIoUringWriterBase::Done(); + if (dest_.is_owning()) { + const int dest = dest_.Release(); + if (ABSL_PREDICT_FALSE(internal::CloseFd(dest) < 0) && + ABSL_PREDICT_TRUE(healthy())) { + FailOperation(internal::kCloseFunctionName); + } + } +} + +} // namespace riegeli + +#endif // RIEGELI_BYTES_FD_IO_URING_WRITER_H_ \ No newline at end of file diff --git a/riegeli/iouring/BUILD b/riegeli/iouring/BUILD new file mode 100644 index 00000000..55c8e011 --- /dev/null +++ b/riegeli/iouring/BUILD @@ -0,0 +1,17 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +cc_library( + name = "fd_sync_io_uring", + srcs = [ + "fd_io_uring_options.h", + "fd_io_uring.h", + "fd_sync_io_uring.cc", + ], + hdrs = ["fd_sync_io_uring.h"], + deps = [ + "//riegeli/base", + "@liburing", + ], +) \ No newline at end of file diff --git a/riegeli/iouring/fd_async_io_uring.cc b/riegeli/iouring/fd_async_io_uring.cc new file mode 100644 index 00000000..e69de29b diff --git a/riegeli/iouring/fd_async_io_uring.h b/riegeli/iouring/fd_async_io_uring.h new file mode 100644 index 00000000..e69de29b diff --git a/riegeli/iouring/fd_io_uring.h b/riegeli/iouring/fd_io_uring.h new file mode 100644 index 00000000..40434902 --- /dev/null +++ b/riegeli/iouring/fd_io_uring.h @@ -0,0 +1,38 @@ +#ifndef RIEGELI_IOURING_FD_IO_URING_H_ +#define RIEGELI_IOURING_FD_IO_URING_H_ + +#include +#include +#include + +#include + +namespace riegeli { + +// The base interface class for sync or async Io_Uring. +class FdIoUring { +public: + virtual ~FdIoUring() {} + + // The interface for file operation for Io_Uring. + virtual ssize_t pread(int fd, void *buf, size_t count, off_t offset) = 0; + + virtual ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) = 0; + + virtual ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) = 0; + + virtual ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) = 0; + + virtual int fsync(int fd) = 0; + + // Pre-register or unregister file descriptor for Io_Uring. + virtual void RegisterFd(int fd) = 0; + + virtual void UnRegisterFd() = 0; +}; + + + +} // namespace riegeli + +#endif // RIEGELI_IOURING_FD_IO_URING_H_ \ No newline at end of file diff --git a/riegeli/iouring/fd_io_uring_options.h b/riegeli/iouring/fd_io_uring_options.h new file mode 100644 index 00000000..b22d17a8 --- /dev/null +++ b/riegeli/iouring/fd_io_uring_options.h @@ -0,0 +1,144 @@ +#ifndef RIEGELI_IOURING_IO_URING_OPTIONS_H_ +#define RIEGELI_IOURING_IO_URING_OPTIONS_H_ + +#include +#include +#include + +#include + +#include "liburing.h" + +namespace riegeli { + +// The base interface class for sync or async Io_Uring. +class FdIoUringOptions { + public: + FdIoUringOptions() noexcept {}; + + // Tunes the Io_Uring mode (sync or async). + // + // If "true", we will return the function immediately. + // A reap thread will process the result of operations later. + // + // If "false", we will wait for the result of operations. + // + // Default: "true" + FdIoUringOptions& set_async(bool async) & { + async_ = async; + return *this; + } + + FdIoUringOptions&& set_async(bool async) && { + return std::move(set_async(async)); + } + + bool async() const { + return async_; + } + + // Tunes the size of Io_Uring instance. + // + // The size must be a power of 2. + // + // Default: 8192. + FdIoUringOptions& set_size(uint32_t size) & { + size = RoundUpToNextPowerTwo(size); + size_ = size; + return *this; + } + + FdIoUringOptions&& set_size(uint32_t size) && { + return std::move(set_size(size)); + } + + uint32_t size() const { + return size_; + } + + // If "true", the Io_Uring instance will pre-register a file-set. + // + // If "false", the Io_Uring instance will not pre-register. + // + // This can save overhead in kernel when you know the file in advance. + // The kernel will not retrieve a reference of the file in this case. + // + // Default: "false". + FdIoUringOptions& set_fd_register(bool fd_register) & { + fd_register_ = fd_register; + return *this; + } + + FdIoUringOptions&& set_fd_register(bool fd_register) && { + return std::move(set_fd_register(fd_register)); + } + + bool fd_register() const { + return fd_register_; + } + + // If "true", the Io_Uring will apply polled IO. + // + // If "false", the Io_Uring will apply non-polled IO. + // + // When IO is polled, the application will repeatedly ask the hardware driver for + // status on a submitted IO request instead of relying on hardware interrupts. + // This can improve the performance significantly, typically when high IOPS. + // + // Default: "false". + FdIoUringOptions& set_poll_io(bool poll_io) & { + poll_io_ = poll_io; + return *this; + } + + FdIoUringOptions&& set_poll_io(bool poll_io) && { + return std::move(set_poll_io(poll_io)); + } + + bool poll_io() const { + return poll_io_; + } + + private: + // Tunes the value of size. + // Get the next power of two. + uint32_t RoundUpToNextPowerTwo(uint32_t size); + + bool async_ = true; + uint32_t size_ = 8192; + bool fd_register_ = false; + bool poll_io_ = false; +}; + + +uint32_t FdIoUringOptions::RoundUpToNextPowerTwo(uint32_t size) { + if(size == 0) { + return size; + } + + --size; + size |= size >> 1; + size |= size >> 2; + size |= size >> 4; + size |= size >> 8; + size |= size >> 16; + return size + 1; +} + +namespace ioUring { + +bool IsIoUringAvailable() { + struct io_uring test_ring; + bool available = false; + if(io_uring_queue_init(4, &test_ring, 0) == 0) { + available = true; + io_uring_queue_exit(&test_ring); + } + return available; +} + +} + +} // namespace riegeli + +#endif // RIEGELI_IOURING_IO_URING_OPTIONS_H_ \ No newline at end of file diff --git a/riegeli/iouring/fd_sync_io_uring.cc b/riegeli/iouring/fd_sync_io_uring.cc new file mode 100644 index 00000000..256aab1a --- /dev/null +++ b/riegeli/iouring/fd_sync_io_uring.cc @@ -0,0 +1,130 @@ +#include "riegeli/iouring/fd_sync_io_uring.h" + +#include "riegeli/base/base.h" + +#include +#include + +namespace riegeli { + +FdSyncIoUring::FdSyncIoUring(FdIoUringOptions options, int fd) +: poll_io_(options.poll_io()), size_(options.size()) { + + memset(&ring_, 0, sizeof(ring_)); + memset(¶ms_, 0, sizeof(params_)); + + if(poll_io_) { + params_.flags |= IORING_SETUP_IOPOLL; + } + + RIEGELI_ASSERT(InitIoUring()) << "Failed initilization of Io_Uring. (FdSyncIoUring)"; + + if(fd_register_) { + RegisterFd(fd); + } +} + +FdSyncIoUring::~FdSyncIoUring() { + io_uring_queue_exit(&ring_); +} + +bool FdSyncIoUring::InitIoUring() { + + if(io_uring_queue_init_params(size_, &ring_, ¶ms_) != 0) { + return false; + } + + return true; +} + +void FdSyncIoUring::RegisterFd(int fd) { + fd_ = fd; + + if(fd_register_ == false) { + RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 1) << "Failed fd register."; + fd_register_ = true; + } else { + UpdateFd(); + } +} + +void FdSyncIoUring::UnRegisterFd() { + fd_ = -1; + RIEGELI_ASSERT_EQ(io_uring_unregister_files(&ring_), 0) << "Failed fd unregister."; + fd_register_ = false; +} + +void FdSyncIoUring::UpdateFd() { + RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; +} + +ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_read(sqe, 0, buf, count, offset); + } else { + io_uring_prep_read(sqe, fd, buf, count, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +ssize_t FdSyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_write(sqe, 0, buf, count, offset); + } else { + io_uring_prep_write(sqe, fd, buf, count, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); + } else { + io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); + } else { + io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +int FdSyncIoUring::fsync(int fd) { + struct io_uring_sqe *sqe = GetSqe(); + io_uring_prep_fsync(sqe, fd, 0); + if(fd_register_) { + io_uring_prep_fsync(sqe, 0, 0); + } else { + io_uring_prep_fsync(sqe, fd, 0); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +inline struct io_uring_sqe* FdSyncIoUring::GetSqe() { + struct io_uring_sqe *sqe = io_uring_get_sqe(&ring_); + RIEGELI_ASSERT(!!sqe) << "Failed get a sqe."; + return sqe; +} + +inline ssize_t FdSyncIoUring::SubmitAndGetResult() { + RIEGELI_ASSERT_GT(io_uring_submit(&ring_), 0) << "Failed to submit the sqe."; + struct io_uring_cqe* cqe = NULL; + io_uring_wait_cqe(&ring_, &cqe); + return cqe -> res; +} + +} // namespace riegeli diff --git a/riegeli/iouring/fd_sync_io_uring.h b/riegeli/iouring/fd_sync_io_uring.h new file mode 100644 index 00000000..4cc11812 --- /dev/null +++ b/riegeli/iouring/fd_sync_io_uring.h @@ -0,0 +1,76 @@ +#ifndef RIEGELI_BYTES_FD_SYNC_IO_URING_H_ +#define RIEGELI_BYTES_FD_SYNC_IO_URING_H_ + +#include "riegeli/iouring/fd_io_uring_options.h" +#include "riegeli/iouring/fd_io_uring.h" + +namespace riegeli { +// Perform Io_Uring synchronously. +class FdSyncIoUring : public FdIoUring { + public: + // Constructor and destructor for this class. + FdSyncIoUring() = delete; + FdSyncIoUring(const FdSyncIoUring&) = delete; + FdSyncIoUring& operator=(const FdSyncIoUring&) = delete; + + explicit FdSyncIoUring(FdIoUringOptions options, int fd = -1); + + ~FdSyncIoUring() override; + + // Override the file operation interface for Io_Uring. + ssize_t pread(int fd, void *buf, size_t count, off_t offset) override; + + ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) override; + + ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; + + ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; + + int fsync(int fd) override; + + virtual void RegisterFd(int fd) override; + + virtual void UnRegisterFd() override; + + // Get Io_Uring settings. + bool poll_io() { + return poll_io_; + } + + bool fd_register() { + return fd_register_; + } + + uint32_t size() { + return size_; + } + + int fd() { + return fd_; + } + + private: + // Initilize Io_Uring. + bool InitIoUring(); + + // Update registered fd. + void UpdateFd(); + + // Get sqe. + struct io_uring_sqe* GetSqe(); + + // Submit sqe to kernel. + ssize_t SubmitAndGetResult(); + + struct io_uring_params params_; + struct io_uring ring_; + + bool poll_io_; + bool fd_register_ = false; + uint32_t size_; + int fd_ = -1; +}; + +} // namespace riegeli + +#endif // RIEGELI_BYTES_FD_SYNC_IO_URING_H_ \ No newline at end of file diff --git a/third_party/liburing.BUILD b/third_party/liburing.BUILD new file mode 100644 index 00000000..ac89eb73 --- /dev/null +++ b/third_party/liburing.BUILD @@ -0,0 +1,38 @@ +licenses(["notice"]) + +genrule( + name = "liburingconfigure", + tools = [ + "configure", + ], + outs = [ + "config-host.h", + "config-host.mak", + "config.log", + "src/include/liburing/compat.h", + ], + cmd = "tempdir=$(@D)/tmp.XXXXX; rm -rf $$tempdir; mkdir -p $$tempdir; cp -r external/liburing/* $$tempdir/; pushd $$tempdir; ./configure; popd; cp $$tempdir/config-host.h $$tempdir/config-host.mak $$tempdir/config.log $(@D); cp $$tempdir/src/include/liburing/compat.h $(@D)/src/include/liburing; rm -rf $$tempdir;", + local = 1, +) + +genrule( + name = "foo", + outs = ["foo.h"], + cmd = "ls -al", +) + +cc_library( + name = "liburing", + visibility = [ + "//visibility:public" + ], + hdrs = glob([ + "src/*.h", + "src/include/*.h", + "src/include/liburing/*.h", + ]) + [":liburingconfigure"], + srcs = glob([ + "src/*.c", + ]), + includes = ["src/include"] +) \ No newline at end of file From 6bb44f1907a277af37d00e58900136bb2b31b65c Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Sun, 18 Jul 2021 21:06:04 -0700 Subject: [PATCH 2/9] fd_sync_io_uring test pass --- .gitignore | 1 - WORKSPACE | 7 ++ io_uring_test/BUILD | 22 ++++ io_uring_test/io_test.cc | 59 ++++++++++ io_uring_test/io_uring_write_test.cc | 146 +++++++++++++++++++++++++ io_uring_test/syn_test_file | Bin 0 -> 379219 bytes riegeli/bytes/fd_io_uring_writer.cc | 47 +++++--- riegeli/bytes/fd_io_uring_writer.h | 51 +++++++-- riegeli/iouring/BUILD | 33 +++++- riegeli/iouring/fd_async_io_uring.cc | 136 +++++++++++++++++++++++ riegeli/iouring/fd_async_io_uring.h | 79 +++++++++++++ riegeli/iouring/fd_io_uring.cc | 18 +++ riegeli/iouring/fd_io_uring.h | 14 ++- riegeli/iouring/fd_io_uring_options.cc | 19 ++++ riegeli/iouring/fd_io_uring_options.h | 60 +--------- riegeli/iouring/fd_sync_io_uring.cc | 21 ++-- riegeli/iouring/fd_sync_io_uring.h | 17 ++- 17 files changed, 628 insertions(+), 102 deletions(-) create mode 100644 io_uring_test/BUILD create mode 100644 io_uring_test/io_test.cc create mode 100644 io_uring_test/io_uring_write_test.cc create mode 100644 io_uring_test/syn_test_file create mode 100644 riegeli/iouring/fd_io_uring.cc create mode 100644 riegeli/iouring/fd_io_uring_options.cc diff --git a/.gitignore b/.gitignore index 96b9adcc..03392b9e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,5 @@ bazel-bin bazel-out bazel-riegeli bazel-testlogs -test/ .bazelversion configure.bazelrc \ No newline at end of file diff --git a/WORKSPACE b/WORKSPACE index fffdb8f2..45ab1118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -14,6 +14,13 @@ http_archive( ], ) +http_archive( + name = "com_google_googletest", + sha256 = "5cf189eb6847b4f8fc603a3ffff3b0771c08eec7dd4bd961bfd45477dd13eb73", + strip_prefix = "googletest-609281088cfefc76f9d0ce82e1ff6c30cc3591e5", + urls = ["https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip"], +) + http_archive( name = "org_brotli", sha256 = "6e69be238ff61cef589a3fa88da11b649c7ff7a5932cb12d1e6251c8c2e17a2f", diff --git a/io_uring_test/BUILD b/io_uring_test/BUILD new file mode 100644 index 00000000..f3a69bc6 --- /dev/null +++ b/io_uring_test/BUILD @@ -0,0 +1,22 @@ +cc_test( + name = "io_uring_write_test", + srcs = ["io_uring_write_test.cc"], + deps = [ + "//riegeli/bytes:fd_io_uring_writer", + "//riegeli/records:record_writer", + "//riegeli/bytes:fd_reader", + "//riegeli/records:record_reader", + "@com_google_googletest//:gtest_main", + ], +) + +cc_binary( + name = "io_test", + srcs = ["io_test.cc"], + deps = [ + "//riegeli/bytes:fd_io_uring_writer", + "//riegeli/records:record_writer", + "//riegeli/bytes:fd_reader", + "//riegeli/records:record_reader", + ], +) \ No newline at end of file diff --git a/io_uring_test/io_test.cc b/io_uring_test/io_test.cc new file mode 100644 index 00000000..7ad21f9f --- /dev/null +++ b/io_uring_test/io_test.cc @@ -0,0 +1,59 @@ +#include + +#include "riegeli/bytes/fd_io_uring_writer.h" +#include "riegeli/records/record_writer.h" +#include "riegeli/bytes/fd_reader.h" +#include "riegeli/records/record_reader.h" + +using WritePtr = std::unique_ptr>>; +using ReadPtr = std::unique_ptr>>; + +void CheckData(const std::string &file) { + riegeli::RecordReaderBase::Options r_options; + riegeli::FdReaderBase::Options fd_r_options; + riegeli::FdReader<> fd_reader(file, O_RDONLY, + fd_r_options); + ReadPtr reader = std::make_unique>>( + std::move(fd_reader), std::move(r_options)); + + std::string record; + int num = 1; + int result = 0; + while(reader -> ReadRecord(record)) { + if(record == std::to_string(num)) { + ++result; + } + ++num; + } + std::cout << result << std::endl; + reader -> Close(); +} + + +int main() { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + riegeli::FdIoUringOptions fd_io_uring_options; + fd_io_uring_options.set_async(false); + fd_io_uring_options.set_fd_register(false); + fd_io_uring_options.set_poll_io(true); + + riegeli::FdIoUringWriterBase::Options fd_w_options; + fd_w_options.set_io_uring_option(fd_io_uring_options); + + riegeli::RecordWriterBase::Options w_options; + + riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, + fd_w_options); + + WritePtr writer = std::make_unique>>( + std::move(fd_writer), std::move(w_options)); + + for(int i = 1; i <= 1000000; ++i) { + std::string temp = std::to_string(i); + writer -> WriteRecord(temp); + } + writer -> Close(); + + CheckData(file); + return 0; +} \ No newline at end of file diff --git a/io_uring_test/io_uring_write_test.cc b/io_uring_test/io_uring_write_test.cc new file mode 100644 index 00000000..8fd6b3e8 --- /dev/null +++ b/io_uring_test/io_uring_write_test.cc @@ -0,0 +1,146 @@ +#include + +#include "riegeli/bytes/fd_io_uring_writer.h" +#include "riegeli/records/record_writer.h" +#include "riegeli/bytes/fd_reader.h" +#include "riegeli/records/record_reader.h" + +#include "gtest/gtest.h" + +namespace iouringtest { +using WritePtr = std::unique_ptr>>; +using ReadPtr = std::unique_ptr>>; + +void SyncFd(WritePtr& writer, const std::string &file) { + riegeli::FdIoUringOptions fd_io_uring_options; + fd_io_uring_options.set_async(false); + fd_io_uring_options.set_fd_register(true); + + riegeli::FdIoUringWriterBase::Options fd_w_options; + fd_w_options.set_io_uring_option(fd_io_uring_options); + + riegeli::RecordWriterBase::Options w_options; + + riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, + fd_w_options); + + writer = std::make_unique>>( + std::move(fd_writer), std::move(w_options)); +} + +void Sync(WritePtr& writer, const std::string &file) { + riegeli::FdIoUringOptions fd_io_uring_options; + fd_io_uring_options.set_async(false); + fd_io_uring_options.set_fd_register(false); + + riegeli::FdIoUringWriterBase::Options fd_w_options; + fd_w_options.set_io_uring_option(fd_io_uring_options); + + riegeli::RecordWriterBase::Options w_options; + + riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, + fd_w_options); + + writer = std::make_unique>>( + std::move(fd_writer), std::move(w_options)); +} + +void WriteData(WritePtr &writer) { + for(int i = 1; i <= 100000000; ++i) { + std::string temp = std::to_string(i); + writer -> WriteRecord(temp); + } + writer -> Close(); +} + +void CheckData(const std::string &file) { + riegeli::RecordReaderBase::Options r_options; + riegeli::FdReaderBase::Options fd_r_options; + riegeli::FdReader<> fd_reader(file, O_RDONLY, + fd_r_options); + ReadPtr reader = std::make_unique>>( + std::move(fd_reader), std::move(r_options)); + + std::string record; + int num = 1; + while(reader -> ReadRecord(record)) { + EXPECT_EQ(record, std::to_string(num)); + ++num; + } + EXPECT_EQ(num, 100000001); + reader -> Close(); +} + +void WriteLargeData(WritePtr &writer) { + for(int i = 1; i <= 10000; ++i) { + std::string element = std::to_string(i); + std::string temp = element; + for(int j = 0; j < 100000; ++j) { + temp += element; + } + writer -> WriteRecord(temp); + } + writer -> Close(); +} + +void CheckLargeData(const std::string &file) { + riegeli::RecordReaderBase::Options r_options; + riegeli::FdReaderBase::Options fd_r_options; + riegeli::FdReader<> fd_reader(file, O_RDONLY, + fd_r_options); + ReadPtr reader = std::make_unique>>( + std::move(fd_reader), std::move(r_options)); + + std::string record; + int num = 1; + while(reader -> ReadRecord(record)) { + std::string element = std::to_string(num); + std::string temp = element; + for(int j = 0; j < 100000; ++j) { + temp += element; + } + EXPECT_EQ(record, temp); + ++num; + } + EXPECT_EQ(num, 10001); + reader -> Close(); +} + +TEST(IoUringTest, SynWrite) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + Sync(writer, file); + + WriteData(writer); + CheckData(file); +} + +TEST(IoUringTest, SynFdWrite) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + SyncFd(writer, file); + + WriteData(writer); + CheckData(file); +} + + +TEST(IoUringTest, SynWriteLargeData) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + Sync(writer, file); + + WriteLargeData(writer); + CheckLargeData(file); +} + +TEST(IoUringTest, SynFdWriteLargeData) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + SyncFd(writer, file); + + WriteLargeData(writer); + CheckLargeData(file); +} + +} \ No newline at end of file diff --git a/io_uring_test/syn_test_file b/io_uring_test/syn_test_file new file mode 100644 index 0000000000000000000000000000000000000000..10a9aa7cb5cd51f490e538c0987c6b5de07b5711 GIT binary patch literal 379219 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 np4)Ox5@Z`~NkS0~ftiU*z9*=Vo{e^6 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 assumed_pos, - absl::optional independent_pos) { + absl::optional independent_pos, FdIoUringOptions io_uring_option) { RIEGELI_ASSERT_GE(dest, 0) << "Failed precondition of FdIoUringWriter: negative file descriptor"; SetFilename(dest); + InitializeFdIoUring(io_uring_option, dest); InitializePos(dest, assumed_pos, independent_pos); } @@ -131,6 +132,16 @@ void FdIoUringWriterBase::InitializePos(int dest, int flags, } } +void FdIoUringWriterBase::InitializeFdIoUring(FdIoUringOptions options, int fd) { + async_ = options.async(); + + if(async_) { + + } else { + fd_io_uring_ = std::make_unique(options, fd); + } +} + bool FdIoUringWriterBase::FailOperation(absl::string_view operation) { const int error_number = errno; RIEGELI_ASSERT_NE(error_number, 0) @@ -153,31 +164,37 @@ bool FdIoUringWriterBase::WriteInternal(absl::string_view src) { "nothing to write"; RIEGELI_ASSERT(healthy()) << "Failed precondition of BufferedWriter::WriteInternal(): " << status(); - const int dest = dest_fd(); + if (ABSL_PREDICT_FALSE(src.size() > Position{std::numeric_limits::max()} - start_pos())) { return FailOverflow(); } + + if(async_) { + return AsyncWriteInternal(src); + } + + return SyncWriteInternal(src); +} + +bool FdIoUringWriterBase::SyncWriteInternal(absl::string_view src) { + const int dest = dest_fd(); + do { again: - const ssize_t length_written = - has_independent_pos_ - ? pwrite(dest, src.data(), + const ssize_t length_written = fd_io_uring_ -> pwrite(dest, src.data(), UnsignedMin(src.size(), size_t{std::numeric_limits::max()}), - IntCast(start_pos())) - : write(dest, src.data(), - UnsignedMin(src.size(), - size_t{std::numeric_limits::max()})); + IntCast(start_pos())); if (ABSL_PREDICT_FALSE(length_written < 0)) { if (errno == EINTR) goto again; - return FailOperation(has_independent_pos_ ? "pwrite()" : "write()"); + return FailOperation("pwrite()"); } RIEGELI_ASSERT_GT(length_written, 0) - << (has_independent_pos_ ? "pwrite()" : "write()") << " returned 0"; + << "pwrite()" << " returned 0"; RIEGELI_ASSERT_LE(IntCast(length_written), src.size()) - << (has_independent_pos_ ? "pwrite()" : "write()") + << "pwrite()" << " wrote more than requested"; move_start_pos(IntCast(length_written)); src.remove_prefix(IntCast(length_written)); @@ -185,6 +202,10 @@ bool FdIoUringWriterBase::WriteInternal(absl::string_view src) { return true; } +bool FdIoUringWriterBase::AsyncWriteInternal(absl::string_view src) { + return true; +} + bool FdIoUringWriterBase::FlushImpl(FlushType flush_type) { if (ABSL_PREDICT_FALSE(!BufferedWriter::FlushImpl(flush_type))) return false; switch (flush_type) { @@ -193,7 +214,7 @@ bool FdIoUringWriterBase::FlushImpl(FlushType flush_type) { return true; case FlushType::kFromMachine: { const int dest = dest_fd(); - if (ABSL_PREDICT_FALSE(fsync(dest) < 0)) { + if (ABSL_PREDICT_FALSE(fd_io_uring_ -> fsync(dest) < 0)) { return FailOperation("fsync()"); } return true; diff --git a/riegeli/bytes/fd_io_uring_writer.h b/riegeli/bytes/fd_io_uring_writer.h index a64ea95c..76e90264 100644 --- a/riegeli/bytes/fd_io_uring_writer.h +++ b/riegeli/bytes/fd_io_uring_writer.h @@ -101,12 +101,28 @@ class FdIoUringWriterBase : public BufferedWriter { } size_t buffer_size() const { return buffer_size_; } + // The option for Io_Uring operation. + // + // The option includes: async or sync, fd_register or not, and size. + Options& set_io_uring_option(FdIoUringOptions io_uring_option) & { + io_uring_option_ = io_uring_option; + return *this; + } + + Options&& set_io_uring_option(FdIoUringOptions io_uring_option) && { + return std::move(set_io_uring_option(io_uring_option)); + } + + FdIoUringOptions io_uring_option() const { + return io_uring_option_; + } + private: mode_t permissions_ = 0666; absl::optional assumed_pos_; absl::optional independent_pos_; size_t buffer_size_ = kDefaultBufferSize; - FdIoUringOptions options; + FdIoUringOptions io_uring_option_; }; // Returns the fd being written to. If the fd is owned then changed to -1 by @@ -131,12 +147,13 @@ class FdIoUringWriterBase : public BufferedWriter { void Reset(); void Reset(size_t buffer_size); void Initialize(int dest, absl::optional assumed_pos, - absl::optional independent_pos); + absl::optional independent_pos, FdIoUringOptions io_uring_option); int OpenFd(absl::string_view filename, int flags, mode_t permissions); void InitializePos(int dest, absl::optional assumed_pos, absl::optional independent_pos); void InitializePos(int dest, int flags, absl::optional assumed_pos, absl::optional independent_pos); + void InitializeFdIoUring(FdIoUringOptions options, int fd); ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation); void AnnotateFailure(absl::Status& status) override; @@ -146,6 +163,9 @@ class FdIoUringWriterBase : public BufferedWriter { absl::optional SizeBehindBuffer() override; bool TruncateBehindBuffer(Position new_size) override; + bool SyncWriteInternal(absl::string_view src); + bool AsyncWriteInternal(absl::string_view src); + private: void SetFilename(int dest); bool SeekInternal(int dest, Position new_pos); @@ -153,7 +173,10 @@ class FdIoUringWriterBase : public BufferedWriter { std::string filename_; bool supports_random_access_ = false; bool has_independent_pos_ = false; + bool async_ = false; + protected: + std::unique_ptr fd_io_uring_; // Invariant: `start_pos() <= std::numeric_limits::max()` }; @@ -284,7 +307,7 @@ inline FdIoUringWriterBase::FdIoUringWriterBase(FdIoUringWriterBase&& that) noex // part was moved. filename_(std::move(that.filename_)), supports_random_access_(that.supports_random_access_), - has_independent_pos_(that.has_independent_pos_) {} + has_independent_pos_(that.has_independent_pos_), async_(that.async_), fd_io_uring_(std::move(that.fd_io_uring_)) {} inline FdIoUringWriterBase& FdIoUringWriterBase::operator=(FdIoUringWriterBase&& that) noexcept { BufferedWriter::operator=(std::move(that)); @@ -293,6 +316,8 @@ inline FdIoUringWriterBase& FdIoUringWriterBase::operator=(FdIoUringWriterBase&& filename_ = std::move(that.filename_); supports_random_access_ = that.supports_random_access_; has_independent_pos_ = that.has_independent_pos_; + async_ = that.async_; + fd_io_uring_ = std::move(that.fd_io_uring_); return *this; } @@ -301,6 +326,8 @@ inline void FdIoUringWriterBase::Reset() { filename_.clear(); supports_random_access_ = false; has_independent_pos_ = false; + async_ = false; + fd_io_uring_.reset(); } inline void FdIoUringWriterBase::Reset(size_t buffer_size) { @@ -308,18 +335,20 @@ inline void FdIoUringWriterBase::Reset(size_t buffer_size) { // `filename_` was set by `OpenFd()` or will be set by `Initialize()`. supports_random_access_ = false; has_independent_pos_ = false; + async_ = false; + fd_io_uring_.reset(); } template inline FdIoUringWriter::FdIoUringWriter(const Dest& dest, Options options) : FdIoUringWriterBase(options.buffer_size()), dest_(dest) { - Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos(), options.io_uring_option()); } template inline FdIoUringWriter::FdIoUringWriter(Dest&& dest, Options options) : FdIoUringWriterBase(options.buffer_size()), dest_(std::move(dest)) { - Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos(), options.io_uring_option()); } template @@ -327,7 +356,7 @@ template inline FdIoUringWriter::FdIoUringWriter(std::tuple dest_args, Options options) : FdIoUringWriterBase(options.buffer_size()), dest_(std::move(dest_args)) { - Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos(), options.io_uring_option()); } template @@ -362,14 +391,14 @@ template inline void FdIoUringWriter::Reset(const Dest& dest, Options options) { FdIoUringWriterBase::Reset(options.buffer_size()); dest_.Reset(dest); - Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos(), options.io_uring_option()); } template inline void FdIoUringWriter::Reset(Dest&& dest, Options options) { FdIoUringWriterBase::Reset(options.buffer_size()); dest_.Reset(std::move(dest)); - Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos(), options.io_uring_option()); } template @@ -378,7 +407,7 @@ inline void FdIoUringWriter::Reset(std::tuple dest_args, Options options) { FdIoUringWriterBase::Reset(options.buffer_size()); dest_.Reset(std::move(dest_args)); - Initialize(dest_.get(), options.assumed_pos(), options.independent_pos()); + Initialize(dest_.get(), options.assumed_pos(), options.independent_pos(), options.io_uring_option()); } template @@ -395,6 +424,8 @@ void FdIoUringWriter::Initialize(absl::string_view filename, int flags, if (ABSL_PREDICT_FALSE(dest < 0)) return; FdIoUringWriterBase::Reset(options.buffer_size()); dest_.Reset(std::forward_as_tuple(dest)); + int fd = dest_.get(); + InitializeFdIoUring(options.io_uring_option(), fd); InitializePos(dest_.get(), flags, options.assumed_pos(), options.independent_pos()); } @@ -402,6 +433,8 @@ void FdIoUringWriter::Initialize(absl::string_view filename, int flags, template void FdIoUringWriter::Done() { FdIoUringWriterBase::Done(); + fd_io_uring_.reset(); + if (dest_.is_owning()) { const int dest = dest_.Release(); if (ABSL_PREDICT_FALSE(internal::CloseFd(dest) < 0) && diff --git a/riegeli/iouring/BUILD b/riegeli/iouring/BUILD index 55c8e011..b11c84f5 100644 --- a/riegeli/iouring/BUILD +++ b/riegeli/iouring/BUILD @@ -2,16 +2,43 @@ package(default_visibility = ["//visibility:public"]) licenses(["notice"]) +cc_library( + name = "fd_io_uring_options", + srcs = ["fd_io_uring_options.cc"], + hdrs = ["fd_io_uring_options.h"], +) + +cc_library( + name = "fd_io_uring", + srcs = ["fd_io_uring.cc"], + hdrs = ["fd_io_uring.h"], + deps = [ + "@liburing", + ] +) + cc_library( name = "fd_sync_io_uring", srcs = [ - "fd_io_uring_options.h", - "fd_io_uring.h", "fd_sync_io_uring.cc", ], hdrs = ["fd_sync_io_uring.h"], deps = [ "//riegeli/base", - "@liburing", + ":fd_io_uring_options", + ":fd_io_uring", + ], +) + +cc_library( + name = "fd_async_io_uring", + srcs = [ + "fd_async_io_uring.cc", + ], + hdrs = ["fd_async_io_uring.h"], + deps = [ + "//riegeli/base", + "//riegeli/iouring:fd_io_uring_options", + "//riegeli/iouring:fd_io_uring", ], ) \ No newline at end of file diff --git a/riegeli/iouring/fd_async_io_uring.cc b/riegeli/iouring/fd_async_io_uring.cc index e69de29b..d6d03fee 100644 --- a/riegeli/iouring/fd_async_io_uring.cc +++ b/riegeli/iouring/fd_async_io_uring.cc @@ -0,0 +1,136 @@ +#include "riegeli/iouring/fd_async_io_uring.h" + +#include "riegeli/base/base.h" + +#include +#include + +namespace riegeli { + +FdAsyncIoUring::FdAsyncIoUring(FdIoUringOptions options, int fd) +: poll_io_(options.poll_io()), size_(options.size()) { + + memset(&ring_, 0, sizeof(ring_)); + memset(¶ms_, 0, sizeof(params_)); + + poll_io_ = options.poll_io(); + if(poll_io_) { + params_.flags |= IORING_SETUP_IOPOLL; + } + + bool flag = false; + RIEGELI_ASSERT((flag = InitIoUring())) << "Failed initilization of Io_Uring. (FdAsyncIoUring)"; + + if(fd_register_) { + RegisterFd(fd); + } +} + +FdAsyncIoUring::~FdAsyncIoUring() { + io_uring_queue_exit(&ring_); +} + +bool FdAsyncIoUring::InitIoUring() { + + if(io_uring_queue_init_params(size_, &ring_, ¶ms_) != 0) { + return false; + } + + return true; +} + +void FdAsyncIoUring::RegisterFd(int fd) { + fd_ = fd; + + if(fd_register_ == false) { + RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 1) << "Failed fd register."; + fd_register_ = true; + } else { + UpdateFd(); + } +} + +void FdAsyncIoUring::UnRegisterFd() { + fd_ = -1; + RIEGELI_ASSERT_EQ(io_uring_unregister_files(&ring_), 0) << "Failed fd unregister."; + fd_register_ = false; +} + +void FdAsyncIoUring::UpdateFd() { + RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; +} + +int FdAsyncIoUring::mode() { + return 1; +} + +ssize_t FdAsyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_read(sqe, 0, buf, count, offset); + } else { + io_uring_prep_read(sqe, fd, buf, count, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +ssize_t FdAsyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_write(sqe, 0, buf, count, offset); + } else { + io_uring_prep_write(sqe, fd, buf, count, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); + } else { + io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { + struct io_uring_sqe *sqe = GetSqe(); + if(fd_register_) { + io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); + } else { + io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +int FdSyncIoUring::fsync(int fd) { + struct io_uring_sqe *sqe = GetSqe(); + io_uring_prep_fsync(sqe, fd, 0); + if(fd_register_) { + io_uring_prep_fsync(sqe, 0, 0); + } else { + io_uring_prep_fsync(sqe, fd, 0); + } + ssize_t res = SubmitAndGetResult(); + return res; +} + +inline struct io_uring_sqe* FdSyncIoUring::GetSqe() { + struct io_uring_sqe *sqe = io_uring_get_sqe(&ring_); + RIEGELI_ASSERT(!!sqe) << "Failed get a sqe."; + return sqe; +} + +inline ssize_t FdSyncIoUring::SubmitAndGetResult() { + RIEGELI_ASSERT_GT(io_uring_submit(&ring_), 0) << "Failed to submit the sqe."; + struct io_uring_cqe* cqe = NULL; + io_uring_wait_cqe(&ring_, &cqe); + return cqe -> res; +} + +} // namespace riegeli diff --git a/riegeli/iouring/fd_async_io_uring.h b/riegeli/iouring/fd_async_io_uring.h index e69de29b..20e70f60 100644 --- a/riegeli/iouring/fd_async_io_uring.h +++ b/riegeli/iouring/fd_async_io_uring.h @@ -0,0 +1,79 @@ +#ifndef RIEGELI_IOURING_FD_ASYNC_IO_URING_H_ +#define RIEGELI_IOURING_FD_ASYNC_IO_URING_H_ + +#include "riegeli/iouring/fd_io_uring_options.h" +#include "riegeli/iouring/fd_io_uring.h" + +namespace riegeli { + +// Perform Io_Uring synchronously. +class FdAsyncIoUring : public FdIoUring { + public: + // Constructor and destructor for this class. + FdAsyncIoUring() = delete; + FdAsyncIoUring(const FdAsyncIoUring&) = delete; + FdAsyncIoUring& operator=(const FdAsyncIoUring&) = delete; + + explicit FdAsyncIoUring(FdIoUringOptions options, int fd = -1); + + ~FdAsyncIoUring() override; + + // Override the file operation interface for Io_Uring. + ssize_t pread(int fd, void *buf, size_t count, off_t offset) override; + + ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) override; + + ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; + + ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; + + int fsync(int fd) override; + + void RegisterFd(int fd) override; + + void UnRegisterFd() override; + + std::string Mode() override; + + // Get Io_Uring settings. + bool poll_io() { + return poll_io_; + } + + bool fd_register() { + return fd_register_; + } + + uint32_t size() { + return size_; + } + + int fd() { + return fd_; + } + + private: + // Initilize Io_Uring. + bool InitIoUring(); + + // Update registered fd. + void UpdateFd(); + + // Get sqe. + struct io_uring_sqe* GetSqe(); + + // Submit sqe to kernel. + ssize_t SubmitAndGetResult(); + + struct io_uring_params params_; + struct io_uring ring_; + + bool poll_io_; + bool fd_register_ = false; + uint32_t size_; + int fd_ = -1; +}; + +} // namespace riegeli + +#endif // RIEGELI_IOURING_FD_ASYNC_IO_URING_H_ \ No newline at end of file diff --git a/riegeli/iouring/fd_io_uring.cc b/riegeli/iouring/fd_io_uring.cc new file mode 100644 index 00000000..68be81fb --- /dev/null +++ b/riegeli/iouring/fd_io_uring.cc @@ -0,0 +1,18 @@ +#include "riegeli/iouring/fd_io_uring.h" + +namespace riegeli { + +namespace ioUring { + +bool IsIoUringAvailable() { + struct io_uring test_ring; + bool available = false; + if(io_uring_queue_init(4, &test_ring, 0) == 0) { + available = true; + io_uring_queue_exit(&test_ring); + } + return available; +} + +} +} // namespace riegeli \ No newline at end of file diff --git a/riegeli/iouring/fd_io_uring.h b/riegeli/iouring/fd_io_uring.h index 40434902..1aa4352b 100644 --- a/riegeli/iouring/fd_io_uring.h +++ b/riegeli/iouring/fd_io_uring.h @@ -5,10 +5,20 @@ #include #include +#include #include +#include "liburing.h" +#include "syscall.h" + namespace riegeli { +namespace ioUring { + +bool IsIoUringAvailable(); + +} + // The base interface class for sync or async Io_Uring. class FdIoUring { public: @@ -29,9 +39,9 @@ class FdIoUring { virtual void RegisterFd(int fd) = 0; virtual void UnRegisterFd() = 0; -}; - + virtual std::string Mode() = 0; +}; } // namespace riegeli diff --git a/riegeli/iouring/fd_io_uring_options.cc b/riegeli/iouring/fd_io_uring_options.cc new file mode 100644 index 00000000..87ef7d9b --- /dev/null +++ b/riegeli/iouring/fd_io_uring_options.cc @@ -0,0 +1,19 @@ +#include "riegeli/iouring/fd_io_uring_options.h" + +namespace riegeli { + +uint32_t FdIoUringOptions::RoundUpToNextPowerTwo(uint32_t size) { + if(size == 0) { + return size; + } + + --size; + size |= size >> 1; + size |= size >> 2; + size |= size >> 4; + size |= size >> 8; + size |= size >> 16; + return size + 1; +} + +} // namespace riegeli diff --git a/riegeli/iouring/fd_io_uring_options.h b/riegeli/iouring/fd_io_uring_options.h index b22d17a8..8dcb91c6 100644 --- a/riegeli/iouring/fd_io_uring_options.h +++ b/riegeli/iouring/fd_io_uring_options.h @@ -1,5 +1,5 @@ -#ifndef RIEGELI_IOURING_IO_URING_OPTIONS_H_ -#define RIEGELI_IOURING_IO_URING_OPTIONS_H_ +#ifndef RIEGELI_IOURING_FD_IO_URING_OPTIONS_H_ +#define RIEGELI_IOURING_FD_IO_URING_OPTIONS_H_ #include #include @@ -7,8 +7,6 @@ #include -#include "liburing.h" - namespace riegeli { // The base interface class for sync or async Io_Uring. @@ -77,28 +75,6 @@ class FdIoUringOptions { return fd_register_; } - // If "true", the Io_Uring will apply polled IO. - // - // If "false", the Io_Uring will apply non-polled IO. - // - // When IO is polled, the application will repeatedly ask the hardware driver for - // status on a submitted IO request instead of relying on hardware interrupts. - // This can improve the performance significantly, typically when high IOPS. - // - // Default: "false". - FdIoUringOptions& set_poll_io(bool poll_io) & { - poll_io_ = poll_io; - return *this; - } - - FdIoUringOptions&& set_poll_io(bool poll_io) && { - return std::move(set_poll_io(poll_io)); - } - - bool poll_io() const { - return poll_io_; - } - private: // Tunes the value of size. // Get the next power of two. @@ -107,38 +83,8 @@ class FdIoUringOptions { bool async_ = true; uint32_t size_ = 8192; bool fd_register_ = false; - bool poll_io_ = false; }; - - -uint32_t FdIoUringOptions::RoundUpToNextPowerTwo(uint32_t size) { - if(size == 0) { - return size; - } - - --size; - size |= size >> 1; - size |= size >> 2; - size |= size >> 4; - size |= size >> 8; - size |= size >> 16; - return size + 1; -} - -namespace ioUring { - -bool IsIoUringAvailable() { - struct io_uring test_ring; - bool available = false; - if(io_uring_queue_init(4, &test_ring, 0) == 0) { - available = true; - io_uring_queue_exit(&test_ring); - } - return available; -} - -} } // namespace riegeli -#endif // RIEGELI_IOURING_IO_URING_OPTIONS_H_ \ No newline at end of file +#endif // RIEGELI_IOURING_FD_IO_URING_OPTIONS_H_ \ No newline at end of file diff --git a/riegeli/iouring/fd_sync_io_uring.cc b/riegeli/iouring/fd_sync_io_uring.cc index 256aab1a..78d8e2b1 100644 --- a/riegeli/iouring/fd_sync_io_uring.cc +++ b/riegeli/iouring/fd_sync_io_uring.cc @@ -8,15 +8,11 @@ namespace riegeli { FdSyncIoUring::FdSyncIoUring(FdIoUringOptions options, int fd) -: poll_io_(options.poll_io()), size_(options.size()) { +: size_(options.size()) { memset(&ring_, 0, sizeof(ring_)); memset(¶ms_, 0, sizeof(params_)); - if(poll_io_) { - params_.flags |= IORING_SETUP_IOPOLL; - } - RIEGELI_ASSERT(InitIoUring()) << "Failed initilization of Io_Uring. (FdSyncIoUring)"; if(fd_register_) { @@ -58,9 +54,14 @@ void FdSyncIoUring::UpdateFd() { RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; } +std::string FdSyncIoUring::Mode() { + return "Sync Io_Uring"; +} + ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_read(sqe, 0, buf, count, offset); } else { io_uring_prep_read(sqe, fd, buf, count, offset); @@ -72,6 +73,7 @@ ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { ssize_t FdSyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_write(sqe, 0, buf, count, offset); } else { io_uring_prep_write(sqe, fd, buf, count, offset); @@ -83,6 +85,7 @@ ssize_t FdSyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offse ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); } else { io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); @@ -94,6 +97,7 @@ ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); } else { io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); @@ -106,6 +110,7 @@ int FdSyncIoUring::fsync(int fd) { struct io_uring_sqe *sqe = GetSqe(); io_uring_prep_fsync(sqe, fd, 0); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_fsync(sqe, 0, 0); } else { io_uring_prep_fsync(sqe, fd, 0); @@ -123,8 +128,10 @@ inline struct io_uring_sqe* FdSyncIoUring::GetSqe() { inline ssize_t FdSyncIoUring::SubmitAndGetResult() { RIEGELI_ASSERT_GT(io_uring_submit(&ring_), 0) << "Failed to submit the sqe."; struct io_uring_cqe* cqe = NULL; - io_uring_wait_cqe(&ring_, &cqe); - return cqe -> res; + RIEGELI_ASSERT_EQ(io_uring_wait_cqe(&ring_, &cqe), 0) << "Failed to get a cqe"; + ssize_t res = cqe -> res; + io_uring_cqe_seen(&ring_, cqe); + return res; } } // namespace riegeli diff --git a/riegeli/iouring/fd_sync_io_uring.h b/riegeli/iouring/fd_sync_io_uring.h index 4cc11812..7d9240c5 100644 --- a/riegeli/iouring/fd_sync_io_uring.h +++ b/riegeli/iouring/fd_sync_io_uring.h @@ -1,5 +1,5 @@ -#ifndef RIEGELI_BYTES_FD_SYNC_IO_URING_H_ -#define RIEGELI_BYTES_FD_SYNC_IO_URING_H_ +#ifndef RIEGELI_IOURING_FD_SYNC_IO_URING_H_ +#define RIEGELI_IOURING_FD_SYNC_IO_URING_H_ #include "riegeli/iouring/fd_io_uring_options.h" #include "riegeli/iouring/fd_io_uring.h" @@ -28,15 +28,13 @@ class FdSyncIoUring : public FdIoUring { int fsync(int fd) override; - virtual void RegisterFd(int fd) override; + void RegisterFd(int fd) override; - virtual void UnRegisterFd() override; + void UnRegisterFd() override; - // Get Io_Uring settings. - bool poll_io() { - return poll_io_; - } + std::string Mode() override; + // Get Io_Uring settings. bool fd_register() { return fd_register_; } @@ -65,7 +63,6 @@ class FdSyncIoUring : public FdIoUring { struct io_uring_params params_; struct io_uring ring_; - bool poll_io_; bool fd_register_ = false; uint32_t size_; int fd_ = -1; @@ -73,4 +70,4 @@ class FdSyncIoUring : public FdIoUring { } // namespace riegeli -#endif // RIEGELI_BYTES_FD_SYNC_IO_URING_H_ \ No newline at end of file +#endif // RIEGELI_IOURING_FD_SYNC_IO_URING_H_S \ No newline at end of file From 608be8902dd1feb1fa28a7737a9c1afaf1a0b5f5 Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Sun, 18 Jul 2021 21:06:48 -0700 Subject: [PATCH 3/9] delete file --- io_uring_test/syn_test_file | Bin 379219 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 io_uring_test/syn_test_file diff --git a/io_uring_test/syn_test_file b/io_uring_test/syn_test_file deleted file mode 100644 index 10a9aa7cb5cd51f490e538c0987c6b5de07b5711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379219 zcmb4Mc{o?!_C{t>G|7~Vl_5ifGG!hbs7xV6nk0#mB(svtQ!=C^B&Dbf$&@KVWk`}H z8dMa8O22as>wJ#e{XNgV_qq4^es6!gt+n30_FnJW>+Db9b+@+Jr;Ih}rvIZg{m`kx0jU)0-nGDARn`u``7eCoc)@L;Yx+teTAl+Gsp zWhWOuKOY^P*la$X!1KZ$bU8njEwf8!YxOv|xZ1oaV3;d&pYG{54q@ycZQnTLWbXU5 ze&bk%{R8`dDmK3KbNE{1y?FHnITWY=qC^W*waK!pk?u@We_*_B&eUHtdk#Mr_7^Q) z6)bvQSfDXT-O^~?9IZZP7yB*hN37{)>evJr@$J~56=Kg!8VqS~=6?n`q#wJU7cBk!wm={GvzWyFysDKFV5IQC#lU*k( zRdE-K$LD#RL0CL)Zj_T7VPobpO|DQ$x|A6LW=kE4IeReP$rceCH{1AMvn$##X2qMF z5^qlMGJx3?ZHqtUOuAl2gmz#VObht`qAez|Kcc=->@8sHHI#{nGNpPWW4rW{*jKPs zj;#`WCF)@-k#6VPFbKckuf(kJFHnKI6L= z3CcTt3k7V(IcmMhC)Y$FVmpL-l?UfcQ|Z<{wX|<+l-q<+$$Wk8eAik9wr@b?;lYRR z+Iq7eAYy~v|1Ik|l-fE@UWti=%wgXu<5MKX`v(yk%N+Y_7l6zEjCZz3xij748$Mun z?DfSTcU*P9UD(!Y%U9Hj1s2uqxa>OZXMbsy<5$UV{vXtfpNWqG-*{f5y# z9>6RbYF1^63f+W?nN{1b|DTxK{2a#zEI8f3{ms|SkGpQD9!A8(W181kCyUX)6SLIr z{29i?ei3cDy1%1J6?4aIU`btL<>ajAi~ETPtDx@;OUfUX6kAPScYS7FIIw?yRZd}` z57RP4NNh>Dl1s`Dmei@cBg$L(&btBVZ!rb;@6{qWOjtlh#3 zE9&#@_6jwP3Keuz`v)7wyLP27&?+l7bXYPVQmJ(~S}VsU);sK{Q85HSP`@|sLqwz* zBJ7NWQl1V#%vlYo^pyqG!2a0}>m@oT-_A$G!~>vxb$aWgUx*osWvNQQF_Yc>^~W;g zrlVSL@$-tUt8+uqLG6PBXeo6|c@djzvt9thv5K-&oBX!NKmf*5=l7fG91%st#R5QE z0TR=zYQ(5lyN8eeGGK~sID9{m^S&P{W=K{oxvCVVgUV~#bl4$N=_ITwr}e)V|IN$y zLd3*_8frD#wVP?K>LRuqDvQ`c`b8?~&G^&;JDs;Tfu+|CdMEWv1GgfgVmU>#6mshQ zm!B(KTRWEl{haO#hXs93{6fUUEp3DIq~h%1Xkl#QXLhVMJ|gvM`8P0h?D-o*w~(cW z5JA;y`SmykW$?7=8}6Rm!eXS8EUVt|8GiZo?oL}^W%0q_;ChOD9BAasQRFVfn9~rayYs&a#U=OQgYn1&!h7^k(`85JAE>H6N3Enp3wR7EC?M@`_K&d&MVIQ}vx`R6#}wjeK)F z`tCpztbXOaPoKO~8^P*mm9UD_Oed5izlhk{~f5qx_d_7&?(p&jH@2Yo0q%zx93@ zA|{bh`jGo~56SWbVYyFNz4i<1n;26`Sf_2bHfBdJCKTkKAFK7Jd@xQyA04g$Rlly-axBC#L1oSpab=4d;8$vM`yb+JPdlm2;iTSu zwyfaiqcgdXR&U>xFWRgfY>jB@%-S!&YAUV#>F(Wm_1nU_{1nuF2CLjty05UYAi`2= zKT=NAENm_OmT~?y1hp<@$NnDG{ga50__`u%KT=M7ShlvIoLTHKfco*&EFQH|4@3l= zQTvggi`KpB-yYL20iaJrE!1NA1{DxNSLoyPM`LR>Jr9#o*fG6FmWOeJiq*MQ^yY4m zs!GE@UmEfS2qA*nP>Vkh6UjO8VfRZ!wg6^Xjeqgn?=r@ynACF$FxSYKPCh#H_zo;6 z@v7n!*RcRsL`-}^6;AEbud#|}0^9wVF)_)Y63h2Ic5-$JEU5AOYo&HKFn>dYHOJha zKBY)8abeM_VnEX^xAhq^6SqbYA+ZJJOD-s~?!PIcnz~0_(h#fvS9FBoq`W zJuel{GjnKa!;)I6XIPNGRb#>b;Qha1qQdHId4F?+CoCz+x!Gep3OC!)LG5R=(^6{W z4c11$b`;hmuT;&V;qc`UfJB$)!lC@9=@D_U0MN>52x?2qi-~Th{AGZdmg8tt&@Z?g z6_Z-|L6MTz{@HJpp>-noPj_OX>WA`|qllPzO8un!FDaGkb}#ou&@p+ibwGa4teYjO+E9b58P2F>&o~3t zt$#U=h>4$3HVs6>3qPaoVKpivenx$Zxc=c_=t5&K^=>fRj&RH6Ul3ujgrZf`kWfzM z{dYp$q8VX7wG*Db+UjoF3q(vjrvF7tu=1-l$69@N0MwM=fL}hG_jJ)w?F(X|MjzZO z%ae)M=pAET)y7Nadx8ItukcB17F)!Ih>EQ#XGo|3`DrPs`KD9p;;@Y;Bvjj#`AOle zirt8qnE&?Vj_N;ux;-PP=`F9qUd>6mFL$T)apv&t{{ggeN4q1|oqB647WEq2Pciyg zVqE#cH=As_0PgF4=eO)%Rv?3jI>UYO>E_Iw2y-6uEmC^`^J1$!qtErE0YpqSYSjlJ zJs`w>kv?eODe(T$lM#W3-;IkAF|m+RT7EPkk+7{T@286=&<}eZno`e-_HE$U}ss)P1Co@SZqgutPjd6_!-?Q^WbEeeZrpgv3*d ztoz8C|5)R?zi}V0{Q~#Z@7Ww1J)2;I4r<@FnLMPT_G4Yt$Cywx)jrImEVXDQxF0mP zw;^rOUDUJBU0(vqUV6OUjV)8UhxA`t?o`y)!jc-^Z{^vbt?!9wsW-LigQEXpaoG8A zbJquex&N`=&kL!k_NbWD6ACbAua??*&&bdnFxwLMsu`wg*dk)$3u?=B#T$@{$p~Gn zIk&_%$G3J&em#WKr-99Mr17ij5#AMA3maDKTL-IYeD?CgT>Ocb5Fs5L z2f4`AM5+kA!b5i#hbFFolIO+P=`+4-_M@Jpc*NH+VTd@;2@t67hMe$hS~*JI2! z^x8D$=u`_C3P!XJG6HjVL30DJ8UD;Y+W4*VqB4T<|OFpPhm@6}NqmM2s z1^@s0zWJr6aMm9Yli2mcXx%=te||JIfB&lF0#mT{pwh_=Z+(u;LBz#MKCEnW-Erb=iPs}nW-Y$(G9A3PcpTEQ+>sGA zqL}xzA{uI*<|5BfiI0t8fVpC!XSYkyhiiz2dQ(e25D^bGtQHLxuWW=BC0Frwlkojb zs1*;9QS|>MqwFN#gf%BLnt-jB7iRW|UVMB7(N-*@$U2$Hmon)JSNE8sYCn-a* ztyba|A|}rMzarv<)M?}Lyq9DlIqykc{a8}-TSQPkXRLj!apW0xC4+T2tq#cYNMofh zeM0kEo!Q%))WH4O6CSpbkzA^Xs8~XgB`=v!pFS0^ZfY6S0{2UNO6Jg|beuxO#NGc_ zModm9sjmy(uK|X>Hd^R;@OTqyMtM_DD9BP-ZgIyob2JqIQ`uJh*3#m9W<*1=f-i)u zcb85Ve3pWpbaI(4Y=G%Mbm~vs)k@U$#78Ok0^lT#F!g<&qPwaB3O-Snl*@LF;{1qq z;=3vBHZBuxX z-!wNq*mwXo6s5u%L#bB|sP!(sp&X<&`Zje=HTve#IlOvvV17>jmBwZn zf@mqF=p!WrFYCs^8%tVvU_})Ue!t$i_)r8Qu@~P+9#O3tn1aTKCakVpw~tneDFpYAd^~E*XCd0-A*#6^Whwf6 z*$gaQtk8P#eDWe{=P;RC^1&vx{Y{bE@r4FkA)i`a{21zA{_F>$nZzcw?ww=e2@5)T ztTxHVPA3zr;-{Oadv5l9)`w)Ub!6{sCavQ_sGA?QqFn!x5k0$x_Xmac6+lS8cNg?> z)XqnhP%&Ax5K>Y`6wHrEQElC?2rDXg)KWxb_iNOOA6rpE|H=sKYhvs6v-TAN=zaOT zHNAm!|3i-2$HV1*i7%+&W&fpZeq8;^ z<@Af&oWa(Q$9w%0`E^m#6s!2iikB>Tx()=W84hg82h7a$6Nc=4eyH~wGZG4_li_54 zuY0kDv%&x1x2BDzvPuX42meE(XbE){5=!Ojp;(nY%n`7tHV;@8rDa}4t)%gU`d3CQ z*mW;b(lCr{AXw+@{2WqPtcYkV764iq4KhNvx^(+bgZtzZ&h3Vq78{=SqW1TbsU;uC zh+p>Go_6=~*hA5?DqHA&o_H@eqMi7nir)Z@(<4~ta4r^Bx&!X_gOfv_Z2X4PD5=!TzAznR%rd3sg<0#jFUTn~Iant(bkg`<+Dx`j{A zVA=Brm6SgHAO?SkT-D`JHF5{%lwK&#Kmg9tbc@r>`?hOo8Zpl;J@z!-htFn zWD%)GY4ednqI0Ok-EhfD7ofjK_V!ti=((u1DdsFkZ~ZrMfd1xqcn?9_HW zyR;6`drU^ryceC8QHuu8|J-oqH#=bJT^-5v%X(IWh)Hd9kyjChv3auY=X_#dnKmr> z!rKPtl4NUASW+`wEp&f z7yfK+RGMzq_CrWX6>-)tZs4ZLawd?F2h?}Zl3_nNiD)MFg=g=Es7O2Po0A&Mb7!o} zXNz4KG37D0o=Rf4bqQ8!-q#C4`a`poQDL!t|6d(3u;-XqjI~WJg!Hce(dW&cm-G=q zXVko~N?#m*%d};ZWfCwmm7hLY_x)>@UftUUD#cgXAt|6MHmYyecb^8i(e;R$AP6x9498ZpR9e1=si~Qkp(ZQB94cK z_g48ky8ve0l^?}}uf|Yk1!g1^sED%2aMQWvm6su*%DyBh`^PqDBiczMly*NM%dv#2 z?8SOA4EXsZKg)eh=(Vyfu%zq^+%CjP{Nh5y#S`jZ6=Aza)57#2{Qv}@NG49yNG8Y` z5flpmt&Rp2(NS4`vrWr73+Nwt<5YXx`YRLzf4+|^Jo(?o~fT454 zM#tj z+*{uNk)QrHC?wnN;^tICRO$)mrQEw56OH`F#*`Enu_a@QCllLNWISC3$8}4|%iXa* z%lC^aE238CSjk6=DqKfQaExxV9r{FGM@ZR6avbz53qcHk4W;BGRYaM|)o=HimOq6p zW!Az(Re_NDvxu1Z+Lu2?UhdLLzB64`&O#htp8{D|f;tX$@jpbJJ;YQL&417lJL=ZR z$7K{xI4aI{>JE9GyTYdEz*R?{A{~)J1XNNS)9H@(OMFgGUJ>;p> zYq6^Njjk;a(KA-pE(wM0MBVt4|659xvRvmV_?prRE9!Wqhwt`hFH#Wg#GMbOOvt{& zE~A#=6S5HpWx~Zj@RBQPys!JFSl~L;^q*1nfr#kKZQ<8hWBUZEJ`-KJW;K=Q_lUMq zsy8+E{}GFMDQ27y&(LxDt=!(~5r~+N`Rf-Ccja&AZbVcpM_vDmir8bab#Zf_jU4#DKdNx&Csi>qL{v;e zkp(ZQA`)3AGA3N}y8!b=0@J(Uu8j(am^1PTRD@Bjl8{fJJDH=2zk-i)wG1N1R6@U> zEcl=_;jBM>s&!78JVbQA+O(WZ~j5& zcx)?jX-YYs$bzTxU1}5K=w)fJwD=^4{QkdP4TurtlfY!jzmpPCUJZ;3Jm)(=LN!^l zPH^t}=z@rfuc&_|#FB(JUVr}V{|e+^JUk|S^pJcIBB&a*-h+B4sC&+W?gYCe*ib%} z?LPIpksW!S2is8GX-x^w>81qzLXXC+@^p{L_R;yb5?QXyWvJ8U*zrVLQ&60&jNZU< z|8ZOf#MC#s?c$z}W2oyCiz)5%4N^n|_gxmz36Rx=m~ss%*3~4eIf)ok8|ncCF%4Yz zAx6@8M->>_F2;Dh)Vo9z5feY4NclX(Jw40U^mRkn;qAHPl}T7)olJ~4YYZYNR_@Uv z3R(Jd*MND~h06Wld}jW=TR~LTRz1el^5}N>L?B6-nws5b`h7&Pzw`0^Dhh2 zZg$CX&&;5rK;xX}AlS+y6mR~agrfw}))_auARsh`NA8v$btAvpHt<+vd!9q^3?e4A z%SB#94E04G=KB0&9{9g$@ZQy(qXw@LG4VTt>e*zyM;krLU*9yg={YAaEGi%E-_`eL zo%tUwHz{pC&=4ogYR5~PB*>3Kw)}4QrXLO%Lo{|q03c2Gradf(n*Y}ch!W>j?RZht z7J!I3qs<2yRdadOBi6Hf_JZ@<&sTQNmqfRszp6u=(Bv@-k*0g znUFy#B_9ZgCDs-^@(J?IQ1bOiCq5q86Nx&*O)2?E0ikfweMmLCF%foXZCN_EG)6WLr2#!21B(VyWe?E}&LtGx7v;E zoFSqgI%3|Z8!4bpUEzI`e-*?_QG2^RJumYhqHRTU`4pmJP)FHjRJ*W7SsqQ;R2^7; z2HaOol0Tcd{H-)HOD^^nIrzh8*~Nx8u}Mm$}_?EaBy4PYD83g+Y1GyOIAEFxg#%=eiwIv zsVhe;JeL$KLEZNFB&ZpsJC#uk^qKi0mpTrPEC8zH)y&)4Kc=W5nu-;Cv?~)RPtM10 zb~wgguE~Wj?W7^vff~DHIMO9DK?gpb;N~!or5%G~} z{Z--PTgc0I?PV#E%SsLU5izm0G0l4@PNJ2p!-thh0)hN1<0{{(@7+P2lEA#DeXvX3 zLNKivkK_8OUKa6p|?3X@*SFzkzniT5O4 z(|QsQv7W>xyeDCO`P&eefjK#C+_30$b=6j*bVOL}fTG0|YLi;&!CeYAN#xgs!n!-` zblZak5Hayx>fd3e7Yc4aTHRfiL&e9Esk%h?ozN&UC^jV#LeBDOProW5N4L*s$4i^u zz5rMN5{-#Y>)3vxo~HOA^{eI1)|vxs<<`={XnXy+Jeg(jk&pW zQAH6fs+5n>Ypi^Jp|($w|64}Qv(Zah{)>wra{u;|t$PAgSMEc!6W>s2Eg2uU*rgNx zsh>WmPIgTzKC7N9n-`9%b}B3@Tt zJCc$VM-CqGI-RlLYt=$kkhq9g!b{eCw810ka)!jV-3jE(am0hPz3x@72M}$=_Y~SG z4I<*vW^TE|(amQe0M?^I(v5|Sln_B@1OO6M>g`VcEKe`;i`|nVs~QKj`HvuC;wPU8 z?G|c!md}B%_1Dd_cdR&{LP|X@seV@9oZN~IORM`x9r0C^aed8(Z1SBh|CPI#wdWuo zsMy1=w7L&;glqo~Egc`1c~JLdTZDU;$mPF8G?Y^Jkvc+pn^!<*VGa34QIqez!qWcj zs2>B)IHRDLlFuj`5mTAV0MvV1er#}$%2KE7edt9oQQ6{Z~XB*d6!E_MLnpM6|^Bc3(n|=5<8xr{0>LdX|>_u=;N_|L|(z z268k`q&Ld#TucccBBlZh3q-VX!{KN@Y(j?J&xJ?(*Rj_-!1tB?Po;L9ZW=~}#PhT8 zpUU*Chx>Tg{dJl^(`Fvd9dm3tBoRUJJwKEgUVc!ioqp+9?D-cSFS*qVqXc~zr1X% zKETYf9uX7s-u1soi1us#=Z?%xzYj!}$GZ1Y7O z#KuIhms&Wv4I|H6CHpZ$0InrJdy`?k7gg_LGKv-eC{WV5D>_2l&iKF*c)am)%@2+( zsD~b2^!|GnVVbl0#_8%a3&GHh3+|S+F8_hrMewH9e2`V=TWf|lD<2LArZzo)P*+EP z&FFuKDee0W4fuXT_n^Y7^p9@#VCldGE7cu6i>eV(u``MmQpi=6@U2^q%WIJnVn+_A z3eMkN{u>b!3n}gU4N{nUA6;WM(O|R|bj0AE2`+0k`~PK1B$$t!=F{Gf&55w!(|ig# z9oeFt$zOs0`0M)SMdre&Ej0X``d3F(W}6;u(>g)U@c)#zR9_Y|A9eZyEBa_rg-ne* zdBEV@{7iAkDU--&>mtrv>_m<#KF#-UPANB)cyTme<%MMxIk%;6gI`zyIxOXOmy{AG z)!l5m8kxy)#^uUyiZ#5Cry`{`-RquEr^)Zeitbv z+8=yoeRFiqbMQVTO6F+VIUm#>8h)tK+I?hF{g%od^x3jL0oK%u+=8QGB9dN+mdh2s`0Oh9|IS*yXG=II>QcpXimd%eAtCAGJ`i%Gh3q12{A|1^ zb;tM)#GuZo{Xj@$^xx;M6`$7xyWe9rL)kEE9!^9|toD;wQi{JIkG=KngN=;fvy7Yi zGX*X^t9$~O{xXL1dX~LJy)~L~NI})lzGqO@E@(bEgpkX0;bGa4n-3A~oRLm|IkrAJ zR^ZsiW1u9~+r{;sd2RX^5mSL>0P0?Hp6RY#O>$L3jJEjne5mvNuflToax2^!rv89c ziIe!3ogB<(82o~Yc(MP^I`vV`l0}JAOGE;HkeET^^T%kp8xcYDoFg?ZXMOb}Hgw0uID_6B@^WtYAy92;V-WyomprvJ_sqHFkBAnMH3RKg ze^g|~`;&_SZO!)RJ99qjHzK0dVwcSn+lr$vuHf6T?F*o3IY)U)axW1^M8i7HR5VMy zD$6j3iA!SBadY_NRol$#YlMWxE|Dcvn#b@aGD!P_Aur>mjnQjIiqbEGWnmc~P8ZZU zj3Z%DIjF%oaJ9TM*?6pbC7|83jr^dVm$MBKjm80i_FB~T`b50(Z9sb#*A;tSqTUb@ zjm80imbyBlV99*GKtS7;y`lSFjm%R-G#Up4+IAQI%Dh2^3CU>=^z!)1R$l0LLPBGg zkPs&_;l*BqstPq8X8PC>S-XUh&`2;Yn3b>JK|4Sn364rbCQid)wWXuZyDug~md@%p zlGND9*Mx+2aXL%CPG>3oQcs=LB0m;^r$rsr^uFqGd`MvU`GIZp8#o*ygZx)vp0fPf zBr~^s=Y@R$m#(hGeFoU?@1$oQ%A zFfSHl3#9waZok)gTU8;j@WZm?qufrtY$Px$3vY22xDEO(L<*K?gQxsAD%!Wt8&^a^ z!|M+0%>+u|Jp1^Z7dvsP0o*P#1J~+Rd}hdSdfDECg>*j*c?~a#?r@V5Zxl#xQdxa}RTD3-`E!;I$vPg1kQqEM zWe%)f^(bWz@Id!e<>%P7ACX94_>#kZCXF~4-nK={@hW!SJSzQe_Y**~Jm{I8=M#{N zgoeEYL>>%8ZrxTeQ`VgSO#csvqWGk7rX3tJH4 zJ-iKk9UgZ5t$FtY+L4O;sst-|EtdMT);L_PTD`gW5)je0hnqRBDOw82HYyQBdigYe z&UmcYb_I+(^e1W8+=7(5NND&X2?67XeaUpBQa0_KS`iQ-qwFYaXeerm1c&=7xNZg! z(nyhD@u2SLb?d9EES$ML6*Uoc4UM`E#*5R+*As(C zaJZ{X*e|gVTY5dVrOQQ+7zyU4W$gwY^u&C)RzGoLM1rI8K;##%O1BZq;?HSd+^<9i zTg5%$Oh{acQt`a;1ek^#x&?UM?hkO%fyhy(Zbv*LKb+{Xe#34^xyLc$voon zX8JfJ@@r4gimtscKAi$0%5Hq>5j>E)6A6t+LShCHUM2A*>m>%s6GAaOdam=TfLTaj zxTl3PJmt$2V_xHwlLJIJ^Ykr@x>T%!1V<3T51X(Mb{f*VI?>(y$ln(XM6lGyynS|K za|$w^IyRIvRpb~LR5@%)=3O;>IpZu4;kTqR=EX$lB_ud15k!J{&|Mg@+vM3HI(_sX z2>iJGaf1z7>~I-3l@K}xRl?GFTSNZJ){cQ;tjXWs_;B0)?}cj|empFGut}h8{Wu$- zjf6dWxWXqa2GLDg!9<{K>CugoK2S3bXgo67??0NIMN>-DU5P-OVFF>@7rs4=Rt<>R2sm>B}pde}9QQH9bShV#)qX1hQ!VO~c7A(DbXEuoP4?_2z z@q6&4A{j>fq|g+dr?3rVxqJV%d>@ftfOTTa;abPFCnwOb@OPkTSb1}+b|r=h-vX?L zFL927(i&&bu<&ObXjq1wnoER)h7SYQp~@{>=OyDa(XjAYOd8hGZQ1MklgwYhHgxE5 zl5SMj%FjqxBGdZWvwNzORDX)o^fFKT2!P!gU!3pO6vu)DMhX6WeAAG(V}D@!(c}P;kCns%4d~`a?7k8LZx8!OMAu-PjltKvfe8vSYperKSRR8y3!%gvvj~agWMlg%qE_k zt_MQRAKxr?EcGfyLQ|k^LPSm#2HHxb)e1cV(^fPDb3HeCE`bE57V;kyc)xtx*EOW7 z4rm8e53P62)O?4C_8$~%3|9!bc{n7FR3c|%6e!pP!04)tD6kz!oNFOV3;(D*gun?H` zHR#ix$dZSJXr>Y0&P_E{h^^!8g@tc^FJ#>SXa-`gA;x3*vWRH^K|$*K9QpHC53UCa zLbNN#j6{xVAfYKR*HS4cT&mOadHqjv`(C!5xoV4jGuk1AWkKx>3aVGGEPBZj%>sU! zCv^s_mDrkyWSJWA!opP4h@9G-m{egR^L!Z)%6Q!Jwsk@94J0%L+F?xO)L-9?rS$9y zT437jW$`gSY1JQ)z|?C0gMzo0UM_dOoNWyhSR4+Y-^)~yhJ>cT+)t%o*?2Zp6k|f2E^KmMgfsitBUFrR~==H2h)nrDRovA+P9*aM$CXvaw@E(*n#g{=`c`m zu1R(AiWm>HmXQK8DUtExxXLWJz5iMkdAG*ma4>e)T=On8%ZRTLC_(#pYw`WUcHQgX zr}}!;zv2l=C(+P|sbLD*m71aTXM{Sw0@|4sJJ)q7-N`~jBS!EkXkFDFC-k3r>;OUs z7Wd0HSC*qS?i6T6DUnkgFT7Iy7=lj%1rZ*P<&5O4GmuPEU?#;ePC?oCzuhU{zmQwx zel-(k4XLBjNLW*s#1uChAFdZJxDsUrLGx!_wY7C``86~&Vu*)=_O^fZ=oe+{BoM|1 z^u@Owq*hNNp{?kbSU_A~C`pp@&6R@YiXx;7*@k!j;XUr%X+U6ukI)n|IYK;Yzbu8MKalCeSpqh9KS zqV%acX+Vrv0p|~F4G>V}m;k)AI79`UMi8gg>?f)3N((#>>{i@o{^D1!K zDA$w8w%#cY35+VyqHs>DznT5Iool55Xnm{q3SWuk-++ilD^3Zt&939>v%Y!U2ej_l zG0$Y(AlZifSnt$5^P}l|X1b$lEn5$0 zF}eVwSs&f+tm5<6M1nJ?U6=Y}U5c(8caQAMclzL{atlw#CRLF#BrGZktvCtVrHVZ5 zM?X6Nn)u6Weg|%SM%#JS^l2mzXgBwrQ0(h*TLWkndyjdnOS3aUw2ejrfmS##``x@W zPftK&FmW&qP`BtnLZfaWE|{mRhq?2zP93)-E0F#UtrtI33dfMpC>-Ed*7QAbi!yY@ zmIr}pll~_XQe2LsT_Io_2=@B{Q^&#$?5b2np#Sq;Wjp!?*pAdzf3Bz!=pRukZOe|Lv`Sbga=5*%(^%JgPQuZ(Y&+ss-E-aWc%0KOV+ z9n89JFg$<+htWXlTY`o|xqd?NVmqG!+H&*Xsh=iJAnODY%?($}42Q1J%efpO8#6`0 zVk@lvc>hAOjhYNM@MO3WCDX;R@Tn^VE@DKbdQN$79}*hQgWe1t-dV~DeAR6f1Gtwr z8b-d`2j4=5dtf%*2Cu;H`dO;d3i3zBS|DduiH)go+%_m>jYl`2NsT3H-A(UWjbt3g z1BpiP@PqN(9G{f(PH>eW!n{k&jcGR$8o|Sb>AU_u{H}jOGtW_cEI1tCiZnD?pBuK8 zAi?30gXx#4^lCc$`I6OJ&SdbFC%WWx+C)5Jn~PGk66s|(E_}O#slN}SQ4C0dBY1!-;R^gpxb&=*zx>_0hX8jZ#Y97O;K@p4IKdfk^P;w`uTc*D1-_bC z2XBaH`SutIjw&9A^fLF3J2?{g(E&790-t@YrUXkQ5*lSVayG8<7uHKG=l!*(0Zdcr zea1Uly&O%zVWc|4CYOTmBcF@d%+AePa0=pfZ_BM8_d;)pBAJHKKpT!Elw^GSlUp(QnlrKn8IBx|~TOk#cy!#JFAm zwEYh~KTusQr`%G{%j{Z_4V?Vxc)A8co6xXvZJA zy%;SEp$D|TV`{hFFih$pqR}KAftKUOVKnM-gWP_*&2k>ZNDC?;p{;P9*3q?~qwnod zkL4P^bOKlq4NRKtmMQxzKjf9xNKzYn{^@y0V8qXl zPt7C9V|m48)DTX(i$;^VK|i;-;Olb~G_ z6Q^_OrtfUo0Uk#Ht<-e$XzDGKKS*d;l@tQU!X8{k2PXy9f5(gWL0aNEy9JO8?WxV|Hk25aS^WB1iC`-{#lC@@cmTMDA0BIKx1ZF$FDycjS;XF(_H_g5;&G`g);H%2ey>Arliewue zIBu9XCS>%77jAboBfaWCMrSYEF48kO;eZY|Q%0LS<95pR_9jPkT%Cs!N5aF1 zsGUK?*Pyk&@A%AYAat$QjhxRc?chN|!-yc!2qK~+Bbn8gjQoJm6?XStZaKI#8VQY9 zbI?K~WVFIShVVC$UL7#*{82tHI|W&5Bseu^+P*~O*R|3&W%B)(?STkJpL;b*B@22@WrZ~mEbE=gW;VsKO_Uu ze5Kq%6GVLeGy3YhG1FxrLN}w@;y#PXI1(B`#0(w%{ki@2FI9ErU|es%-Vy&`X|&M} zDiK721t(suOBm^V2gc1Amz}+mD-ul&;>I1aqBi&5e$&md1hLe43=ti}p$bBUejo@MJb7SwH_dWlDtA|cIK6=%(5UtTl z@GwJ1uRZZ>tlIlpIl!4owK&e1zZI=TjlbxJ74yOH~;}?uwGL*M)kP zWk{<;&6!rT68UBFX=S>3epmvamBs4vAIMR?h=hjmFjGg5{25F1+jYVn(A4LSiQDZ7 zK%3CRHYO5{;K8eNYytBP3-Thg;@-{NkWOuTB-;ocW(Z$D&OsqQgYrMHm4rF&$;*pw*50 z=5iT}#3Kcc`cYLleo`N_b9nH!GpYsBK}3e-RYrCp+WZ>ED(&kwLPuYYV+|M4s#y!H zW~~j=PLxSljAR@E2Vb{U@M217R`bM3lZtMMCMfuy-f(*HSA@k636C-@i3@3^S`j|R z-#H5*aA|b=43E6}h1LV67OuQ_;rgrebwGc%n;WbUyYMZxowCxVXqMsAl9cQ1!;!ae!dU0A&o^`Sj~xpZW`M89<=K_{4WB9_!C{9( z2oy_eF<)6LjMvPw-7x$E&`iq>1s|oDpkBYz&{S|9G8QG>va~ZNFGT9z$@(_RE;x&1 z8&y6KJiI;g(9!?+l3x(GfhaAu-K-Y8NN6|@q>LkYVAv6t(B7J^0dU*gcP030n{^_? zkur|p;eGUzlZhUV0+9Iv%Dj_H(!cf~!BO@kqNDLJB{Sbus=EzncxSyJ@7vNU#DPMJ zn)bqJ__H%ANoVWBaM&*I&x(-nzW((wl4&s#*rqhqAHk=2a$Wlw6wQ)^>(#iL#COYQ<%P?+?!xl2{{AX%nH*^>ygV7*Ndi#LF`W8Id1 zFI^-w>KRDXtA7qHvq(F(VK3Mg%Q`oN&;2}_lBTxfx-N_EnEPkj{){#H6|S&6{KIBd zie303jbs~z17g~PCwwBq%jX0+P_eh`YU7n}kI`QKz%v2+ZMG>&2_enDS3J>3VB8Xp zXP0snW4W^GN+jC|xS2xwRz=jk_J>?#BUATAIU9#rW+oCI#sevR2_F3JY--bBd%p$p z^p2>cvFVdmG+B;Y2VbAlmwJeCGORk+8I!t|FBE7EE94P6)Yyhrc2Os}iEE@$?PWVz zf2JG)w8vjwH`|(H4@o0^Bt%Jv8+baT$Xw7--*8o6i_3TfS(cVV52KIQ-s^v!i?b+b4kkkAMsK>7}1!+Wgd zaw}ra&SIGbpy|r#trd&B@b2`BBIec8bde{ zZ(j8;yQXX51VnJ%J>@#*>L#>8pCIA}$Pi*e!?aCALds^490rtJ&L3mn9wCQh9YzGH zeTj^?bgT2pdXC+*fe7|=6+LS`vu-3bd}o5s&!;kCxmn-f%9C%%c8hRL-@6M3TvL(Y zFd|6f2qNC{oj>Dk(0>?=E2=H~u_{p0772|A-3%q|-29Ag!8OMbtwpb}o&--#^|frH&tyv> zd5SHPEU2i78*UD(JN#F<@79BHGD7krn~Y6^kkD|M4-*>x#0~dF=Ki$;GDZi1R_Rr< zoO#8}o+H6ww9?)unUd0sUVFxV-OXMMwIOrUuzy(fet9H3%2#i=l&))w8{SJP` z;PgI65ZAdYHfS9KwJh545QQHP&z@iC&PY5%P8T}r#)`(fxZOoEO)cv`q;&jo{<)f2tvVqD1A*J`0$JPHz z8NUH&eVTVdb!E6jkc^`aQsR{+XPUA>b;saXBqW1P%cmR9LifZXq2ZenIY>!JxVT20 zppxE&ry&_^ek?9)t=NsmDgg(Dt5yU)NO{dMB)0tQZwYYrjX_H92VH-EB=ayWO)g+U zOZN&obc_Ejt^>69-7EQpC(Y0f8!8cmmVVqF^ge0r_ynM_=<1B0loN17vW=>xr-*oH zel^stiVcXka_qDBSg4W~5*i*k@+yuXqWN*-is(nlH`276Lv{m@1ss9P{W!~q%mVP>{!@;l+wp9iXAUkIV~joEE7|5_v}xz z7zO?zg}ySAjQe>(1GHu)MadB}AD0fDif3Ht#lgO%tYJ@0Rzn?g7{pElPAyTiG{M8b-@6y( zH<&B}G^s~)kG{SZ%H64a<9y*-9{#eQ!093+|P?H2t#LFN^cY%FXJCF z)CA+!j|^5@=8j|_8HeQqsaA=6INZ{yw1Yb+9*nE;ObMxZ6I+3VM(_aF$Tv)|*MB0m z2J-VrT9aR|)dhZ&W_mrj4GE4ar3oJT=KGwl9$tSGjJx{wIa{BM8QT3jer^TM82b1V zb!P6#(1v=5T-v(uRtX-u z<`w)jPmM4JSIe%gO!3KMosWb@@Br7y4v7&#+KQU{B$dAHOb1ujxpyxXFI$7w+owut zf(Ox+hYu9#OtCacv*q<*bpHsT-zg$E+N z77Sf`m}vcc6pm<)36U*7;=iHYiclVyB$V{S9QQ{ysb7Y`(@j^M2R5p!A42ui9{Yui zsm5{|p8E4Lt&T1I(%cSkA6{MARwuI46d8^z_X)U1>m+Vv>F&(}R*Ur6{%&+>`-=oe zeL^f8H%@r3^Z27~?00ph-(6ExA5wH$Ie~u1O+GM540jK_JK4;7lwl#%BXsHpL%AGk ztB{PNyj_9|>B?EhI_G`4NOmC11=-D&jAmCMVPTaLdFB&B+A1|p!OTX`4Z;@Y^+RIg z$1P~R7V05Qpq=?Nd(YEf5AVWyt1tOBp=n&5j$|A0b_wN%`{W>N$?8J^}^Lx|V zp7MzGLoKaTiozK+InpU4K9JD^jOx8oes3b!_!7yq6}8hsdLanuO69BX-*c8kK-{j> zeVeHLCUy=9j>>`+ehJsZp&eS4v2hm|r<;($7I?I&76}dC;m8l+R^v^oRIcsLvbHr_X zgGRS(xo^b4GSF|SY@@+}SDG4-&~W3(Ny@2)M#FcmXa~L7=fJvyt=vAx_~TK(NTl7w z5k!auIPMx->Q25De!9mxFFEHmT0;Z3j=YIW$8X|JzpT}<+xmvwavpS_cE5e6dY20m$xmi-(@vJH1t z8*bvJhS#+tT!0fpe)LqBXmL!&$~ zMxX_Z(nWvyY|swn$O!Z63#-$tmLs7(mgtA}2tM=i##oQzz`LvD2VG_TqIvO?xzCWW zs4tAQ;-|FZ_g~kqD5`XVpGzC0j|*%_4@W|yR&j)INa7N#Z?+tgg!S>~ccp}pRV`Zi zi>CtlnbXvz^rUi+> zwBalY3&hmNwIM|t)$}{Jz*U_QrwdyetI%fTa5;$mg5lK3MLeTXopH`-Fx{HWdR_B7 z`kVocs6x7SrjRyY5_o;R7qbc&XPAC5A@HRunx_O07pDiP2_bE8v1sevQEjr6OIv)j z$#5hy5S<5j5}kk(+0|3<=8qn^{c`1$U0_ryN1KjSqdYZ6T&-sCF`QM4KCb{PnB{Ty z?@x=2Mv;u8<^v(5`L8bx_b*+kaV})-{#8)`D?)_3c zANxf06cQT2L%{UpLWL~;xvwRUIr9@!iE6-G-k`Yd&4I}PWISzn6MYKLNnreQVJVN8(T5=<;V{*b*|L$e8DclKNk%lXA^-iT;4{Xj@*#=~!~T~EE; z5829+8Y=tk@CP*YOZkleLQ3b~`mHNq$-oT>@!a&bPz#^`H6+vUdtVsR@Fy;%yJCMo z4D=2ohaab>20mg~V+KTcnsL&?G=NXFs5lD`o^+;R7<$&-4-mrRa#Z`{onc&6v~BP2M= z8c_drr{eg)vS@SlAg&wrzRwGkVXjG>-e_FUjGtA7wYsByN7H zf`&%vvl3_rSneBX+-B8-^_D-UZEyN|u^J>a$}^zE4fpr9bEk` zz|{I_sX$2S=a=VHI>jiQ07iecG3ZIS96)QeU=IUMy*DNVQre?da-(zWVRDM+%bl%r z&P+VeMe>x&f)&ofhv?6z)YsXYf^i*Qe`^}<)J`Iy;d|Tz=u-9It2e&7l6z6Z>llcf z;sfULbkn_vk<+Is2jXURB~$F2IZjGs1@S)KAjMYwLm85B_$f`kWkP%??Igf!*HG)JJ2pMK3GYx5#CrK;buC+8rcQF&0oc{nkgz%9Gv zmk;ppQzcHb_=_xBmlfxsZ3Yj=>H9xK*M1oQ9=sCFw^X;ULYsr2N@;?J;q#x99hTX< zgK@9c%8l&G*t8nSRopo8TR1{ESoIlRWym|&560O)dGyjKdgDSQIP6AxCJ)Pbcx)oJ zNs)_WJR@~TNA|7{5*ltC*=O~^M=9@L8eP5U&xwa%9K*6uDVfTr|NHe1kzU;CKW3f3 zaA*|J;x}yHvUJS?v@+X|M^FQqe&vNtJ*M1Ii;k<=v&r0 zU))YMff){jdJnuhHiCqQDe0L+>`N1rd^N&Eej2`-GjrCt*~xE_&~PH+VF?pNj62F; zkNPughtRbMcdcmHF6V~?hbd{&I3m9^(z$(>zjh;Qr58qwk5)^wpk5@`l4t}GYsL1x z{rqWzJS0SNtdipIVQ2L24S5eoB*gyPv3Hqu0?G0C)R@x?2Ca@5Be_bgAc&1=*xb6+ zX`hD>7$?qNEvId$jP_zF&I2jq2p-s<=6yBxdeIGV!@G`~(j8o}2+24cjvSCD;A{gr zj4!VBnFR;+o|jqN4(m(MJ_Vr2IAY|3Cr)0MaarhZuub3uw>VqpPP8HK88VJIARK0A z|8!WS?*g{Huv)M7D{{^*Bv&cL64B8(9cP;vHj$PK>$gedAyX}jGvXFZsg}I(^I=_l z{QIQQ3i2%tIlenvb8e1tAelzZ1_Dh-ah$E+-kyB3^u@m9BGotSY-CZu9n|3BOA))a}^v_h%4lxyv z8?N+|x4su%(r@XSQ?HMNhOZBJ3wUZof&^zKYd5N5zL!X+mPl*l5I;xT;ZdUIsTrMd0I#UrMXWE!K6jot{*3zKzKq%=j zetQS|6@uphP5os7ui~9Rw7CV02U1%Soh5&Zh!Iiq@QIcQib8r$44A zuB0W6@6GLbSLP4r;CQ4;9rNad4M>3_csM;nn3oBOa|vdJ*MhSGE4Iv*%xN4z!lMdl zf{0L;AbwqrI43}hipwr^qCc@24UM862qAs9s$Mj|bn86Wlh%KV4Xd9!F9r#X@*{7A zkoL{o8N9)_X%X4Kzh1I7gZ#$EwRFz6!*eRolnus% zJrguE`c7lLQM#Tpi+3KneV`1?^S}C1GwYPF8IrHKc~I|9nfLwyoq)k^t!^M9;nA-h z(k?D`NO08O79;MsIqW3Zw111;hAyzwFN=`eD?PzTXq2B4z?JlE^ZpO)?@Cm_GRM{u zK~?rT#0wV6JBYma*${i}x~@3ak@bK!m+=Wpj(P>+%`fGn69R1(zxdIrgF<0|HnBY= z(@^T;K_ow^yApx6VilKpMPR*s@-viT?wu1qP~Ji+$8ZToh*yEDMWrvug2wl&RXCD+TALqq{+w; z1#4P}Z?MGoWi`Nqh4n&ThL8d$Bv+|CsNg)bzuK3(Rl1&hXmIH9vLmUgPJ>8jI1g5j?1~KeWBbevZ_G=Tuf|%G{(w+~q=OEk1&W&4u^O+ZeMogd_^>AqIL-FTb*px z4s%D)7mVw02#zyJ#Z>PcAGsmM>#aH@6EFyj2pM%aWL|lSooB8K*%ja~I5BdLm#Mcn z?0Pe^4u^Q~e9F7{#N|%XX#e1P>*)tWzhNuKjN%XvKiGPewhg@{t&iLF*Ss_IpQr%h zf&S!36o>YueXsoUZoBA}VOp2%;_r&QTL~-YBOY)RhjXt2V`C*=Y%I;pY+HTqv>{ie7ULh&0>(Q%qR}=AT*u-(3F9AZtQ*O{mSXTdF#~= z5E{d0MG1}9hmDTBxo<|Yg}c{zZW=GQ!5Rd{Jf;uO$Mp2PhsW>sA0>BSU-IN{n{WHM z0EWgm9S|BzWq9qSigZJ~Y_Tp~(|oTx&xD~dNI+1^>1s*CuD(h^@fZVl&bxQ4%7&a5kQOT;h3 z6B^|C4>Z8R&Z4JIF86*L4y4uFlfSrE3&P-#Dd0O!BNgeli!;~1dVYgk0bt+5-EpD2 zbq7dU+EPhd1rksE+;qJy8%w6*&o{tAeTBiMqO%}41`nv^!%X30>jlH|ZVZ;%Wt|(! z^9fcrV?5G55=i$)%kKSNM)r`XX>pb<1BbSPB%>4^d!!pxq+iJ0*EW46L|Wt~jQ=bD zaDh1N^QCyO=ERS5mkQG3k54RM5BE}u*o{AvB)8-F^Ft59{6ZR!Jks5#MNMS?qjz<; zw^avuiDgHD(pw|>cvz1d^BX=#*9h-w&lLBLt6Pt)>vBf${r#uhWk74kco2>bq`fMS zi4V%Z--4|x&B;E?XIb}j5Eiv3N#U{hBJ`frJX5;gBli(W$Q{(*!=XQS3e4B1Jf(lp z(qCQ6Ds7$DjAav_Bi*=4M?wiE8>2k~$#$sl%$wNTo+bG6UA`^q@0R@|*yIyYVqqzi-H=1nVktdBSp@nB@XMUB?0kR7jHLbUn{=Upob(d5zm>GqHR( zthho2(&URnj*^I-NAm4#ZjyQ2q;z!1;$naqP_{9&Wi$`&jspR@`n!BF55{>9U(DTk zz6pdzFI?R}JP55d`&2J?N(i4dvnTc6JJMJI%Rta@WE^EFJqLzmScda>=I3f5ymUrc zPafz;vOEHb$Bd*A5pQIkm~%AnkZu(9akEt;-9Eyugj139zeEJxSQ#9>Af612f1fm- zRj@qnK?BD41aI#~o{R zzir204jtN>4!Or+34=M(BWu<)3U;OPt>M(ya9~_fJk$cGikp7%ZvopmRGv#lo38c84O&0l?OAb@ZPc-?4b@v+K%^SmO1(&l_uu zG+{{`%uUWH*k+$A2Ah7`khjZ?rWI!XI2+amQXg}ZJqqT%tM#{1@VQVdSycG@;dSnc zu)ge+(H$jY6ijQj-;w?IeZFBZ{ZlQ zFi1^IK;kHvabm}8wvc(n80=H|pVZPFiW6X9qiUWV1xpp0squn$Ehh&1+I?h)i(C$@ zW`hYhJqmW*Gh6J-?}*J9>|XnaZs|-bm@kJ3h#m#wDn8#iPxT=Qed9iU9c1O=fdw|0 zfD@x&OH%~*Os#vahb7Z1wokND;5!dnv(fV*bQDbQzUSm0Pri}e$?){^HODU+ZH9r3 z5^#JJOm^x{w}AJ#pRr^~lQv|$7V(6Aw3q<@QLv1Lp_i$AQ6xnAa{2Igt1a%Zetk@U z?%pnpJtI)+P!|R(C3q<%^nMCx}f$o zU3I`Qsp zG~z`_l0cS_ciUdfG<9+zLtyu1h`8D_w76s*vOM~#Q8 zA`yr4KO(0nW(+Os1A$S#n{^$2fG?7MfbZ2T{j`9yPl7O^zv9ih15Y1F1Hn;m7Y5=P zKHDflxefVjo)rHOBM!7y?fQUe;hQvJXpAAeQI z=(mkYDS6(#0*1zzJBf(+yzrOl?TH0s+<;c*>9oPR=CweyF(T-RY&-%pq}DDxRrdoE zA*_}!!gA)sLJ%5SIotw(h!EbWd}qhN0uM}tm;BSaIsKugFgW)Ew}Tr-y9mY6VB*ju zo!q=_F%vKme#fpA9(3%}0O3&lbzew4pp6K5E@!Kd>6N$X5!G2wB-+PtpA0D(|S%_^=-9TNbT+HapyNHOC2K$J_p{j|Pi1)z_ z^?8zfupj{uftvuT=q|Cf{5QDlZ|=;-!sV-8eHxo`MGq+4*tG^^U?ulN#x?wCBQGFJ zFPfjaUUthg5E?Dq7d&1J9T7$nJ}pyE38-V?WW5Cj&0Lpm7C`p!w#&itMH811<zh4cu0M5Wu_$vj_EET0~1Y> z;9kCO3aOH%_(hZ#y*S(hLt{K1jfj}{QP=B-_;GSOvgLA*V5vlwEDViNb3;UgS|*x{ zNY|1(O*f?fy2ffQF$AF@B5>(bVrcxO6E@9Dh?4|n}}WkIG6c-}f99mC z)c$KN!Mx95nMWG#(&)g35x63~`dwe`LPK#4I=9+%$7zE?SbCFv(KWktXmhIZ$kL^3Qh~$72W%dvwv{KEK z-63p}CfF1%{@k3BSuY9;yBHLxQC}O&glxZZA>~vR%%`S>M2BaL6--gaq?~` z@D5WJiL^MS6^?fg+nn;d+oHtblQ+nf$fuO1VxOXviFQ39nW~bi&&}bIKhyu-*&;m zRjL_-prPYA;fuwpj!NO3Shgq6U;S`R+XYKOF!!TW+8ExPwcuNqHbCxb|JItXQhd4T zCTQWPGiL1hH^jpulcb#oip(=Ht<@`6EMDvAmjQ+&&%Ysmbz@R))1@Hydsx>K>-@u& ztZF4da1;;e|L`z-LivN<=|&zHEi37f{zg`>0T3F+13^PPWQSay^1I}q9!86;QFH%k z{sfjNXY$Za^HBUYWa2$Ob#kde&(kHUYC@*RATd7W~a=O8af~{ipzo^690+vnP)(r)N(#xRs>a+NMmz zs^%6yz2{*p3ackFPiSOcQ7MyLFAWQm`_Q-MDV`f2EC9;|(ZZ40lgJ=?_RaG=HR(kK z7Ot)*_~YrY*Y%*4qj>1}hlj*J({Da6_Kd}7q6-pD&nw*40-;en5H!R?*5Z>zq0V#2 z+ekCSq9-~C_k0DRAs+CwfqvQ|+!cRvrg}7y24ah+>X#BbZDDy^CJ)HIDvS0vOg{Km z5q~6V+gK(%h&bW_5{^E-$VEnUK*-%+9Lt@oxgD?EnTEYj4@~ldbrMoMkU$z85H-~< z72V2tWcqs2S=+s@XV||22}kij&=3zj8=v)ACFkg3RWB`)aQ(rTy$ghfc)*ucP(p(> zRq9>Y1-_1}MY@gxjRze7q0 z^R(18WfqOF14myGa$5cHi@vdkD04`VOOT3FV{8HtGt`)8VKg zPv%C)6uy}>)2CcN?&s3pAhNaG~8MWbLE)s5>ivv|CdU`-Blz7 zysh~7qONx}*zdFK)x%?&i(+ z4$U}Y^BsgnnZn4OXdT?j?WcCHN{n4Ad(LRT)FBsZ#d!9DHy}956lP|#u%47RqOKiY z4A9DJs^L0;=`3KIw(p75h4COH6Z-k?k?HqA6rJDymVf8MnfyPalI z*}=p*=eDy@&A+k%WBt%SeL3#n_Xe0;T+$f~xyo(Aywj?^$gOJgroI}tjg^5QEb2gT zzz&iVW$D}#d^=6wOIUwGG96pgr-mONYsrDam{B1ZQIL!wqi3MzS_M< zD`H~0Q!it8)abN>WTPku{D*>s?J?0Gx%^7-$5AO* z(4jME4g6@SbsPOS!l;KcZkzgM-;J6VfHy~B*o#jHW>Dw$@_XXS2vHD3cQ}Zk~J6cmf1w&KSmx7EOGmN}p0_s1aT? zzn0VtA={G%K(zl@L3PBflGlGLNwT5qx%LM(iJ93TG|CDp|DoWJ&~MITEx(Rn3a0u$ z<5hRN3=3aO94eVsplzOIs+-?KR?XIAe8GKnCzuCr&KSjQLw9y`Nx$65_43s;Y*RrN zH#V{CP==WS;~+pbrCBJOS8<_;-1(UNsC(g?x;!?}qM29zhk|j&x37M<(PWAVb&VGC ziQfAn7=%Vq(D4ri>ZxxYC1%OyUO~M5g92nz(#5rVtxo?=#fx^ZCQ-dF zZ*v$3%)H}26yz6aPd9YVCi(2)zX_}5J$$c$&?pK>WQ&gDzlmbE+AgMkz!WIg%{;%3 z{bCsi&BTEVI|}qhlwfU_(;d&Mg!Qyf{`qBB@67@b7DWM(3{fDkkW<)q)AuXcPqwcq0;}ozjg(wofx$bpGHS z*G6(_L7K+OZy+=iE(g33@zO`A`JRq)`E98Saj@dUziCeDi3QCdFe*u5jUS8|dBFL( z#R7}v5pPLDSl+R`BuU$F3ox8<=IEe&5xO()!o%+m+`sHUg{706CBC#t;&L1qj&w-M z(;brhAu_zzLZ*=u-aAjP>XD{P1PG4FgE`H^UVhJDmzs^{n1|g>i_;6WTw%9j8PPG~ zA;q_#&B1OGsS7(aoDFi>&;)aHnboy0y1KS&%EfBMcx93+s#WWHpkU|;YXzlKPo%n5 zNogv^*Oh)GVRHk?u$!oz+Gm~X01MD);Yf82O+ZiU{JdcL){cX?II)YDwd%sT$<-hl zsPg=1guEh+D)o2kim(j1=WNgB^mfKkT6tNToYl}J7~WWvwu*|jY%U@^WCP1+9}Gg zMWf8h8duaClO=4$e^%w+5O@+)i?<^$#iIvx1-OrbWHT8Hl<8tWOV7=7PshKskH(6& zy;hjAKgeq$2#iTWE=|JBX!XhG%x-EMB7Qj&Jb{ID@jliv3W%=IUTxl1Et6VPmVJ+KS4z-lZQT< zhvgZ*S0%d7cVkV>^SAW&y1#S=iAM8)E2Sd~r!=nhi$=kcR19ZV_HyNXzJ6HFpN3n5 z4|^MQ*h{TeI>d5|6~iq}l9@4l7-(FG2V6h=R2wDFSLvtrO<3~S$mLTie|PPDLUp%h zLN7>JM#zkKP+jAFxo=Ya56pwMtwGZIG$q(hPJeRPRQssoS;TAl$LD+(c9SZn;$M;y%1?Gxn4T>CHNS4}?b3z=>}|AR1no-3(p%b?6<2 zd-wBq-p$Ox=O8$GSHd#~N6f+L)vCS9?=0_Nb1<^qe=s)H4psnXgw2SCD@S;@&UPM0 zUUJk;Z8@i>wi*`c(yC%pWu@n5u`64@>alPNh{LQd*ATA$PMsT5Y#JYSrzq`xW4rySxvV+UEojo`Rs|(RQ;K{%vJp6qz zd}-!>Uov=MUl80W9>w1H&?AGU|X0sXgr9oq_9Iz|AEc(}Zs zx*AaJK)ScggKAB_Men!;(v<$>u&s{RgGXs@>et4-URc$b2J2VZ$(Qbe;LuKjuR^rY zS0UyYZxcKqFD8O{*tpkd!4CO*HXt}A56HacM0%G#ceS5~(QbEHow`{exB`SmIjn*I z1kne#ABhoOG?<3b6dhMhbY5Y~2}5J_u*_y^pe-3T)wU z_7;BG2f%LFzWUc#-g`};)@Z-{u?DOSYLBdhYx{~%tl+UobY3HouU_A>n5i4N! zfIB1*R$~}r!U_k{Vz(ce7!;e=;{56wah2kWB`kM9;xR&qKq|SHuCe89P$l134}Q(o zxp6vqu+tC~dKhEIOL8CXOc(o0?o}9^dOXnl;1+D3W7gUt>ElM8yK`q%s4bb!o~p|q z{6yjiY$svX+7Q}TZkwtpUnY{NS4%jere$q4?E@_ueLi5LXIq{( zWMjK;N{&|`ZUx_WnldcOiMs$tgV-l;?0UbV@9_uX+FGCXu2AR0{Yy-AIONus(#+0 zXVofk;>JbqP7ali;xz=pF~8oOl&aj3o!K%2*_#J3qo*tnYJZ61r~{!fNI;WIyU#6J z>^X1KPpqk|_MgOP)6=l9oHhlVH6L;H7cZKfGWD4bIc4gXhZMedD}vPrXgHEJM-klN zo@e(rSIu~WrQ^JIZ`VAf^{_%V;sJZ-D3Cswv+$a0-uW{8k!QV6Kav{kQdsE(JbTsKKouY%?XCa zC_y70@~SWVdAU-0DMnko`_Y4a?EL@#w$w*&OV#@CT6fwV7RC!VeN~2Xv+E&PuOQ+9 zj}<^X=v!Vkd8_ZIfZ%- z2MCVhfmDu>J*39vwWux8@4+j#P4M{xmEop0Ff>LT8u74DMdygr#13_=>H@8-`Jvm> z9)i%&%HgR3D3U%X-dZ+cQ{Eda+`}C_H^vQ?{RF`=&xc%^*4E5(?ajZ;%dv2E_WrfA z&-@<=zS#AnZ%!c|1TP89N!;hL0So8dThm{BI&d~jIEO$|K1Mub3Ez}jS@_^5Mic+$ zT6a409?bD#7NZdlH#u(4*0NZcg;kv&{;4iBfd^L3Lp=NwNzV@3o1*B-ejN+vvh(s? z_SeT?jp#*d9t1^yhM32vq^0QACVgZ$okP)iY<6 zhm#i#Vj}80{@z?AJZ%#k4qtB@A)?emd1hwzgzFe@{ojeH%Npfj2}lL)^wE@t4-TXU z);!VkKeBHx_V|0=Ox__>B)JeIAEO3D2hvLQa{lMT@)EJ*I{4lJsu5C1C zJnX2;GJUaiIR~Xl|vEQ zANwkq$zKd-;BVxjc=J}9nvY;o$Lesi=sH})w^faICMK`K>z0+?9GT$02^MuRI6#r~ z)8WMtSyh`!Eb>xhM!xIzd|;r&=-x)-WOJgT3@2Sr`h+#jo;@$ZOWXlg;-*grQinsK zZ}|ACM?!ChLor-HhC}nvIX?#w4Ky67!$s0{IQJ>}XTCNXv0%8vwr?j>-XeU{Bw-xl zLAm5=Kw*kO0p3Wa`EzFm6{W*^k(puKGCGXAmv7HjH1ijkC|T5VVW|p_G9`2*z-!OI6h;fAxZSOEeq_ z;}8!YvJy(Nesz&F)$k;%Klcpg!ZK*gV;W^Nl+VZFQ)|^k{R{8NiQg2UUGcW(9ybV! zxh2)oTau1~N0{$R1@gx4wc``sUYGv$5r{UnB_Xs93Aur|?;>PN8vnlgdpx_)9uOME zs5R-MLXos>nB}oNy>A@Y6oRJC&)g$$754F(JEZ>`NmoqCmDO2eB7@O}y435J6!O5D z<0y}H42>>fD9n>R@o-&C6-FzQ6L4$a<_(K|nKb0mG*qNCpYxF4$%ajV{Z*u7y|Knj z=)xV={HG>8tXlWJb<=EOsHYZB_U1W~&I5(BChvZsNSeQSY5ZT$5;3gnoUW#*LM2si z5FEur2X=r_Q1rbP`~ zY}jFqfXE*FMhEoOQpYMgD|caUpjMS8xfGRf*siBlG#8dqril1AlzvtgnCUXtl3WHB z2;ISd-1y*jkh08{ZbU@a*1oq~tO=5M>3-a_%X8){1ZQs!lULSJD1EwiN}!Wc2)VJy zCNuH-^e3iJ&ueUBLiVMp(GN}54+La?n@={et^ z#yuT>b%sw^OO_Q{Ny3)SVXPG!S%l$~*+T3abIBd=J$cUKG?N-9!_XLw-H3>N@7yNX zwcUP*iQo--v+LuXV3>1`zTtmjX;~XBxpZUG$5_?lSsTO?SMGv!kC~^B5rGUW-0pdb z_Bf$e7)?83>w`uc)wLj1sY9At2JI1X9! z{yFRpq_J&kzf1A4&xSrAH2Ndq$H|}sdM{ZfAY9T~`%()Fck-RXEK4u11t2(4#)wH& zS$$WX84?ke5{I`E|9K9B;+KT4gV1Q<$cV|2s`To29E*>$G?Ps5%=`765zb5VUp94ap zbRC;eg5D;JJ#?aJp1(h7M(f(GYs0pt%M%30y!?!a;FYqLn^m7pj)*3~=f)e(sDaxb z$0n4Znsj`+_DK)VHybgp#y)pG+U|3m3KC91yK*#?K957`Gi#kvxg00jV^{OepOq6& zdd2I4@EC1;bSV9pHCcS=iBoIv7c4$O@Ams0J|Q41rpJWd|H?JHx98?#*5x?BEY|Z- zxHV+<5`>1XT`?-$ON{SsTjs9JhecDFCB1d>^o!0QFy_s-NZM5Ib+(sF)|!!*uPuV? z-zB`QwT#tp_ZennNLg~OkiI;sd2Hs;$ zxp~-^c`CNRy7lS0FRqv0pj#=&8I;S|@?0WQ$=?51yLQ3XO*J4*nJs)(^t!D+Up7(E ze$gImsO}N_te0Hh3mbSqt=m{DC5qrCKNM7K?lS*^;eM#eFPL?t>zXz4$QhV;-R|y5C_QkCX`gmK6mYQ;|L-DWA}#k!VVt2JzmEU5s&F~c~-gPY%> z>pN~9Ou}eeeJ-AVv0-){42==Sp(o-J<{9&@UnyRR(Mow`yZ2Ie8XK=L-104JNt<=!69LN5Ek=fsHJzf z;&d_To3@!on9;{p+;3&hp3eZG(cMb8>t>`!w;+ODfBL><+!ySn?O!2=Jeb?G29!~@4afpkd-+Xe5+`6NhE7K<>t z(;W8{ghv^~zeQ=jH^s-N=f#p6HWjt2j)%G5J_|xa27yPp<*uc!)=erg&&zj=c!HNM zZ2Jc7c^B8i?296T2#1LHyF^T1RAEUjM(b-(KUKc=C@^`$7}kISY3+qk?VsApO)#2w z`kl@XHJ^YZx){S6P#~>kt|?^oy?r@GV+reXQFgVp11+2=W3nNN-1P$?!W%bCWuy*EptZK;RPQzJK4K{*gqf~XR!21$P zXxRRE>f8JxS{@5$DZR!2?Qlds2#y&?BOao^>9enj*ISK+yDFJba3s|U=6O*E#Mp#M zbV=HEJNKdSEPI0R#?-3#K{xVnD6F4VLAzr#jxND*w0Tr~SyV#^DM`P1;Oobg9hwMI zmT?b@j-y}Bth4h`&~L#DmvO1nXm{=!*a%|ESt6{WIQm8R7e9{Bux^B|hrO5|EnA@g*pZZo0E)oRr#d2X z3$(X{@7HLeQfR=ZlNAz+k9@?M4q6&Tr7mfJovREEP#mq29A9iS%b*X-_F3(nj&8zJ zUXZ5r*+A~XDbsi1eg(`pS@tybH|F%!`L5{I6S5zJ;Fz9V1MOz=Nw}|AE38LaPy=0t zJqI3axCKI^y(MxN4pmmKKH72d!(tvX2ja1!Q+fJodsh$~y~mMG%5R!fC#A=)b)tcaBX=ect&-Rl;-NwD#fn*uoJ#m3Ns3P2=OdU4J{%5{1}GH3DcmvN?wg{M zjp6#{N65y`NLm9Dj^=^X;Sdizx6cReUcx1dbv1sxQ8iI%9JHf#Y#%{9lwJ08Z`w1o z3Zp&cc21wc76?msGj}BvNL$yfC>6h9N=B%eEN}eXarNjgkgCi&9O7Yucfuzr(Siwh z;jRTa_vMrd90H-y#!BjNhzDWypN+G`g7`3;qT}y5pIL*(f#B$Ui9~T|UlNNtu9emk zbOo>6rt)LWgF>k$yZTlu?bb32128CB~e@=)yKo893(0E z+d1bi-ZcF`L^SP=Dzyf|F`_us@o_e<{@(XD-sIw{kdXJ@-7Hb_L16U0M4~vfFKv0w z70jjndl6o^Z*v^x*A#z?0>LqzC6v&Jj9&R^vbg+Ntf`~*N+YhO!BZeK#_@m>8Wz!; zLsF*mOJLDfu=Ms+6~^X)z?jy65*mYLY3aiktA}txBfTbjLv_d2UJzP;v_aIeiQ!u_bI=&JG z(lLLHW77{97vq(Sy{dl2kB8$j2#y&@qq=JEOZLh8m1mMiF8q2|@?`9-+1* z@&Thb`jII2p!s1jMNGqzqI>y6TOT!|*JgoAy6>)t&*Y`2 zuQGPWc&ch)ZXxqwF;rKT5R?tkKVnVX!u8AI4SwJ0{RR?_NdyX{7Z=&?yLf9c3ns#` z?{!p6dp9f#Oa;>a5)n46YW1x(odnX7KeZ}Ya>g$Q$wn=lYX#0Lp@c>pn{)pzL8wy(Dq!^(}+9z6C$0IF|0s5~gk+P|FKN_^cXC@*Kx0W0M*p9nxa*kp=n)QJQT zgHUObymt5O6^L5ZaLd4=8tRB9oT4x~y#IuzSW)~R{DqjdmshV;(M)86_#N3388WiMemh7s`iv%{Opv>37~`*{ zl=E{3_LK6tCaiUL3x}2S7#yH5dUvy)Nz7Fja&8@)^VMj(mC<34Z1mAUO69NV!1v}6 zy-zb9F5Zt-?KtAtr~X+IR^6uI$S4y8cSU_`fn4AFUzpU+BRNLfjRRJKq+^cIK;^uH z9JW2*s=UWz;SO@H3o0_s2bZ_4WAR0}5B}6eIH_SB?jK#e-B>uOl0owo9Erf1FXJK{ z3L6Iggj@DL==8v7ilSTjcdqZMg{jK01~a+>xArs7vWXW|uVPjIrW?4<`ZO69A<;aL z-Y3Mvf@vbZRkri(#KKLy5zTv{hV?v9xUr@&#KRqz45M&9bsc;T&UiamwbW-Y0)$2h zXDvk9D5+;B*;ya6_iUHls7*>D9aGQzvhz>=0>WdqQ6eHWYendCllddKx}3q}k2G{kmT z!w}Zd#v}ouxjNs_dh$|#9CiwymO3uqKKs@QkZb}vWGFV>?%|=bl51K@1@Wb)D}*kX zzNh&i2#Yp_OaF`;yZmsvVX&e&d5mLVCjT=Xv)iyMt4s%CC++<<$p{R3u9~t5o5I}4 z@88}$8)5|shfD!ad_-~d6|L|`s>Wet#GRG@4N4ARFIKYpRRlzJ}N zpEZv6wPec*vk;88H;Uh7{z(zo(Lm#o7rICA#GiDfyYqe^z1SC$Ztk-Ya)Q;8n1S>; z+NE}_f9jhcwW9*Bo#6C8!H4Y3m%`SL!2}AV&nK_&{pb^R0Hc+qUl=DG54vFtscMzVShtM#81f>_Q_Ez=URb1YLtN}eR$W!+R2d{!@aB8-FDwk6z1;J za5MgaGv?B7^SHh(9P1i!W=@i7`X&R=$}t0J#KUZ-@1gQ1oiy-QVy`69rvqVCggzY#1KW3{?{G21Xdg}uem}>b537|^r^CN!`zu8yI~#YAKE>^2e%BJM zN@s%Bjq#KKs&6}SySwsL=x)JZ$cC6-hT_gQ3PE7>@j#|gB2Ovy8NcV|!w*#PmKl0E zMj?aiHLNbh-~ffvdJ+vko1W|>Z=I@q{xx2A?iZLZLT~4|TF#0p(ntNe)GOZfk=muP zOG@M8#tvARPZ`5uPTY0lMo*(;xt?KsQKdN*ljv?`%)!^N8F8Lt|Kj8Ep*%kK!cGx{DH3Cv6j)JFqX~DhQ3{fpkA19wwXq zihX!@*;dTM(mj`aueJ1+fZ&+3Ob`#|I}eR>SgExXZ%R}84RzAB*Jy#zXdZ;fMYzfI zML3y*DOMrlo{~K4-aYO?f46z3f$*qM`d=bu+kQ~+HF?*Jb=CMCeSbs$+$0zpgNS7` z5l@aC*Nu?vlg73`v%hQklw7Gw5E@N{=066}>A*iIzWx`2!PO~#)qSV~Amy3P;OhrM;G8-w8 zMQrq&?nI3gzJ`}huC0Da^RMrhKxp*R)!~G9pB~jnY4Uo=ZqY9ZG8btn$E?TWCk4I( z!7&dAWMCcb3wo?`Hj`EZbz8kXt4>e&14J83E+HbK#|hdm+p=60t6KhS#+E6MXMt;7 zV}&@hGv#-5vn7wuCjo>?;?eJ-9A`{n!Z8YQh=)mEUu(U*R8Ixoj4^j2?WRF0oj*bQy!0-J@+JRttZ3I2Hm^oq7Fl2 z#L|d|?g#e;4PMES7N|9Ce0FQw6JRdMKY<)Nsd=VUIm_qBTM^+l%v-+h{Y#in%{;yk z53}~~pWpK5EJ=JV?+a#IlHnl(QWf!l13AQlP^5^C(c%3y_?x@tt5D5-B4QN??w>#| zk#70$x#>Lo`B$wJ_DWKB>#R5wHZK+g#|Y$5%ZH<7&z$kU!=v!R1^t>K!gWagF9?ho z$f2AD$9CQvwT&;vVbQ98Y<`?Ovj)}{#Bi8UPGhG2@T0^{{^?k>*AKtk+ida~cHNih zwH~042d?6Qj}>72#tS8Y?qc!9WVCI`JxNYd<@&920~L9 zr-QGs&?7z`?N#fO46)vhvDB0r{e6l>V28ATlmo`1iVm93+jlCT6qx@M6Ckx-{>sm! zvk4%%1gI%jqYV`(@U6=cyDKR2=^ZBEY2|x?<^|W1L13bcu|5H`Pk7IRyZ3iR#Se_u z6+i1#mgjjMAlg{#9zrvlxBXM~>HFpwjU!h&)8pHDNg&$TsesUQDwCr9-%KgM%hq-B z$L$m117|>J3<@UF18p^zU6gvLr|E-5vvms2I@68Rfx^v$R!R{W&0;gbmUP^VNsm)xthp8jegu3ZSPU zEzpW8Q;e;5!qUlXHvD_~WHsEcsn{@jQHNWHdV=f+Tgzgd;VvcYul83e&WnF|h7F`F z#lvV@_r!Xt{D87w-JNcxoy5~AUI?ZBNgs4y0{{4ojh};)2S7B zhnvsyH|j`kDPf9!eVYp<+OEeTGZ5g zYr)?27_H!@%sB7-d1gSgu}uk~Eh@h)`>l$j1f$gtf9la6R)^()L>K0?@&3S7U(EyeVKfDu{tsPmZtjL@%6La$8-1GQ z^mkn0E9)c8K!rhvFa1nf153p*SxBW>2tM#M{KJ#zR%}^3e)%l%Zho+AGX3q6i?q7* zrlhd;rQZa0>&18%IjfPzzV7;|{{s#`>7YTsBf_3yyhm=XtZ5KlIxU69tolpgim;`l z4rsigBO=(9zk1&e?Fz(b<{F`K{f^qO2%l;i8$(0shrI!^$Hl{mS8in)I(42#qc2Q0 z#u?pC6Or7%YTWa)#e|4ez6-8b${qiHFk@K_fKkWOT=kMO#15Rm`rNzvDVcJjx;}{~=;)dG}n_;;Cwwh)%A9 zJ2wU0X@Q|JrkEg$XcM>;J-=={FaCz_%$c)m<{huKAT+dec$`c>%|xf}CLfEy91AR* zVE29jFZDE7`d5_k2o^H1qkOgDkuAG+VE}`Z)XA#to_Ogj5Ar;*a-0myQc*;3;W`}JnhbOo zwQldIx{c8^rVMVZ*#E5@BptJ#6%nyZ^YdZ*c;6DN>%&l$*v^#QULZ7N5xAdK`~=<4 z`o_COPQ~Hk9E@kw6)~g#&y7$xUM~KK5gxk(RmMoYr-8L?J3sld&dZe_KzPj48kty8 zv}ntfNyq&#+K1D8+*z$V-@?!+*YzJJd_Fp!ojr@a1EcMI=BsFNSgH_)#;C&~CJYZu z`Expc2YFKVW2)e5Ux`EDMtf^bToKivBXiboc8;&6iYybuOz5oSwKnl)LNp83e`*=1$SOx@K6;xvZsKq(k6Y)#RxP-=*z9XtYU? zU`~M!=G11KXdg(czk#>9?6V>F?S99@_9hyR1ap$K-{fECn9s(PJxS=i(v0;zgucOW7&Dk=~a_(?pXuR z24GnK$!q9023IYX^%=yU+liAbe+33t!$JsEhR+m0bJ}us@1i+&Pe~csc5ZRZ%yo}o zSrS#oNsZ8QhJ+g*cUR59Q8K!{HvNO+^FI-S{3^Tgwulg0spkY{h zp$rbE!yR?*mQvpvOTj{$%8c_n$m@Kk1RlSd!X5_8Y?x4v@Mv}kh0}t2ezuqved5QO zPAq+U_)_OHSmBJyin`)SS9j?*y`TR+H)-3^_bgab*;N}_)!UB1uC7t0F!rYRJBn1X zaBoSy;C?bO;eKi@ewxe6Z@?1f#4VVHs% z&B9AIh16)BRpQvL#4Me~{4zzeK(^qnErnU2qv>x0;adEFV`RtG*k5h-M6)L81_{ss%{u52VYp4me=k4B%Kae9Kr6LIq&L@Fr|B0q& z*H%vX7CxYY(Y~^NI2a!;47+p9jHcZwO}UphuI|ySaVH&1*E(g^>RQLZLQJYpCXhJ5 zbP#v&tmReUESq>`o|?g;bh_Z9%UmkALq(N-M0Xows&>eg(@L(565- zGN00>Q1UcyVSsE1d7NNN)_AYm4TjDj8fdsWB%r$3X@YEqktru%&fmCH4(a63k<$8zQf7B#mB3PF0m0qfM$rOZ!h)BiWFUo4n8PxLM zZ-0q|`gvEbr?VLyhSh&4B0BydB2l4U$mp<)Db_VN%2U{0XnO-lI*JH_hKR^jo|YNT zFF>jfPep4a-d*E?9bAYAJX5BhHi@jg-(ugl?w){!Oa7R+d)4xLpJ2i6ANPKC!?h-3UjApWLb)0W^JZzO$Z#yB@U zPX1ST;iTLj+79dw)&mx?86U~5Hw!?jBI*8#q~DG^H0(Pk<^}$SS@#?3=N5V7fZ&)(i1pMa%zgJV zPePICEb>UqZ>e*vR}wqZL1>I9jxKhyzK&f}q`zLr42u@>X-8DUbl3GDFlH2Yl8)kj zxFjg7`ee2kuiG`htX8psM@Aqt+Pugp+6T1jdN&}k;7Q;bQtaN6>OLiNkE$66?w=?Q zeIyEky*aYd3)}F)|7!Zsl(<>BNgy}{YAYFO@itAT03hzav$2gYF%93Z)(Jf_UJgrooBubZvE}5$01L?h7mVgH z<7Y^s?Ar4n!OR)QbO3$m_lafK7AaO7!)VEYi}X~2es%!S#^N}HHmmb^e6ni%EQ~f; zbLH?aCwmbP8q*eBX6NFOvK(bMGMIQBjkxV`6ZOmtGR3L3V z6Q2wD58BcmeDt0ULSsDYOR9+4+q{xS~HsZ97<<- zfL4zF&D&_Ks0nLUA=3~6SqYePRuH+yTHQ)wqw$}624$FVh(jKLLJEiEE}*nByN=P zwbm1nM+O0|4a8K&QI4-}fj-Z93zc_5FBMFUPoZq+eF55+}u*jO9 z-|;Ta64w35tA<@xo2Wymh%K#}3vVKz}269Oa00rPq1!h-RLU!*CtH z8{@<$iR*!MrFp>fOh$N^mv&CQRZ%|z^B`G%p{L>d?uQ^a#yx4o!+AB8{Ts(|EW@(Z zaTf%bzG;R<<%kDtswkh~;-GxxmFo-QVDhDY49RkfSqGAhh9mP#5S(o}-|xd4!pY_L z?B#ntpA4G>%j`2xX=Gkv=9g<`HZ9M^y3S0$HR%b*cUUQj<^f-Z8{uKohg-&((T}EL z9=4n~e(ZX}aublQjNWd_xe^5Td@&Nw^-dE%2;7v2Q+H!t#$Z1$`$>af<*UqDl4%(!b z5dX$@ze;@1^??A8u8ey0WZJ)(-ENTi*C%Hxc32gb#mt%bVpk>zjL}M|M8zPt&wShS zxoTG!6N_1ofM{b5D?+pMy(U~Q z!A%NNN~P2HmWO!8>9Xvhw5)C-ho`5 zn<_8`6#_p3e43A50f8~CKV~rP-nlNX^DHD6nx(5G zeqi`5tm4kxiI8k-ZvIj|t#8MsMy<}SsBE5|`pJJyu#GgnSMX|@Ct zuuyusOze-tu*A<80aO-L{DjhvtaHhgbFo+)7CA-YQGQQhVvW7wO^a1>>{M6wV+AXW zbySo6SMj7s*rk5=$_}QAZvNUDt-;Y67)zpDoa?g4f(DpeT+$h%?GChD8dEM!)k+JN z#h*p4vzb_f93L#>P9?PiagoP~+H1L^n|JI^?YvZjCHv}RYp1D`GYpeVI}mFrMr}b( z&YN9zA8wMwd!ru5vZ2A%d9c!g``GGFq0@mD=Nj!beba@pnx3By|BABOyBQ>ySK!#! zUrHY-S4?J1=8&r2jM2=Vn@$>z{0!?L^a>o?fe>1u02hbQZ0AoHjpLf3?Ul_I@gUhK z3ex|fAU*%3;-T=mADDuU*c(EBPIkaXsJUyWGbu=Lj>zbXPcFk07@kV4Kety9mfvMi zK+);Xns(1DV>sz>C06s@7a4#rhk}4CQ%+&AjbAWYxZ;UF^Iiuw1JV9N zLBKKpDe}i#$?&x6$f<$owp(>ygZ>T?b!R@7I-sr7OF#U~&%iULv} zMjMf|R;!MxlEhm~!M1~oX4IuTgLRg=k3Ho@Z$wSk+P1Ykld!{*ZOy$pWxD_eES*JB zKqNyH>^6!NTD#!UW=w&C^@Qn}iNTs6JsA`roBEh$qw%3(w>1{c=+z9n1@k&!d!$## ze<-ltZa7P0as|naUHhZ;^D~#wc#vom1*9~LDBv{I+PP@O&q7SWnfUzq%c`%zGM-dK zfKMr!f`(|Lg9Tpx#D{9{g?&$3^$SeFrF*K`cCS-SL1m~oqJ2&eu7j*aQJ%L$lK80m&cgR&N-}uzmX)Z z%)2@=n_>NeOd`+(v7V_*SG2LtBb||cH`MZtH~lUKNk{d)jL}LHG5e#1m6>#*6_!n> z<vJ=m2D@6 zlP#G#-LK<3tX+_XBb|}xZLxK8me*W+u5uOg$}6?_3K*TB*p%Zdu?OGq=wj@iD!fjO?Q&Mi8dh#!18 zir`o|A1&ckY*EF!zA2ep@r6w}A0!>qAXMpCZC^=6w29N-M0_}Sb>z+Vm2QBQUfsuH zHEO^a`<5GLPlm{*xnW9UgE)i@FJ!udBtwA$WA6A1N7cQiN3=w+noXQ$b9hg3!!}@M ztcD%~JNZ`irof#qwir!%ZPePH>2>o!qA_DNgw{RBc)E452Duy%e^!5%T*Fpabj73q zjU{=%=?T}9SamhLY?Jrvn@7ogf+dR>6s)Ave{R;HYg$^If-s-`EE+ps_SM1KdQUo# zz>gkh+PzP$#9C5B5-*xjVK47c{or{7q*t9 zY*|uCg%n97LS@NTvQ)B_Y*`{vQnbjvB%+0sXhSF|B9ZJ0Woc7F(Y}fbk?-E=H{c%u*q&Cc=DWKzRKH%gk$Y5p$#X@yK4hPxS7*At_2zzGOP(SS2npV4FWy@7_h zC(fqeZ$zO+Ct|p38?;eUST#O%AsQ-XZqp3Sl_fRgp$AWyZ;Vhe0~yCu&FINg%kYg$ zF1d^6W80$BKQ~O;{sg9Em1Tf7P>(0fGcqGsGzgvJfkABC5zOSz%p}8b6X2_g3-R6bGRp z9`F*}PdkJ%ukNx5Zc9kM>D5)E{oE~FXFzaF9*}#rulcrllWyTKX7%)E_4h|kpAG?` zQ75G|yr3f)ZTz5G-*)iuc8s?4XT|)$>PIkzPs!*}G+MoJw;3OJ@|Kgd3tj!=!HPiE z13fU?7}-tKVYyIDa(U145^`xF|FU)ZNSbFC2#x;Y$SaXZM(@Z--Lko8>PsxQdPBND z>_3|Y3jxuW*hzB|yJ+et$J$`PzA0G6Y&@R2pQmQLoYEHr+xMA7AQ_$6)v%b0Yu+)8 zR;t`#k?5Pq4H_&ZqsJ1laX!auq02S`7%e1wu3@)C5v;I8?O!57wtjge_>B7&cKyb) zA13uZ?*0w3jUr<7VjGgt4WF}Ca6j6Rhl%hm?VLDcZpuYC9KP80mxyUGGgj*#%pn^N zi*fX%=BLR~P`uHyNO8I>vf0bTFxGqPC4AKU8ET>sJToNths)^jWuYb6tAOYk;uXJN8A5&C_Ybawd&2jcj1|t?F|qd(;<+Io{%bhZRfb8 zOf0)BtQXY%8r}sf17qadXc>K}I6K)VD8K+ys(m)ULg$@r0?0B(z76#p&yw^#I6d~& z0H(B9YK6ha!ELaTGG@N*2)#KZjzsRA87Aq9(KZz+ew@$E2NO2_X``72g!Uy`cloU^ zX+fCLdYhfo>(!u!%C#ly z&5qEOYb!AeJklS(eu_K*+g2GG4)rnR6ujUk?_{Ej=PhHZE{E-^4+}x2F*RH*t>L!C z2iz!gck{&awyRUpSjeMy7=%Xe_(a3e6=2id%=r)SFW&PO8@D#p_0Nij7Y>8qn4W;5 z8I~pIbDv(jEP>~(KtcIVZE!a1{J`)86wT;$(4RJ|CU!G+tM1s1`#iS!egc_xEzB9` zQ0Ydd@`wGW7_#w_3zW9g%Dj|$T3kU`OiyT}J;C2GbW`eLkq3Cv{3I>LYfsCBmE|x! z0im(lvuUeD#F2&$*ALmtrZi>3>Mv+dAZifF=!fR~UGq*VEyKpi_${&b9&V}u4V7wy zUX4#(=(t)pVVy+etk@Ea*8HJJeci1IFipdh(dfn0f z0>V)|;1<_NMjwfsJ2d_69(Fv|!v~FLMRYpA673WZZ^rPDsgmldo;wE< zsx%Lzn*ieBu%V6BG@*i2eCWE+A82*@uEq$Q2lB`s^|}Q+YxbPncdJx>lep4VuM>)^ z)jW=Y@R*P6A&1zVsBqR#S%_R`vl5@Rl5-;a0uUNgMo@vIgE$6T0@f1TJSxlUYXU>Fl|pybAs zL;g45I$D=J(J+Hj`D_u26Qir-1e39K!Asods_a>#0kV$yL<1s1WP(!F-3=`dFZN7y7rZ0tu;I6h?k_=TW136;)o*7G53f5Gphb$r zPA1G0-^%u(0))pT0tx95{ut?pwn5#P2=469BrGs$kABrC0M|#{Ek~V&&X(W!+X! zFcE9zo^v#2r)~qG(Z=!P#w34<;8hyhoMq3VhVin>-M)HXGu8p&DLPmGmymve6Ve;X z)zY3{emff6IylQ=FeKH7-aj^|4>4~1)j;BB8Y{tAAePsE$+vN^SNz*xBoV3xP zFSf1FKkB9#aE)|F?z?@UDXXdhb`_0zp$d6~pRQ7v%{?z${FOuxs<020^j3ieN)a)7 zu?-376Z0*UeRS%`tvj8o^>UwnJ`n`LF&zR4>7LNLUbmVO-0+G2;yUX`XFM}jg3uUM zleCbQo!{;eqiMARlkn6rHR^(lp)3fCd2kh_ovSXK?Thw_tRXnwo|rXAx#z~B&1C%#~q!ZdpsKt^|R^2v>TEKIY9Hq zWWkbV;pP7Bw_$>{Ef_6%qX+N)#Ydnyz0sUBdNVbDoBoqfK|NhOaVL+7Z1`;J5el-6 z-tvj=LQ1+%E1G3qX2mdulTy>#+uSAyOB2vM5IDpG*URE_e#soxc&tu0q;_}d%(w%x zjw$014~emUq6V`o7h$x@%N1HqvqI}2XiKk6X&b4sD%AL|7sUMkerq!MQKk9$5EEw8 zY?^%<{};nQf(E`PB26IwMUyEj5I=4&GrzOVt0Y&_TLW6kCGHCsg3xGwh`dAmw8!07 z{wkgqgpCU?{^LB=)DO0}FqbM6=~!YVyMM{?sifYp{l4bzYXTl>AmbQI6^eA&&oF){ z-!`5c1cErn&)HgZH2?(0WC1+@lRf|b&E@mcyznZzu)jS@I=B2P2(8)q4UU`8RUik% z?9xv3#r5GybL~@~K9J4>+ZUNjRU^Gr1wJjhyd`vQ9d;4k{5fxvw|GnfS%zE$KVF0s z_IfAdtv3Q3Nhe~(_f9kZEHl3Vf@AKCNKf##1kbIk8zyD;+a6}0o-Z{02MCQBrh9sE zjy+#bvdEB!+P4Y#KoJ)v-m_@twAUas1_`JNM2!1cTf<1}Cp>T2OPeKo?z+HsAKDYh z85;@gW`!G*eofe>h!0PGsTzyTO>RsE*@kF{_^(S`<6nU-axn3Ye+lUU)O7EY?uI4~ zm?Wln7@Mf}|E0Y1aP32FJlN+;b=>N6G+~)Jda(FDIxBixIF8d-_VJfFB!K1W`JYSrbAiBJu@?JV8G z1&nl1c|NJ?F+{j^Htq2ApHhRpwKd~I$dY%x(9RasV>8u@G9RR>^eMDqB4np7DUB|B zkOKTnC?c>V{zSjDQnh{eAJ2jmqMhUpPN~|oIejY#jv|5>hlr5h?#<~hvw}$C+#NfW zH5wW&1JOp45lCR?C-Q9wSiJr&p1AahUBw*R-LgSw)ZRd1bx2@4>pV85&Wq$W*PzQi zy?af+_rlN^eGZYpel1e;M=QjXlxR=AY&M|&%IG+@s;>d}DZ;=c~>;XL{k z549u1BRBTs+I2AF7`hIn`A&Hk+}>TgmlJ=%l}kTp%;r)4145&XBaa6BE%-isC{`&) z;uGmHT_4{by4iUm>=4By0txKt5|tj)>{7|=D88~kiu!rOSwPlN0(+EJ`g9{i1$Z}p zobH4D;apc;!_8afQ$T3cSUsDtKcGm*(bbz+BUVaI$3)ybm#4ghd*vYzoZ7!c?C_c+ zCU|gPG&YXM^n8V_;*vEWG}<`Qa1s@KbN$TBi!eWS1M_;gKD@!KkZlVHPLX;%^1mme zvA)&~y?gifj8Ej2yM|!A+b7rK-$8hcjwMK6fB9Iyc;Jc8aXePGak6_OT|;0?IyKhO zjwLA4ap=<0m}^n8uQ3rKO%~VBvJ@(UY-1iHkVg!^>E-NL$YOzw>-)javpzt=1%yV6 zf6}o8CB7G?iZ#uea-s?wmt6L6Q(N@K_aHc?Lm+|en!Yl&^UtBB_-M!;vT~cSE+6bj z&A1as3+y@3EP^-Lt`ccy^HV-karoIIkY&`Nl{gm?*vI))3$?%QYscrMMxAW^h9^b5 zAT-9EIF$E(B_r?1o3@wKx;=JvS?-!v1T6Sw+=)X1JAL(<$QiShR$)dvUkra-$9FIS zWE#E3RpIi=KB^y{ruD}YeT%pkJ7GqnLLItl_}*HA;HXSBnKvZtE?9ltcIVx+R~T)J zrQ-gHoFBe{(3mVBfz7dP>-n0VDMWM@Z15Q>KE-DaM5`vY(dSGaC!_8G|9F{$c;e2B zJn)sX(Sg-6&?h-kUWo+UnQik{Yi|1X7{jff`Som^)LoeRr+FaxImE+Yh4G;)@>7)X z%*kzx-*Vxo6inJM^K*y?zmW~MSFYdr38S49yemJVU;s< za~V~Rn;(LVLp)#=hj^&yu&RE({0r$O=(b)(>#9w3ItY%r{30Hf9#-%vIBM63c_@{M z>-o*`9abgCRB`6Kymd2E%TaTUbs&vU>iU0ny3t_^Xq2f>-$WDPheTy_^D&l!F zdhd5F#YYHweqg9LM8niD$qs#6_nCO4ik%xm)lOf10Gc=E&Vb?>hCWwVPX%u4#UqU# z_qxNDB}Ny7#@HE9JmdOWuZ%XU{iLHr*3i%Q7WXw_F+`>_pm@f*tC9K1QSByp(@Hfr z(pB-YgeB6ySC6R!nY>;}cyVFPIy`BoUmvu$w3CG$&6&5QQ9Pr%JVUW;=QGkH*~xXA zc#g64VbG+ZodLf;fC|3v4KG(HH_{Kq#yuOVwn?*C47=KC?L2xZ8O1YNx<1b`x17+3 zKewD&O?IsZCc=(zwAUa1ufXcBj$Yd-(D=2-mT)Q>DtyuN^L1D%jj5wix|IryW;~L6 z8i|LhP{E#h&Sp6*bi?EU>F5ipk2Ojtvi4GwtZ2==CdF?iU=ZA5fO&QE40jIJa=ItChp71NtvVtkKP=|x&i6vxXoA7 zl5H)$v2iIW?~P9%Q->WenK~K~F?{U^JLk6gsTghEQqfly3SzKTgh>R_(R{peGs8SC z-@<6w`ToM`><_X)6GyE{Boc&lbQa5L?ZKHEaTv`&G1*5xRd5)F#^_Uzbo4U`TlpPP z+q3XTqEo3-Z;>hsKgMa{H{UuVsmLhH&GJ%D)+ZO@GyEKm(VRX+Pj=Cm91TLFg!Cw{w2(HbTGzvwR`muugyxAU*ZiLN!!GPnGw0ca z57a24aZ}It&xym_hcMiNUKPHr?vdd0$moj!2yVs}L-8~E%HQx&{C&)^C>k>A&0GNjL#HKtJ?>pFbv-V?wQjJVM@$mSQwK&dy(sLD)jX@=^sXCY=vul@lg3fTF!{fXn-x4%xhUFuj&$Tx7B^H zDj9EF3#Ml_`*{PKFVH;blKM*OwLEs#qe8>IZ*2-mK*K4qb+|k*#}_np%=$`1#7!0N z?!m^7q_yMA0(Z_I?s~=`G$s+MG!ddNYd`$itZssdC^BC!%PBSG3J8rR0vAQGA|js6 zC_Is(v{@e$G3V@~C7x!l`9W~Z`btEEK3kCWxwCaUk&zvKx#wleZ?hzQM` z(+-Yuyr%donRjVrO_0K=x4@xN5k9Qr(8~02zQ@Fu4Q+Xt2dR!<%Q zvugJZeV188KBQ?G<{ZiE-2*}!qvH?{dyXn|&Mdw{?k-f+EYg`^CJdGjWT8X;m0fbL zy-~(e0uQyFBkMxQu9|%yuPj@J!(&{1{p`gk+KQ| zms9EEG=oFc41aI@5AK%dzC5uD1jnEOm3*9g&!O-;I{P`ExbKBKpWTVL?hXQ@TtOPY z*^QL+q?eY@UBot%`yM~rpO^RawLXKPFji*U()q%`Y|o3g<4*)dK4xTf0eXc(MVu$NjZzr2l|WWQ8!P2UK-7dEAur`5*|7DWwq+v7g^duiKR$eWv0@v|DTO)C09rlDOLcQ`=@)-cmou38<}FW`Bb?scr^`LEIj5F90? z$-JQhtHbVJA?157ufb@c5{iL#r}<&~Ad>}4nuQ}Tl!m+Nw~Ap`h@Z4LU-J&DAjmd) zlP2ZuZS-osbr;);HF;NguyIC zT$pibqhVG=gz*}igL|c}C}ARYg-P`b6;BEWq0tw;Mk^_ilwRp)rSR(T?In2X9Nd>& z)YF|61Hz-E^jMDw+q7?Zz6bYhJarv%D#=l&nqm1+`Wq&J)_rs(rA?RNq+4Rk%&>9m zCd|=lecqf8GLD%6LJp=meZ;c6yXpl-D}8ih&(7J^5kRzmh&ZP(bEqIdgC7&IAlBKQ zv;R9A2o0@FBo&7|BGX0yK68JO6OxM zWIOM}4kR=YBo&8<*!xrQdBE*mm+;ha?9M1Ve_U}t{j5d!fbP-wtoJ&;S<(;mKJ^SY+m3wpj`2sy-q)qJtWo~0_>c&s{;&K`Qc zQ}HI~BcW*}LJq;LH8aoB;BWtkx9SLI_0uxWqOdp`L&%}3k4L#_lQzinx8R9e6Ox!C zu_A9e$TsF_3B@$_UpI~uXYDP(rtvf`5OhjE6bV9OoR&~bgKy8|DhuH>QuVyfg(Ec2 z&;nL(z}z49(EEeA`|RpvYp#*wl4z1<*X3ka*hOHbGa$5V@fVuo%l9YYV`16)m1ebH zetiTDRB^luzQjT||2XcS-||?6N0ngZq)b>6kpL480@7g^i^@7^E!-UY_)h;sVNB;G zW1CD4ZVA}6STRNq>2dU&4Ry!vw+-Ffi0RxA&^$a%GNB1HN`cV_PWWjVy|T(+&fyn3T58!84d1{HBVu8rMPniKLCN!gRLl*l!cvSjjcyAF?U9Fn z@8fw}rs08_>UHH07w7E(M&#L!UEed;d=+>NTP>+=VJs1*1D*1o zvv|ox2hPNyV@e}2unJG+sw7Plp*3}yzFOy3@{!!kN}sYZzgz<}Rxw5=IOGxg&Yy73 zUcG~yxlSB-zpSS51T0)Y&z#m6A|6f|{CR`d(*YBqbl=6V_H5;&@eX#gf`1~SY(eu zf*8F;4;_=uo4l-er-zq&_F+C278DZ$Y{xf0zm5nRFJuRophE($bt)K*xHcLzj7XoA?%jC@J* zlEVBy?8R4&*`d9SC?ascpo{h`yPrj$@&cP&uyLFxd~aTueFFLgkM=clqJ2wZUT61W z8-G8HChcRjTW!DJd)QDJhouX&KODQQ%u&hCM#2w0WzQB`T^WLZbKwSKh{!+IbiT5* zM-5wd ziSm2Z@4uIPB^eWw8c&M0!_IPIjEg^rh|?3!4I0dIdWeTQA)kk3FzpyDlh0h3x@jUT zgZ76#u3x+gdxX7fq|-8f|76g_A&;;dL&S+)4#v~s>a($RIg7R(UDveG!xDReLZIu_9I3FVsNk0@MS#It)VaeOiglz zR%BBv6Aqsv9=4`&i8~f*lU7NKR;!#Gf5Pl3%s58c0r8NlF4MUvS=gWP5rgP-lgZo99DICx8VHT%fhaji zTFEW*<0x=^tJ8pK?Y9)*{p`K~7K}%5Lnyhq0Y<)e^1SH-XGk z97lp0R0f{?*9C)?AVXJjx1(YIe6tI3T(JBPm6Rr8WE{PgSHO4+2LUY<~wqV@j2M1*EGQu-Xq}aR6 z>@{f8)EJ8rLObiL6rMl3mgHCT=e*QA+MW6XgvJ!pODNm8&c((Lq%8kLt|4n_*3GR= z3n>SoF-g#)N%%bbUCc+%&S!X}JKx9u(PDK@1fu;TrjvGQX>F2LuED;bwfOuDfvu0c zL1@&+>q&YWy`+XZ{hg6{*}jOBZ5S@&`QxNtfu&2qaHQUji`r^BU-`;zn34QN8;^Bn zwBu>3Z_3ckVf6DwJS3$r?wlUBe-=g)n5t6cu6!Q0C^30JS~{anyQk-MM>|F^`))jgMd4{4NJ}KdgTV23uRS{X}{I+Y4#;j0c>ySG38Bc8Zz zA765wzsJ!G0%OvEq;z6XCWmM2{8f0hyqO~YNTW6jc6%*edW@6~U&i{rH>#J^KeU)v zckAle4!|s9EJ>C0l4QT!w^R9L47pl!-rVBI>F7pS5T3atA+(OUbAwf0tB@th*dw58 z&#E`D!gJ;pxPxAjHXii47*laT0CT`i*MiRqzdZt9k+kqb4-$u|XbbB*nV7TEBcrb#%^ngg5tn`jEJ0%^X~aXu%Dx1X zLp7iAU=24I9WnPmAqko}da$?@`)^3&IS2Jf27gRBrd1_;$n%avL z@cXD5Z7^-O!N#4k(O6O)rMUzIM-f4cLqzbcYTUOVJ$4I5yH>3(6InMI_RTSg=%$JA z71r3f=)|D{OvL*c@@w+tj>BXFA_8A;{7b}>nJIT4rhOu>DCs{pX!)*e_zE;uiU=ZB z5fMKIGYmg9Z@VaFSKWy1A#e?3BKUdH_Ug~6myv3uXm7dyI=VAqi; zB8YK_h%1-7Y$M`NUckn2%UpYI(Qax68Y-H)?Ei8=wUlyDSodme$*voZ&thI9hd%Ir zadO!Pf@AIw$iWe`a$at>RqVI07a7&c*+`npdErt`377gL^ z`R0MG^VUi!&)6FF3uN7VEPmOs_znBbEAYKIkvw|F_oeTI#@n1$5FF9c>6QO!>4JdB z+h4lu7h)#99k8BaStqOjf)mpl)erIXV$vFW=a|OzKWTWZDVfp=dQaZK|eNfMibR9EmbMoyCa)1>;(Qrh_ z8R$_$?))F^2MJG|&f}Ro(tTdSIq(Pc()wt2TAt>C#X`dO4o9dlKJ%Bpb3EE*_!U;c zz<6YuF8lCPi=K4&H(v~vHesUM7gwG<{RT8|YyXL9%pbn=$INjNx&7m|;Ns?U`F~&} zSTh7f2<=-eOHXI~QOG0r)dN!^^<$65!A!IMH>Sb*ptrB)<0JC94X*NdcSUEZ18AUh zh6*3~+f(P*OFWYqzwPba^6hxqGSzL)Z(Y*{E8b;LfXY6W=FZ=GCR*$Z{yKW*c|2Tk zFAlc;QdP=n_$XISPun-`n^PxG+d^KjT-W5bP*<-McF&ahbjds4TB?*>9lv4RmS3(7 zqqp>4RP_ok8|Hfpoj3B%_g}c?yKUSZN_=d1td}0{o2%k}J+c z>pZ4m`og}@f|9s%AT&e+BgY+eYN1%|4$o@rR`KR*k~F5fOM$@R^~OkP|BlZeLL_@h z?ow%O%yuBba1_?+@9|-)qS~F|&2p;Kzs-Ol7o;+B@i*^N^G5?#DR=vGP z`*lfd9EP*G!=hFG>TnUrHX6S5G*`R^FR(= zh=(apJ*2bZmpNlvgX4Z_6&&E&4>At<1I{96)2~cBhWg8g%&h9bGq*YNC|j)Lb6609 z;(=&i#KYmaA~(N$awKJ$6Vrn?O>r@YWsxZ!2pSR&)0Mo0ucQlEV%vo6WR^Iy{esDS z=CagHFH2j^ggy1-hlw0aUT2`B)so}}owx)1SPmi{wC>C1w6aw$#XQvC`%`|a7neLeCH&UA;pp3^FaOQ2p$=N3@LDo?`5b29}uq~T>$zy2tY>Z~GcxT7w z>M&Ta)fAF;2=Nb_a9Qy329Ry&3(gW(UvO}lz_{-;5h{G%)@&?} z_poubjmIYS7pzyV#{uNZg>YmqrW&(Nr_anQ%FHW ziu7I&tfFu5de62~?mq>G8>^y)E{5iJ$(vhaTF*tciu~#J*8<@&i9jmaEI#h(#XGvD z7%e;0`P84i*J1kuQ$-^pa++35TA&(Ii_xYnAMg0OS`H?;)cz%6!CQ+*CbsuUC))VZ z=*?xi=CDfu6cM9oIHaO`R}J~!>JuUDM@*xQHkA6xs(>brh9hY>q@wqmB=)TmU9W}5 zy0)V8bp2uz*l~_2;cn9sPGhH!d*cM9A$-yd=$$8GZnqNl(J>?(D)_kU`>5#Z(nrM(IDFwSY!SEpkM{A%Bqm$~SNJyOKPe{_bs0Kwyj)rs>-5?U`#$Qx&v5@GzSN`1_~m3_&NYnjC&BX$o$Cl@F{t z;CvXPWiGDR`jI>449GGj1qe;x)IedKmlb*Ddy9wtxU&Lmu&^|}XW>q0e^s=v@C4OK zj$6qdlWEbC@OWmM7|1y00wUh4d{_C98GhQ)U74O=Q;HHr)pkcv*5VtAir z`3>?SiNf5)t!BwHhC!w=J5OIg&wTISA;s6BC4m>CKO(wf=Jh79`yup|M$+o0nHuTz zIpNN1m*!5?z;MyaI!_kJ0QUq$1FpqJB6_(-YJbBgT_kHP>n@2 zqQS0dse<;p$oKe*Q}kadD}7}#EU@SQuZZrnxa{5R^k*4HbI}sy-^t%50>nI+G=OZ5G#gql}y&ELK4Czh#3dehw>;R!rJPc&{)n&(+QsB(}Bcea0ukW}uNj??NoWP<7+l=OBJA=^ZnZqk^paykH zVt4B@5SAJ^K_pFPWV4&QS$r@Ej=4P`_iD-ESe76-k33EAvNL|9M{h4I(t>yxBcem? zSquK~vygbQQoZ0vsIO=y$T*4zBBBuwBfA~P&6-j;1A7-2-)dRq^fFj*kMakChWtU< z@xYb|EBq}n56%HAm*4#@-~_S_@qm}$@3cc4e38cgY;Ld`P z8l$Y6moDp$TsXZxGGe(mHf?<9t?T2h>H<&XCFfToTO`9a znSjt37qCL8lalEl(~W!X?=ixbjmy2J5#8wzys*kRtRAB&m>^m(Gl-Xq+<1Q+Sswgp zf0Z@JGBE}P2+ehOi0n&co=up7cbf|J&s?pA#giD-lMCtU$s=|f5*wx@72|=HwwC`G zaXlpuGL5O85e4ZTgFI)vUhKydq|RR1wrhLsD-ar^a*w8<-Q}_8(2~1@*s`bXi)FfI z8o<^MwSOu2!QtJ;W%Qf`f233oH$BqQi3eGx_Adp8&GR!0Gk20!Z%X&B4{BW6V*^5C zX5E%kp9fdtK>SomgSX^Kqp6eIdCKh^WkF~R<&1o4ov(Px4i=$EOu_Ra(g)vPbn_wH0`L*gOy@1BpdRn zyLp@Dh`AiUg(*m3Ulo%sW(rGIGSmW1fz{>A_3U>a=3xrHE=XM7D(4Xdnl$Di6;Y5h zLGo5XJ3BeJ<+&a&>+^XGI|efM0)(dh++*hzf1?w4oNpgEXFuOioB^^eUV0q9b{s*C zvrxGCpl`#ybr>t#?aR5PW_+G7EN49?mW}Bw-o6FbPS5_k!Lh`9Oq8km`U6I0RGPGS z77J^NOjxB~R2rT#s?DTC>Y%9Wsf8O) z;9-WftIrlYq|Xa7EGcbN8Qh_F;ZI82y85&>KE-G=n~tsOYoN_A+%dtRR&$3 z_7nB!Ag9H(PuG1h2#unEC|fjX%QVc+Hm(XMnGR0F+KmnQTTg({CdS6bMto$v6r=S;6Y45>a`r}C&8+)6GD6%SvhD5`m}2v ze>ZYh#}sfFi?vHW(}9I_<3}l=8@sUbHU=aNx4HS?NlV;#Yts5RBe0$wNpJq4Ky-!e z`qbxgM7wi^Obltcw`4YG(kKduo<$T$&o|qg741g!z$M+*_y-(yOF?K91!K|N1Ua*1 z!oHVc3JL>z=E>JTgB7O7r;Wo4E=|ESukn+&v^*sn=MKq&&E6AhU{Tm4#^ca-v{G@i z?zi(POCk-RSrTh&Bi`SH-GqoA-3pLTZLT}g>Amkcxei#stLQw*ZCev)(kKdu_(T+x zFW1xTPwFAn7UJyD2^UKzc7f0+3dW+D^7qUuExn(ODM*cw^LH>M(XGh=jg_H|5f3?M2aYS~$Nt7Vs8{|}9tqOg2m+%fZuC}LHFY$aesH1GiwQqk z>o5=g%MYenmkq$KwIDcrtIdvb)iT!PgCmcoi}sNM1nYr?@7dR!)q$EfS`vvma5r(5 z%Et*fIAU6@1f(X33OrE-!BLCSSpRzUaz@bi!mct*MC^d{6+PKou&60RAtNFb<#Ij* za#fQC%SAa6rV2Kbl0c?WGdEfii5$Xu{LhFUEngCYWv{Jf`_*yq3mA@+M2gZSk-||` zrUC9%FY#xh_el9uN67(Lpq}i5HlM&tKoTM%FG+2U*AD0lC)` znTqF5d_yF=e7>alc4w#rth$FGlMxS-&)BU!8k}s1P2;$1Tyn156?SxBCe@2ZNcf>*P0Lxu&^K`%Kq`y*?ncQMsl~$+eFk zEPu|*dl!oh`_r|`;0-rZ`to7IeGSdw?}Hq*GK@-Mh~h8%|&*Z zOqQotJ+^H#YoO+r^HsGVG$sZ9GzG?ffrDFx97!Jx4bM%t!<5utgV30cfY7!dovA$c zhN2>-V9;Jgq#|nzmw(Z#ZL9Y^z+bLi!U(oM=wSsGxwRU&#oEw zVy&j|YjX49V0_E`=O5<`fQCv};ou7>&(6-Vm*5t<_WG25+%VY`4whbOko^t2P{@$X zbcUa$Eqvl6Pp$9=c;2+K*v&_@ufuwVF!G>hV*jyp;$2ZRl{`?XrR<$ zB#x_>SeMY%OY2vR|Ha?(=ntkr_2elth3C33zd|(N8qGYqJiA!vu#w)&PEy_4u;!xq z0+z`qf!0xPL;iQMQ%jw`{Sf`;^5EB}?B_5K3VBwt?bR<~9|=P@BOY|ke#FT1YLPoi zuF*ZhYtLPJ2C|LG!#A3T<8q02m3x*o;fWL2e)fA*h$|NejphMwrhj>OdxU%1lC!2i z@R{pqYr{EpR*4KC9OVx9nb}5a2V`e89WHlnxtvCh<|+A_vOZHkt%Tx@KGKQY>t6WM z_NW7U`!Eri%Wo-t(yIOnf@7#>M1UZMi(_B?MmOTs z$$!K1+MxU)MzbA zt-o(V_gbb&%JsXY;Ll{2_=s4Ed+J9J9=$H%8|Qx=Lg8>@+NCpJFJK;21gA$#kA4DE zTnq_~cv#w?E_KLF;48K*XkI~bWa%Q z1xx5pl9{OmE81cbVNIWv8Ur&WW(dw;$KTw#SlJ`v_O2L$S~uF01cfskSyaC+^|B(C1t7g*15wdFFHGT9(8!qu6?-Fa2;&s7(5{VO88vt*Sde87o%B! z)-jw@Uz`g56EfBSL+(f)CWy=nUUd<-|K;)&BxkV@+K zY10ToqjfYXibOhk#z$^mwiT|V4UXfvu$-A(i3uP$=E9^#FHAmt)+$?9eVuzW zEWdCn6g%C}fYsqKJprM8wwSlLDPm$AW+6#`L3mhfa3{z%1`BjkS{Cn%?$U46vNvJ3 z(&>&`*Q5FVHVCXajO0=2Cu>jNo)eY4?T!~7X11H6Lwjq~T@V)26B=nxSm$#=>sxRd zsSNfQNpRx$Yz@n+AWy*06(AkmU&k)RnGnN?mr93aiXtIW-(X2z3U2g{64KGn_gmZw z7>rwj$J$%APF>i&8J1aLe!Z^r2lDks^NV9^{nuhj6)*ouQE+^@8Z>hZ7SM~eI%l_< zS6;kFO51tceG?8TF1iE)qg?^#xBlvA_i1TM$9svAHpsd15(_7nc=ZC|s1+&lzqd&L z>gbOmv3wG~IhQdJEsoFZIE9iFpm+yJ8v&%FbzgAx^t}!ub!wNlI2_0urwBWoQ$&!Q zHX=g9NWi>_BXb+3)$mArzKZ-VMUZjKJhT@rLySMmY2W*JTLYt+K8#a3sn+xfh&HO< zkdR(-Kt@ULM@|zy{YovaTJin&Emja3{j{EL^%x=)UPjH{y{2FxCPHrFe4A?pBd|gu zi6M8v~X-lb3FCXyD?!eJv5I*Pnb zfd|A$BzR171CS_r*V}DZheHUD=1gZZs1xr4`v;M2y1!~R`byaif?LZ z#zX|>Zd}M|+MEVLqloY%Jta{@acNo4yqsS+3lDJf}?~q`AQHG^KTT5 zoH@I%1*4U-zVSOXPzwvUsQpWX@VXlxa+NeYFcH0j^}V}&cEDn2^iZ{MPszVRn!j@1 zlUITv5Af6}=3W%$)V2pto$Yb*4Qo*`Z}*Q~bL+cw`SD<9%;Naner&;h(9}`qB{Fql zG_P}=&gp-=k-QnBaU@+d4`WyA&9`lIs5Ny8Vyx#LFn6RPOlBzL0Om@B< zFe}XcHlDd%Lix%2S)!HyZyu0;&3?V=nT41`BSvd{cu4Kh6bV>RjuO&@Rpb!+jB_q| z)$~VTG{LPg){^g1V7D~<|8y4t+_{#lIXCUttZ+tj15ji2cb2+eXs;9Z%t z5BB)P&n`0Hs9oeM1+tBi0iuO;^|5Cx1=_i9@wxTnNvE}f@gA`-tkKFz^p>`_ThE@w zM+f5ZF!$;ER>v8*aDl*>m6J$Fw^b{jJh@PWA2XU3_M~Y=jZzy3jdlg{a(f@WB;Cjk zOjqMbnuOuJjCcE($)&+QHwtbv4L6fc!-=fWk6RZujnrnas`o3X#~jlKS;rs&Dd~eR zZaXZBu1UcYH!izP>%kFr;8}@L#*N;q^%i<7D!(rG1|DhgtntC;NI_Q2Q5d_DSajLYV?$nF$TD<#!9d?Ij^4r>68-|TQXbc&L-mCR) zR?F}(Xz9TteVTW8I58o*90WE-#vvYzR3FCVy2Ul%k%s7n8^1r739Ip9E=m6MNW(sc zJM4I;POf{g{mzkSPd+UIGLE?%0Yx-g`PMfb ztjPa{*SDRgbylRaJrVl?y6w#Px z?lLuDqvuI{>dKO^z3$PW_ylAbas^xk_*Y4fY#dDM`J;3Ue<59ltTnq94)s9s4v;D; zq@*YH1-cZNZpz1l^^DnY#xEzy6a<%)_GYY-?&As(h*8;7uD%udJYM&2pV&5KuUVvHycB1k=MU45n}I`t%x@iEdz}dDe3w# zN;;vgp`di}c^*u}kdUH6y?Jdk43F9zgwFlfXB;W%LnlQheSU8~3lBDYs#vnq@WK}$ zIEsj|N?MlZPte0lYsu9YuXl?+tkn(XgrPC&x)Bk-BYwJX+O~`Ih2btq+p6DG@&ks( z@Cc-&QzW0XC+k#^Pp)Wlk;rBsk)S^T_IWc-sGLiYb_R6fDYnX;2)+G~n6hy*4 zVA{XPt8P!@sKd=Ymg}2Y-k*PoX*iN3;~#5m%?mS*(LxWMSFd=_{`yjVJ$VM#a;A#+ zl;%osw8b_Yzv}jly1Hd2RK9$v***@^=wNDSt(N&AgFK*dqoE~~&uf`_b;~_xP4bQC z3NE|&J8wI9b09oe(>!bmvPt-sv+*kCp~qtA)C*;2*j->M=`i{x0Ln<$7T9=7+>0Xp zT$C)MhHl(s%>WIR64Jyt#Dhr}kNTyIFw&lV^E_3By0h^!L1@%R;;Dt3K<+t5y$QfK zuiU!t$;y@ZBdITmoguz#a5@N%dG8tVu==Cjz3R|T@|wb$L&vrD?0e$@LZiRns~Zpmy5LPX0@5W@kKix>o}s=uo?v^=;|;%84P)arIUP#m z=>M(ks_fi#TsFaQ#%fpHZnJ*SN1r6e%j`QEHpnhw1 zG6;=UzPRcxa4srYnk%mBaZ`yL4A)Mm%-Oq9wF3mlyaA1P7(ct{PkOaGscVaNFmtSs zbMXYBG4}^GdR= zzQAZ;6!6hHx~2cE)6&W*URPcPW*_^O4CmsGP}V43MvPgWt3FsL3Y;g)+d7{axcgxy}a&z z`P?B6SoV@~tzS=9XMT{xpW8LN%E@`wwy*+;4RxXrT0xG@6D(JiL|LbF$-V3weup(R}&N=wxGcDBfrq4)M?;taDp$Fq91T zoJ_6h15p#`nYEfMN=Qg=xDZzO`{bPhJazZD_8RVr3xU-aG5x`k_J^CVMaw*<>T_VU zwB+WhPonQ&v2$kj2N5APEVcMY*r60m1n-~b)*!h!E9k`8auOAXi0D*rP?@c8Z4q98 z`=1+Y^M0NJn>pGch>Al*INls|s}l7gm$oQ7TyQP<{*df=2 zY!3UE9x-kY^@a&)x?CxG%w-2oi5n?v9_D1?FQhr`JPFo$xcLxMU`GPcl9$k#~g@}PunlryyzQZF;9ar~yepDOm&KgZCd6pXq zX$PkVw~d^_N#VKZ_SbE4=bBt##xdHrA>k0Puq8}hsKp3>a|R2yJ-0P;h1HGG#)ac& zx$jUIny8HC(33KJ-FRF@qk6q z+lwGLN=cKi1QBt<-BMCKq+&WIqOd*Df47l7?9fUP;i(niiVXhFxuJA6-$0EEro5;l$0iDh=_OPhB9?6 z>^tyK9X+=lHIAfCU|L)QLSya_YV^YNHQZxW zxR)v^&oXUS*ez(%5d%VF(tyy`zj(Lc&7hnKK9US{^%rs*{DF!%awMUpw6M0!i&#;i zGkBal_gVR->wbf+O4MPAP>Q6qUsy}#TYpXR+#HKWY0Dq~r_(^=WVA6s3GRGviD9YR zhivhJ85te1{Po2?SkjDk1x|7kj+ctHut_+4k9EtxlZd~!zL~1})t!Z~*du*fA~)es zE;Quv#N<5^3rG>_jI*rOZ|YMAVPhR_CWEB(HyNRi>q=&GVcX1jG=-Ne+6OD7q_dag zCY%Z#R%&utY4GF8a*`-uol|O2F}Y+r$TsFl4yCyDw@4hceszT(6Hz6*vCbe=eH{pG zY$YXpXXOE6vKm6IL4|rd8i2%-=h~`QvQT;+&og{j~!0A3gAz8?0}&$90F!&EZH9r(_G*SHfJG zkd`ifdm(v3YMTm1Q+v95R-#B4EYQl-(ujzZ!_xO{-sZ6xI14v@w+xDYTGVcrCd2nEiJhEaakk8=k3OjT;AoV+c7^ z^|7|%w}5)<%o%v3A+ZT==C*_0ATZ`O?N4vhbJkW_n0VW|VKlExS(h?4_rlZ&bDKtJ z@f%}Z&4rDE@jz45+~@A~p9ebwGpGNvm3M&-^Bxs3Jz`vP_CT=LSs;Xo~!j2JFU|xx6%S{3IVeZtEuTP zT@M1I*EW04DJ7#ElALv z_t>{pI|@eJNP2h~rLF!856mCvlTGB)|AHfYF?7ebysh&`ULU$i%Bg;C z5~#fDKektCmG2ea)>~zi~LYgL`bl#h}E;@x07|n3q z!$}>kRj`AN7^8h0BI3~6wR1&n$CJR#1R1{U%i{4*K_jJ!AO#wTi0OL{NO3(dSc{3s z*w#3gQ*Kog42~iqZY&YMf{VAX_nMNr^MHGjlYU+@0!LcM65*dE6S-uS2C4sl?yf4L z&T;(}%sOhY_^w{rN%|rbI9$u$+|4uUggqtVca68pG2X=j!=@8DeL(J%| z7MztA#*R-APxY3>tFLY;0nuogs<;Ivd%Y?+Aj5Zeka(bpg>F~&As zNpCmWKksaLvHYYMM!P?2vyr*1r7aL`bel$KpFcfiTiw(^X03a9?MVTnVsRLnbXqk& z-JqvZ)w?B4HZHIt$MSu;vd6z3s7wZ-(T;DH`Ckk7F1n*kef0Pl+r_Pj?)7yyF${29 z`4I&7Kgzy5n(OEL-xif6OHx9XY$YKiOUfEbrG;c`6S71_DWq(b6e%HXcG*?Rk}Sy< zrIeIVBGMvhBYj`b={@6_-ygsGah&7$=W*`L<9TQ1aqpcw!nFPwTPaGrAOBd>V6?pi zPh57afmw{czh-|=8>0EJ4}==(DU0D&XXb%OrPGYA zbe-iEB5#$=l1Lx9_eQ5$yW?iUHXC7?@tZY>2bBw5OZ~LuHe%y6IeV8Gxyb9=FZWt4zS=JgNGjSkx)F$Tdeikbj*n8qvkg~9HJW= zOa5mbx+xwWNq)P^vq>%p4>kRgLtg4pF&L|e2V9hic$oZKx0b0jsRj>q$(H&Ty`LV# zBIgVq*l`vP@xYO3E?1YIZG#ugqkdZ61?4TUgC_EaBmW&CloY9}{(HmXyFTd+9K_aD zTZDHx9h{v9n>t$E7;=cz$pH?%Lyt)|behfMSC=9ZtwCti?hyLl!S(NJR>57z&nM?q zDq`cN-{iY9RI3DA&4p<_$B=*J)sDr#e7xW%M&mR4Y&`mOBpqZNg9s7?Mnu@yKUw{7 zdfp%=LM_2>w)Lx{(92;AhYP zi9imsW!k^?X#=Z=Fl6@Kh2J za?+HLGul*gm-j~eaXeD4VcE3BbE4nCMoJTM=cuLR-Ad&#(UR$ZuyJ;;ExuQ-WryX= z{}FQN(OOA?({ti#)N1fI_jPyL)_aP-Y(d6Rtd0vgsz88si%v*q<*sQN_(-CbUze^G z=M0N^sj!ov1|xL9DrtLr)tnTIB0O=MdzDOh9&*Bjm*&KvM&*jm_sSmkNmH3)UQEqh zHfvNtBUPCY)JQpTHl*y^Y!YLAcQ~%1Fth9{2uzcs}~%f43=TE`8>h8+t=M$0Yal|X?2Eelb7-qtbe+G0cj+q`sRIN z@jjtY5E`8Xq@^zuN4N2B*lLPxo1W(M@#3`uvOu&6L5;c3w4^_Eej`o0m7l9pa)MRym5+<^S^VW{ zz2MBU$|R6!`5`iNDJ?yy?=r28QwV$NMYh;QT7BZMa~yqhsG>FpwQWDo_S6emVl-*? z;$H@n1!08-nzR!uLYvdm$yqPdNY za`ss#-uvXY0fa_LGdo7hWJq&XUeTEvNoikaf#5VJN@+u(>pkW@ z3AgaXsZCuyRIu$KER95`A&H`4AE(NzXPxy#N=u8cQr2^dXaLzp4K?&1DLqd!&fDDB z@D(=hMd5oj`<&q)AUL{|Mm!XbJuQyiu<9P>L20^=V*Q7hH6S#^1Fi@{A&ri!a;n~c zGCGYuOuP<1E_N|489H3`%Iiby7PC zWhyMeIO|^}J+S|V$+C(<5|r!Oo^Cl98_EV6D}7x;?j^D7WTMsE zFfGi(=2+`zF%8;mo=7`(qM5d;r;o`~hp#nK6v)s-^t7 z$fl?fat1EBJ45KjuxSDaj={sY%%^y`zv*OkkJKj8g*N55{tx4jv0M;ZMvsi(l7T#y zr5Eo>ZE>K~s!h|GO^eF2k}$24J(lSU>`C;4!O6(}g)_%+l1J2vO3Jm@V7Ot^H}?xS zjZFf<%}e>ux<6IOI##C6KP%Itq@qZr{ewe0AIs@jz{1Kd815Q|i~Zs7b7grfc^>9% z`l*#leGfH3*3oluNK22n_sec5v0Z@2D*99<*YAbxK@b|_Ga1jt&82d2IbSTVZQ&~n z#K)zEYYUDq%TJyPgQMr-PNUbC#6<3~b(-~?W1p}p=Pz-PI&lVsM;CJDjD>S@-n=dE z<_(?QjM37Zgw4CGLSdx~^z+gT>LZ@@+ivt`cRp!ovLbFYoV#zUF~~Meqj4dJh?rD& zWr@vp)&@+(H0}F*W+h%7AT-KfiIA&h3{~Xhrpam^KVIC$L@Y0N$sOW+3hcW;!Qpf3 zUm`fqa+O>UWB-DuZY)os^l)c7tSbba2t|sB_Nu!!Lha5ZM3U)tAxJoCr6_2y7LFuD zLe+h!N_aULTJ(_T?{aU=JGt`n6xhvciwQxE5b*@>&;Dmu;9*|q6D)i0n`{9x%$l}Q z2T>b!liq3Pr=2a6Fq%|l#aWe?Ww2pd)6T63%}FCPOi8}*5&lBh9!@{>xVNbgWEf9&aIB@x`;=5w?T``Sz0I)I#PdpQTlH>wEw}iFs~b@t1;Z_^Ew}# z*K{5S!x^Ui*E0mAxs{fET{`4+nY5QMKC|@c+)vFHp>X3b!XX~Q-!K1YJHycre8QNoj2m@T0(jz@FL5=Rz3G8PgOEGWa@@bQr_H|^p4fn; zwCbPXXJf9G_d%xRhZxbNw3T2M(+SrRUOdd8;b)$jL)@@4D}70-qL!qp;LxG9QUyqyuxn2AB?+NralLp_?B6eg8D0A5EI+$=D{Kp-mLzha_C3`?U4JBenHz5c z*`KqHpW9L$bO+|B){f)K9OaUXBRI-y!@dylo1nOdX?@OzDIgN8Craro=bD{8cihR% zW=S`lT2DD;TNoN`XGo%GFnJ%mPyMh{E-yo7PfA-@dNWPE`BM`x}~o@ z)jEYq2BYz0^376hC}Rd0$KYWcjXHHXxv5Q#7GHQ3qpcQ{&?zar2CLeoyF)j{!x7iC zkkG3Z@t6mbw#dR&i%X0^wjmyHiyFj(vcM`27Nde7eCldabmp@i%2)!0vlGO5t7`O^DS=v9!qVexgb1-LyW6miimYP?y(%2*35*bF1TUw70pXIzhP(- zwKV6&nSSwMQ>Wsovj~?pU9f%-mg7cKhr7yrp_o{@j^AytqL5VGDR;kDcXIEjgc(OW zD&B5P=iO})O*XNbq22P9E36earC?kQ%vM6sz!|ZU4CZ4+8^X5-7YNw+mervmr1r8x-34h;S02? zb-b98hnlz{Tkd_2s)9)FEYIL&Zph+0cR;oY)6$_l)Kc?@Dpl1=iYfmJIBk>pvmQ%cBq#KOU3*OG);%)=;nAyFk&f2VXM%8?YeNw3K} z7{;3oi}KNxG$KNi(Q$fk;ip0D4-tNrSB_np0b5GwnK(qmzNGRVIoB2a=bP!Eqnxr`&UVCT5ND-uJ933^ObRI<>^~# zQP5_iG#MvE$vD@2cV(nZpKiqG*3;YOt$&_%fj40s{g?>t&zZ5( zUPq>a!01{85wT>?`zv9UjU*+y`ef1IwVqd2AT(-WA~FuuX|Q}Z_#v3Gl-$7-`64-| zf3E_pdVzu?G7dSISZP+SmvhWAJl45=(#w<*6U32qXM)&n+n0x^i!%NFG5PN={IAzX12(HDZ8OhZ*XQ*<)qV)8)zALD=zJ=X38ot{!LINGiNpHo^FT0}- zoHyEA-zfL3%+h8zqL%E+@tZqLw#q(C4A$s6mzjhc1 zjphj`^Bwaik0E8$~;FOnsk|+gV*bTVK!3xdU54 z>7GzUdBOwky>A`k2jnoL0o$xOxOH4lgN8}>1cY`dQ(4=r;^z{)mq}HoCCg;{)Pv9{ zPav<(A%VSMgVyRr596b;agSzPa~qgj3JWsR1vW}CImA`-2D4<7V=T+m4Py@%aKoY; zz7qv@QKa@7_M!N#*tUe28Jp+EdBKKCry+@=flop9vxR&>9iBKZ2NrA1>@-;Dm1+<{ zD%_hHa3bb5Yu?7MS~6a}d~<{1NZ(c1=?U?G3$>BJ?l}?3I^Alc0v>CesLHas`Be`< zv@&=gk{I!ja=l4xhSqn|Pb;Y6V@LS2o$Enp3?2v?DsrtmD|LJq=Zj`++wA58k6NxA zf}M)#Jakh$)P;C$apGJ+A`@PI8433*SYdf|iU(2_g?M27qPHvYhzQ@t)rx;?zAL0^$FBTi;v+9V9 zyo@f)Bj^hg@~>!z(%7rv##WdJ-io5oy<0nBDiIO!ufX)|yAHGJ2*llj)5S*~-DhQ5F1adH)XPhr36aqhET323h+U7eW z99BF>FYH4CTWrfOsqdGn67W#3nY6fVw&h*`vW=n@e{QQmVo-_NeYy*7krB%)|Wq?(6KOH^LG*vdj=!BYGP?q7X9;KgFQ zEM}<+HjlYcM*oXykptAc@$?+h*Pand6@o@LNjscDsZ$q5US|q|;OOE3`In!w;wt43 z_XC)Sp1FE9xqMPvL1?t}93o!h0+W!j(j=n4@GWM>?*YhG8FT_1Nh0)9vg>7wwuPK4h=qw;K>(|SNUGDYm zkiyZG^goX^1Kz#@p&ci&5yqoY;x3OC&0BwI=N@d>rK9X=+^Ys)LBF_(;f#cJKec<> z?~=leM%6iMwjHSA02vlHF`N+<&GeL)$BX1#z4J!@B&_s+ot5YmxKk9kZQ~Hs?wR!t zkMwzyi9+bYs|g_6=oBEdCeBp76oHSkv5Wk8@Ox>rC$3c-X!`=K!G%)@c3?>NYaK zUUl(T+!c?+xlkR#Xb6Y1RY*wRyR4^{upoitgSdT}Hyx}~=mn9$*q;5@>v&r;9h}Sc z^orCL@qWb!&&B29o_IA9Z7TTfH+lLW5E|{7Y3dxp)H2l2n5cQA6wlk_X~$a13|+sW_ygHC~$OU+hjLokY@xg-Wdt9)am-Y6m1GQJPdNeaMIP^m;J?(kJ+p z#5+B0an;A5!O|YbLOlFj5EW+0{Dzbt2!<-p*Yegq4+5j}fR6bV`Gvg;54ecqiM#ON zp0^&n#RCqB{^en@-KDS%0;-|-(4}}d@ZJaG6L1|p>F9qKp8qDQYkL;FOlULj z$L2N7kRH=MyRZf{SVRP_zDMp=rIRY4U#iQG9U|L)%JkzF)0{wXw4UCGi0ewpJ;|Ta zNJMVap)2oSFVlhLZs|`AbW=|a91$LhoUwKDckEt!UP-nXtGCvHOrtML$h~Ygb5{z; z?wXEy2(K$Ycq?GwCkTx(Z{vL`9Z;TnpJsc?x9*+nn1_snX9ra93sC5bVsVqkh zVRp1tX0=rWsV1|iuGA16);$b@qqQMJJS503alX;oW`u2%u-tGp>vb_f^9#-q49a{`FPIrMOV;9ckzCIo7#J#!~{e&e3j9PotLL z3|^I=x<@5Rv23#Sf+gl}e7A!}N>5XZQQPYN@ZJM_#kZyL7OiR4sz31U7c7`TYjL8= zNFl{%f3;my-4lc-O{+*L-{e95T9{?DV^TD=MRy)DatRK3E{M@ST27W)`_=|HPTDaE zp>ZTTFWEbv$rd~Pjxi>qU;)n_kZrW9aSIt64U>ep`OEj~c6wsd7Twky*?D*Ebr2Xm zL5(QzHTFAjyTAJ|rl66XyW-E(pRltC?P?rFfp^Ub9l!K+a#Gc44gSfl!+H#6*+dG8 zSONkU$Vr{RNdzWdP(I{>ZF=8 z*j%E&(s&CdRCeFAe1~~9zd>lU)HL!bk)=s{J@l{K#uU8080@R*tJDSpqm@)r6x8hK zF4kXREQE*28s<|IJrt1&!m^%7fyD{#C+odiH)6EA^3EBGtaD&-TI-1ve36_r%6xN# zAEUil94bG2&V4t?HhR(xQ4p1+aNg{zodTx7OzZZCYm4k)@djGb4f#}&?k&3{VHZ-> znlf8@K6~0ItS2HZ=|)kom1{WzeMgPNd-SJXg!votV7cY$8`LL(a@nG=uPztFqhI2JV0ammc6@)Y;eTdnjs^Q$0#%SmleC4gLt@KV&j5Sj^<_23W->qIAU>ZU+xWa zPLus0tnuk*bbk?-O%&#rEz($l%~D(O{+kEi23XB*{`iC5)DTaa?0L(3$1)9L9k8Fn zUKyOc4P;h6yKL%z-MlEQ&+BdJ znkbH!Mw?6Asiz{}TEei#=YKkto2YV9z2Z2>I2aGJZGF3I`R5`X5Li+5c>9vO)VWGz z^m?rO)v^GL7MWLK5ZwI}Ry0Jv8I2~b*>I-xjb$rIp_9hQtcvnRS1*ul^kg$a%ac{o zFB=u~z!X&d`XM{EycO2>Fh8V+PQimd@&0wQZZ={Hf?7{=REWNS)%?<2fa;&hTz8iD zg0X}@X=}yGY~z{zL_`2I%%YwN6s&aUJnHczfD|~&3LNbJq!RH1ghsy*FRngz0rAqcRyQ(kb6?R#P3 zXTLSrGJ`pNQWjI(BSBb2v{%O*D5;|GG)364w#N?>de^l2v!&n7ED#!P9YQ{(mobD<6_0bY;I%+qz@8Qm7J~vZPDFutdNx~L z*0K;xK~L<*%}ai%z;-Aa1<0qKvfp~vK74|F9gUr$OIV-z%Y#g#?*+otUQlQyxlll` z(gp_rQXN;=Ews0V<@l*!2dT-?qPk8_|JZnEyWU%AJa76M72j^&@7I7CM=L)Pras+C zIl+lilO^*p+DP6K8%^&ApJ8aU11WkX|UNCYcM_ZYrHTBjT$QHI;li; zom|%+#5cA$p0u%Bz`tdpU?XEIja-qA-+^%>RSKoMi|;e9!ynz zA_mo&J@F@Jpnl_Fh=}V45E?a9(y|2cp!)i7ySGNH5Qcl>-6S_~pA#CwqTP2pNZofk z+!e2QSHOs5)5L_2P5pkv{U*pd`r!z(d4uTBvbu(RZ(ZJtz#$*Z6Xi*M*U5l zcD=ugdARaj>CBzbauFEXL>}&cEjnU-(UHW5zpDN$8G5Q>4?<(`Fn-@{CUxJf^ubZb zxefQsFb^HCt-UMH%RYy~jh96t9;UZCyQvOlq~o#rJ-AT&ntQ8m5`jn<{F?E{q^`4@;vYkIw7d67u6BMfaK58fq(8h5wv zCZ$X}II_wNb}VxNp;5_YvIJ8XwMCdJD<9!cr1OMJJ-FF|WNU6mRn;U-&1}{Ogk+iHD^-cnZ zmCXq?o8kB;*fg zu(s!unqnb7DYZm2uhJ+2HaVq9Hpa7FtRDoGws>uw?}iyQJXoqAE_UI6&Z94f8b&M`gp6}SVkHaVxUX5(~L>uddebV-2G`GxxT0~DcPZ?bkmamnF3#mf*~i9 zGv=p4h|^b^y}fVmc|;e4MyKE}T9O}6Iq#V_c-oAZhKhTSXPyV4(I{9-1=bxBPSwnr zWiwy!d7zOZ8gOR$19jvQRF#Qm)s0+$$7;Nz z-dR-~n&h9c{6iS+li#!>g_+#NAmixjc{e3NyuvI0$Vb@4V>ENI zrm^#ULt#L)@d!pPBU(UxtCxX%>6yq2AM^|&Vv-KhF_ZGcajT1`pN1xsIRdH`^)@8a32Y_{jhy-a2nhpYHk4r5N*I^Z4_}3K<1P zz3|`i!~f64&T$^BDIO}+I2*E4ib)g34|P#xcAtvdL1+x)+|S~52?aA!&Cl<57g9fq zjXV3iGNC=@=4B8ZLqv~%B-BbGQJo~3V{hPx(IQL5vs7)>|926Mc!;PNxY1iCMNX@V z&qEtR4xNG(&`?7q{U#9)Tt@_}_wB7ErA$lLMn_+2Nc#>NDn%=4Rx-e-{9Lvq#xKR) zx#lDuYg}GH@%2!*F%TT%tTaAz6s>AEQ;mCCisoXp!AkGhPt$cgVQ3S1Q2DTWvHf7| zHH>z6{`;lFY4=KCXcPUR;3s#4ptUz?t+^?|Yf9?i)?g4CW8(bDb4^G@&o?&Z&$Z64 z$L@8q_*-tY>nI--&dw0uX+u1eUbVHF5#B^@@GN4@DEHvs4^v2V9*}!UE%F-BPXbC2Mv|-he^192jaoKX{~VU zdWBF7my`AObAr`U*cVKFCAiG0T#Pyff7)`^MRLuvh4`cyqQ0bSYqSn5)gijaPeDi2OOG=x1~>y*$&38EroKvh&!vm9T>xE$fCJ+Wz*( zJM>4p{BJzWxR7@3qIokTL59(@Zb(IY&y;#}RAxWKqMT33%cZQvvT%T5(Bz#c~kd>dKWC}NdJ1ZsSl*3 zFKEf*bjvJELzlON`0DkO{%0YL-mKV?Ami zcg|Qz5|gSG5V=yzssPrpi|z@&)IgcaW_;XXJcZn`y{ppCJE-^smZzb60z!Mxd8?%K z;YkiWZ5i{}j82`~1uLJUc>)S%T}X}=quw4pGS)k_zO#)Givo`8ZGl|HLSTiN-`@uyob?}{=@bTw=-qBaFl+-n`F zXdAUd<-Th!RAaaoH&&=iH{?OLEJp7X{NNi>(UY#;IdFTvlMxk$o7wfS!!P5t z?tfMEvw%s4QrkrAFxtVT+}&F`G^fI5j+TRVqW1cOoGSj-6{(9c+WV{@I`JO^V7mgH z2c)7iOP4q|e62Z%Rdm~1iDOT@^kHa-2mXIl^rI=Oy6iMxe!xWh;_ZDeeS~upXspzd zL=Ig@MMr+fS?b`+TYv}aaL;yE<1ym`5FGv4bfls;r~S&B%y!ffquqbJXW=oXnVUgq zbQO(=SU=?a*tB1`f}qtMH!Jh-RfeI_3Nnz2Ua9=piPyD_WVd#&n|l58f& zpPVqYCfRCD9a?w2Mg-G(dTvIx-@~ggfke@|mh=&jqS6EE<>zMYyKLWs$6BM3UhB%S z1SUclGJ4!P>JvV5GI8dr!vWIxBMG{_ulV=5Z+AgsrM5xx;F~NXWXmckcH-voIRkUB zahI%O)Nkcxo&>=O)2buG8B@o#CB1se!)@v$*$`?UdAR11h9wM*Muas*L|5PZqNNv` z^zcx-SQ-syu$V1NM_YsK& zJ?HQzoH}*8Y~4rgOCU7r6CUq1$!JBy${Z?GP?d09fy4|hWc#tMnV|_g$uYL+@u{PD z&5B68EY>%E`$>&$*WMg!zpWtatS1s-D05|{jo>0{OhjJ5wAWGx9RfgT)T+50-`=}O zeZrkD?&NH37~6-5sBq7p8nX5+tRmEUA`xjV_c#9ev-m3};(F|Bjn)OLVP6SFgdtf= z5D^_YuWl#y&)P+Ysc7M3$(25KbA1R{^PAX#3|rLv$98+XxXgJtrfY6TFS z??fVumG7r+OA2Q6gZcXtx%U1yqe@FyI*B4;{8AetVwvgadS}^oX8hH~D%e~)c9yRX zWF7U@so@YG%5IBnl{;6iFSr4pTsOp?;o5ke16J@$yVQo1bXUyi@RV71Wbw?MXLpyE zTR#fBhDN{CrcGUHdspgODHT-u6Qf1mY?Tl97`g@;Y1~8}{+zB=_ASmPrBq@n^&VrT z_hH)?eXG`_R+7H7WTTZk=XYY;wAY-lmGM)t1KCD*2ZUy+W_x7OP+l=U@vFN%U)u94 zZ8ivvRy#=vX|=5vmVbHjjC{S%ERH0_Tr!89g6Y|xnUrf8rmd=(are$0{CNa2AIiCR zK=T#MGOC7~mfSY_bn<*C=kxja(|w~i_BjY{g^C&sC0w=l zE;)PEp43ZqHCz%6GLBAz6-C3?dYfY79Rnn#cTv-2)+Jf%ARyX!60U~YX+qx}6p!F+ z-;O74YiiOq&#v{bszSsAmT`!O_N^Nd9z?mH!*JTiI+-o5q`_AtBI6Jb4|DTM_eM_> zz^)b55+d~RunrSwtaKTNc$mKKr+dJ8Lu-syW1*v-F*L6OghuBc6L=U3Sz|Nr;!aMCR+tz5+&u1%8VHTPB>7TH(%wgFgq91pkSh{X zt7FgY3lxXlVy7=j2#tBx&@x@C*3a1SU np4)Ox5@Z`~NkS0~ftiU*z9*=Vo{e^6 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 Date: Tue, 20 Jul 2021 10:28:26 -0700 Subject: [PATCH 4/9] fd_async_io_uring test pass --- io_uring_test/io_test.cc | 8 +- io_uring_test/io_uring_write_test.cc | 75 ++++++++++++++- io_uring_test/syn_test_file | Bin 0 -> 379219 bytes riegeli/bytes/BUILD | 1 + riegeli/bytes/fd_io_uring_writer.cc | 17 +--- riegeli/bytes/fd_io_uring_writer.h | 4 +- riegeli/iouring/fd_async_io_uring.cc | 138 ++++++++++++++++++++------- riegeli/iouring/fd_async_io_uring.h | 88 ++++++++++++++--- riegeli/iouring/fd_sync_io_uring.cc | 14 +-- riegeli/iouring/fd_sync_io_uring.h | 10 +- 10 files changed, 271 insertions(+), 84 deletions(-) create mode 100644 io_uring_test/syn_test_file diff --git a/io_uring_test/io_test.cc b/io_uring_test/io_test.cc index 7ad21f9f..23424e7c 100644 --- a/io_uring_test/io_test.cc +++ b/io_uring_test/io_test.cc @@ -33,9 +33,8 @@ void CheckData(const std::string &file) { int main() { std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; riegeli::FdIoUringOptions fd_io_uring_options; - fd_io_uring_options.set_async(false); + fd_io_uring_options.set_async(true); fd_io_uring_options.set_fd_register(false); - fd_io_uring_options.set_poll_io(true); riegeli::FdIoUringWriterBase::Options fd_w_options; fd_w_options.set_io_uring_option(fd_io_uring_options); @@ -44,16 +43,13 @@ int main() { riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, fd_w_options); - WritePtr writer = std::make_unique>>( std::move(fd_writer), std::move(w_options)); - - for(int i = 1; i <= 1000000; ++i) { + for(int i = 1; i <= 100000; ++i) { std::string temp = std::to_string(i); writer -> WriteRecord(temp); } writer -> Close(); - CheckData(file); return 0; } \ No newline at end of file diff --git a/io_uring_test/io_uring_write_test.cc b/io_uring_test/io_uring_write_test.cc index 8fd6b3e8..826da042 100644 --- a/io_uring_test/io_uring_write_test.cc +++ b/io_uring_test/io_uring_write_test.cc @@ -11,6 +11,23 @@ namespace iouringtest { using WritePtr = std::unique_ptr>>; using ReadPtr = std::unique_ptr>>; +void Sync(WritePtr& writer, const std::string &file) { + riegeli::FdIoUringOptions fd_io_uring_options; + fd_io_uring_options.set_async(false); + fd_io_uring_options.set_fd_register(false); + + riegeli::FdIoUringWriterBase::Options fd_w_options; + fd_w_options.set_io_uring_option(fd_io_uring_options); + + riegeli::RecordWriterBase::Options w_options; + + riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, + fd_w_options); + + writer = std::make_unique>>( + std::move(fd_writer), std::move(w_options)); +} + void SyncFd(WritePtr& writer, const std::string &file) { riegeli::FdIoUringOptions fd_io_uring_options; fd_io_uring_options.set_async(false); @@ -28,9 +45,9 @@ void SyncFd(WritePtr& writer, const std::string &file) { std::move(fd_writer), std::move(w_options)); } -void Sync(WritePtr& writer, const std::string &file) { +void Async(WritePtr& writer, const std::string &file) { riegeli::FdIoUringOptions fd_io_uring_options; - fd_io_uring_options.set_async(false); + fd_io_uring_options.set_async(true); fd_io_uring_options.set_fd_register(false); riegeli::FdIoUringWriterBase::Options fd_w_options; @@ -45,6 +62,23 @@ void Sync(WritePtr& writer, const std::string &file) { std::move(fd_writer), std::move(w_options)); } +void AsyncFd(WritePtr& writer, const std::string &file) { + riegeli::FdIoUringOptions fd_io_uring_options; + fd_io_uring_options.set_async(true); + fd_io_uring_options.set_fd_register(true); + + riegeli::FdIoUringWriterBase::Options fd_w_options; + fd_w_options.set_io_uring_option(fd_io_uring_options); + + riegeli::RecordWriterBase::Options w_options; + + riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, + fd_w_options); + + writer = std::make_unique>>( + std::move(fd_writer), std::move(w_options)); +} + void WriteData(WritePtr &writer) { for(int i = 1; i <= 100000000; ++i) { std::string temp = std::to_string(i); @@ -143,4 +177,41 @@ TEST(IoUringTest, SynFdWriteLargeData) { CheckLargeData(file); } +TEST(IoUringTest, AsynWrite) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + Sync(writer, file); + + WriteData(writer); + CheckData(file); +} + +TEST(IoUringTest, AsynFdWrite) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + SyncFd(writer, file); + + WriteData(writer); + CheckData(file); +} + + +TEST(IoUringTest, AsynWriteLargeData) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + Async(writer, file); + + WriteLargeData(writer); + CheckLargeData(file); +} + +TEST(IoUringTest, AsynFdWriteLargeData) { + std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + WritePtr writer; + AsyncFd(writer, file); + + WriteLargeData(writer); + CheckLargeData(file); +} + } \ No newline at end of file diff --git a/io_uring_test/syn_test_file b/io_uring_test/syn_test_file new file mode 100644 index 0000000000000000000000000000000000000000..10a9aa7cb5cd51f490e538c0987c6b5de07b5711 GIT binary patch literal 379219 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 np4)Ox5@Z`~NkS0~ftiU*z9*=Vo{e^6 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, fd); } else { fd_io_uring_ = std::make_unique(options, fd); } @@ -165,22 +165,13 @@ bool FdIoUringWriterBase::WriteInternal(absl::string_view src) { RIEGELI_ASSERT(healthy()) << "Failed precondition of BufferedWriter::WriteInternal(): " << status(); + const int dest = dest_fd(); if (ABSL_PREDICT_FALSE(src.size() > Position{std::numeric_limits::max()} - start_pos())) { return FailOverflow(); } - if(async_) { - return AsyncWriteInternal(src); - } - - return SyncWriteInternal(src); -} - -bool FdIoUringWriterBase::SyncWriteInternal(absl::string_view src) { - const int dest = dest_fd(); - do { again: const ssize_t length_written = fd_io_uring_ -> pwrite(dest, src.data(), @@ -202,10 +193,6 @@ bool FdIoUringWriterBase::SyncWriteInternal(absl::string_view src) { return true; } -bool FdIoUringWriterBase::AsyncWriteInternal(absl::string_view src) { - return true; -} - bool FdIoUringWriterBase::FlushImpl(FlushType flush_type) { if (ABSL_PREDICT_FALSE(!BufferedWriter::FlushImpl(flush_type))) return false; switch (flush_type) { diff --git a/riegeli/bytes/fd_io_uring_writer.h b/riegeli/bytes/fd_io_uring_writer.h index 76e90264..090998a2 100644 --- a/riegeli/bytes/fd_io_uring_writer.h +++ b/riegeli/bytes/fd_io_uring_writer.h @@ -21,6 +21,7 @@ #include "riegeli/bytes/fd_dependency.h" #include "riegeli/iouring/fd_sync_io_uring.h" +#include "riegeli/iouring/fd_async_io_uring.h" namespace riegeli { @@ -163,9 +164,6 @@ class FdIoUringWriterBase : public BufferedWriter { absl::optional SizeBehindBuffer() override; bool TruncateBehindBuffer(Position new_size) override; - bool SyncWriteInternal(absl::string_view src); - bool AsyncWriteInternal(absl::string_view src); - private: void SetFilename(int dest); bool SeekInternal(int dest, Position new_pos); diff --git a/riegeli/iouring/fd_async_io_uring.cc b/riegeli/iouring/fd_async_io_uring.cc index d6d03fee..35fa86c8 100644 --- a/riegeli/iouring/fd_async_io_uring.cc +++ b/riegeli/iouring/fd_async_io_uring.cc @@ -8,25 +8,27 @@ namespace riegeli { FdAsyncIoUring::FdAsyncIoUring(FdIoUringOptions options, int fd) -: poll_io_(options.poll_io()), size_(options.size()) { +:size_(options.size()), exit_(false), process_num_(0) { memset(&ring_, 0, sizeof(ring_)); memset(¶ms_, 0, sizeof(params_)); - poll_io_ = options.poll_io(); - if(poll_io_) { - params_.flags |= IORING_SETUP_IOPOLL; - } - - bool flag = false; - RIEGELI_ASSERT((flag = InitIoUring())) << "Failed initilization of Io_Uring. (FdAsyncIoUring)"; + RIEGELI_ASSERT(InitIoUring()) << "Failed initilization of Io_Uring. (FdAsyncIoUring)"; - if(fd_register_) { + if(options.fd_register()) { RegisterFd(fd); } + + reap_thread_ = std::thread([this]() { this->Reap(); }); } FdAsyncIoUring::~FdAsyncIoUring() { + exit_.store(true); + + if(reap_thread_.joinable()) { + reap_thread_.join(); + } + io_uring_queue_exit(&ring_); } @@ -43,7 +45,7 @@ void FdAsyncIoUring::RegisterFd(int fd) { fd_ = fd; if(fd_register_ == false) { - RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 1) << "Failed fd register."; + RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 0) << "Failed fd register."; fd_register_ = true; } else { UpdateFd(); @@ -60,77 +62,139 @@ void FdAsyncIoUring::UpdateFd() { RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; } -int FdAsyncIoUring::mode() { - return 1; -} - ssize_t FdAsyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_read(sqe, 0, buf, count, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_read(sqe, fd, buf, count, offset); } - ssize_t res = SubmitAndGetResult(); - return res; + return count; } ssize_t FdAsyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offset) { - struct io_uring_sqe *sqe = GetSqe(); + void* src = operator new(count); + RIEGELI_ASSERT(!!src) << "Failed to create new space for data. (pwrite)"; + + std::memcpy(src, buf, count); + if(fd_register_) { - io_uring_prep_write(sqe, 0, buf, count, offset); - } else { - io_uring_prep_write(sqe, fd, buf, count, offset); + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; + return pwriteInternel(0, src, count, offset); } - ssize_t res = SubmitAndGetResult(); - return res; + + return pwriteInternel(fd, src, count, offset); } -ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { +ssize_t FdAsyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); } - ssize_t res = SubmitAndGetResult(); - return res; + return 0; } -ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { +ssize_t FdAsyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); } - ssize_t res = SubmitAndGetResult(); - return res; + return 0; } -int FdSyncIoUring::fsync(int fd) { +int FdAsyncIoUring::fsync(int fd) { + std::lock_guard l(sq_mutex_); struct io_uring_sqe *sqe = GetSqe(); - io_uring_prep_fsync(sqe, fd, 0); if(fd_register_) { + RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_fsync(sqe, 0, 0); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_fsync(sqe, fd, 0); } - ssize_t res = SubmitAndGetResult(); - return res; + FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); + io_uring_sqe_set_data(sqe, op); + SubmitSqe(); + return 0; } -inline struct io_uring_sqe* FdSyncIoUring::GetSqe() { +ssize_t FdAsyncIoUring::pwriteInternel(int fd, const void* buf, size_t count, off_t offset) { + std::lock_guard l(sq_mutex_); + struct io_uring_sqe *sqe = GetSqe(); + io_uring_prep_write(sqe, fd, buf, count, offset); + if(fd_register_) { + sqe -> flags |= IOSQE_FIXED_FILE; + } + FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::pwriteCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); + io_uring_sqe_set_data(sqe, op); + SubmitSqe(); + return count; +} + +void FdAsyncIoUring::pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res) { + int fd = op -> GetSqe().fd; + void* buf = reinterpret_cast(op -> GetSqe().addr); + size_t offset = op -> GetSqe().off; + size_t count = op -> GetSqe().len; + delete op; + + RIEGELI_ASSERT_GE(res, 0) << "pwrite() errno."; + RIEGELI_ASSERT_GT(res, 0) << "pwrite() return 0."; + RIEGELI_ASSERT_LE((size_t) res, count) << "pwrite() wrote more than requested."; + + char* newBuf = static_cast(buf); + operator delete(buf, count); + if(count - res > 0) { + newBuf += res; + offset += res; + count -= res; + pwriteInternel(fd, newBuf, count, offset); + } + +} + +void FdAsyncIoUring::fsyncCallBack(FdAsyncIoUringOp *op, ssize_t res) { + delete op; + + RIEGELI_ASSERT_EQ(res, 0) << "fsync() errno."; +} + +inline struct io_uring_sqe* FdAsyncIoUring::GetSqe() { struct io_uring_sqe *sqe = io_uring_get_sqe(&ring_); RIEGELI_ASSERT(!!sqe) << "Failed get a sqe."; return sqe; } -inline ssize_t FdSyncIoUring::SubmitAndGetResult() { +inline void FdAsyncIoUring::SubmitSqe() { RIEGELI_ASSERT_GT(io_uring_submit(&ring_), 0) << "Failed to submit the sqe."; - struct io_uring_cqe* cqe = NULL; - io_uring_wait_cqe(&ring_, &cqe); - return cqe -> res; + ++process_num_; +} + +void FdAsyncIoUring::Reap() { + while(!exit_.load() || process_num_ != 0) { + struct io_uring_cqe* cqe = NULL; + RIEGELI_ASSERT_EQ(io_uring_wait_cqe(&ring_, &cqe), 0) << "Failed to get a cqe"; + --process_num_; + ssize_t res = cqe -> res; + FdAsyncIoUringOp *op = static_cast(io_uring_cqe_get_data(cqe)); + FdAsyncIoUringOp::CallBackFunc cb = op -> GetCallBackFunc(); + if(cb != NULL) { + cb(op, res); + } + io_uring_cqe_seen(&ring_, cqe); + } } } // namespace riegeli diff --git a/riegeli/iouring/fd_async_io_uring.h b/riegeli/iouring/fd_async_io_uring.h index 20e70f60..3021bb8c 100644 --- a/riegeli/iouring/fd_async_io_uring.h +++ b/riegeli/iouring/fd_async_io_uring.h @@ -1,12 +1,54 @@ #ifndef RIEGELI_IOURING_FD_ASYNC_IO_URING_H_ #define RIEGELI_IOURING_FD_ASYNC_IO_URING_H_ +#include +#include +#include +#include + #include "riegeli/iouring/fd_io_uring_options.h" #include "riegeli/iouring/fd_io_uring.h" namespace riegeli { -// Perform Io_Uring synchronously. +// Class maintains data and call back function for Io_Uring operation. +class FdAsyncIoUringOp { + public: + // Call back function. + using CallBackFunc = std::function; + + // Consturctor and destructor for FdAsyncIoUringOp. + explicit FdAsyncIoUringOp() : cb_(NULL) {} + + explicit FdAsyncIoUringOp(struct io_uring_sqe *sqe) : sqe_(*sqe), cb_(NULL) {} + + explicit FdAsyncIoUringOp(struct io_uring_sqe *sqe, CallBackFunc cb) : sqe_(*sqe), cb_(cb) {} + + FdAsyncIoUringOp(const FdAsyncIoUringOp&) = delete; + FdAsyncIoUringOp& operator=(const FdAsyncIoUringOp&) = delete; + + void SetCallBackFunc(CallBackFunc cb) { + cb_ = cb; + } + + CallBackFunc GetCallBackFunc() const { + return cb_; + } + + void SetSqe(const struct io_uring_sqe* sqe) { + sqe_ = *sqe; + } + + const struct io_uring_sqe& GetSqe() const { + return sqe_; + } + + private: + struct io_uring_sqe sqe_; + CallBackFunc cb_; +}; + +// Perform Io_Uring asynchronously. class FdAsyncIoUring : public FdIoUring { public: // Constructor and destructor for this class. @@ -20,26 +62,25 @@ class FdAsyncIoUring : public FdIoUring { // Override the file operation interface for Io_Uring. ssize_t pread(int fd, void *buf, size_t count, off_t offset) override; - + ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) override; - + ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; - + int fsync(int fd) override; + // Interface for register and unregister fd. void RegisterFd(int fd) override; void UnRegisterFd() override; - std::string Mode() override; - - // Get Io_Uring settings. - bool poll_io() { - return poll_io_; + std::string Mode() override { + return "Async Io_Uring"; } + // Get Io_Uring settings. bool fd_register() { return fd_register_; } @@ -59,19 +100,42 @@ class FdAsyncIoUring : public FdIoUring { // Update registered fd. void UpdateFd(); + // Reap handler function. + void Reap(); + // Get sqe. struct io_uring_sqe* GetSqe(); // Submit sqe to kernel. - ssize_t SubmitAndGetResult(); + void SubmitSqe(); + + // Internel part and call back function of file operation. + ssize_t pwriteInternel(int fd, const void *buf, size_t count, off_t offset); + void pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res); + void fsyncCallBack(FdAsyncIoUringOp *op, ssize_t res); + + private: + // Io_Uring entrance and set up params. struct io_uring_params params_; struct io_uring ring_; - bool poll_io_; + // Io_Uring settings. bool fd_register_ = false; - uint32_t size_; + uint32_t size_ = 0; int fd_ = -1; + + // Joinable thread flag. + std::atomic_bool exit_; + + // Amount of processing number. + std::atomic_int process_num_; + + // Reaping thread. + std::thread reap_thread_; + + // Submission queue mutex. + std::mutex sq_mutex_; }; } // namespace riegeli diff --git a/riegeli/iouring/fd_sync_io_uring.cc b/riegeli/iouring/fd_sync_io_uring.cc index 78d8e2b1..821f6e65 100644 --- a/riegeli/iouring/fd_sync_io_uring.cc +++ b/riegeli/iouring/fd_sync_io_uring.cc @@ -15,7 +15,7 @@ FdSyncIoUring::FdSyncIoUring(FdIoUringOptions options, int fd) RIEGELI_ASSERT(InitIoUring()) << "Failed initilization of Io_Uring. (FdSyncIoUring)"; - if(fd_register_) { + if(options.fd_register()) { RegisterFd(fd); } } @@ -37,7 +37,7 @@ void FdSyncIoUring::RegisterFd(int fd) { fd_ = fd; if(fd_register_ == false) { - RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 1) << "Failed fd register."; + RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 0) << "Failed fd register."; fd_register_ = true; } else { UpdateFd(); @@ -54,15 +54,12 @@ void FdSyncIoUring::UpdateFd() { RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; } -std::string FdSyncIoUring::Mode() { - return "Sync Io_Uring"; -} - ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_read(sqe, 0, buf, count, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_read(sqe, fd, buf, count, offset); } @@ -75,6 +72,7 @@ ssize_t FdSyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offse if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_write(sqe, 0, buf, count, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_write(sqe, fd, buf, count, offset); } @@ -87,6 +85,7 @@ ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); } @@ -99,6 +98,7 @@ ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, of if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); } @@ -108,10 +108,10 @@ ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, of int FdSyncIoUring::fsync(int fd) { struct io_uring_sqe *sqe = GetSqe(); - io_uring_prep_fsync(sqe, fd, 0); if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; io_uring_prep_fsync(sqe, 0, 0); + sqe -> flags |= IOSQE_FIXED_FILE; } else { io_uring_prep_fsync(sqe, fd, 0); } diff --git a/riegeli/iouring/fd_sync_io_uring.h b/riegeli/iouring/fd_sync_io_uring.h index 7d9240c5..0e3768c9 100644 --- a/riegeli/iouring/fd_sync_io_uring.h +++ b/riegeli/iouring/fd_sync_io_uring.h @@ -28,11 +28,14 @@ class FdSyncIoUring : public FdIoUring { int fsync(int fd) override; + // Interface for register and unregister fd. void RegisterFd(int fd) override; void UnRegisterFd() override; - std::string Mode() override; + std::string Mode() override { + return "Sync Io_Uring"; + } // Get Io_Uring settings. bool fd_register() { @@ -60,11 +63,14 @@ class FdSyncIoUring : public FdIoUring { // Submit sqe to kernel. ssize_t SubmitAndGetResult(); + private: + // Io_Uring entrance and set up params. struct io_uring_params params_; struct io_uring ring_; + // Io_Uring settings. bool fd_register_ = false; - uint32_t size_; + uint32_t size_ = 0; int fd_ = -1; }; From e39920a3602a8b28bc4a2c65877cbd55efba69de Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Tue, 20 Jul 2021 10:28:56 -0700 Subject: [PATCH 5/9] remove data --- io_uring_test/syn_test_file | Bin 379219 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 io_uring_test/syn_test_file diff --git a/io_uring_test/syn_test_file b/io_uring_test/syn_test_file deleted file mode 100644 index 10a9aa7cb5cd51f490e538c0987c6b5de07b5711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379219 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 np4)Ox5@Z`~NkS0~ftiU*z9*=Vo{e^6 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 Date: Tue, 20 Jul 2021 14:51:45 -0700 Subject: [PATCH 6/9] minor fixed --- io_uring_test/BUILD | 13 ++- io_uring_test/io_test.cc | 55 ---------- io_uring_test/io_uring_test.cc | 156 +++++++++++++++++++++++++++ io_uring_test/io_uring_write_test.cc | 16 +-- riegeli/iouring/fd_async_io_uring.cc | 58 +++++++--- riegeli/iouring/fd_async_io_uring.h | 13 ++- riegeli/iouring/fd_io_uring.h | 14 ++- riegeli/iouring/fd_sync_io_uring.h | 10 +- 8 files changed, 242 insertions(+), 93 deletions(-) delete mode 100644 io_uring_test/io_test.cc create mode 100644 io_uring_test/io_uring_test.cc diff --git a/io_uring_test/BUILD b/io_uring_test/BUILD index f3a69bc6..d5dcf9a0 100644 --- a/io_uring_test/BUILD +++ b/io_uring_test/BUILD @@ -10,13 +10,12 @@ cc_test( ], ) -cc_binary( - name = "io_test", - srcs = ["io_test.cc"], +cc_test( + name = "io_uring_test", + srcs = ["io_uring_test.cc"], deps = [ - "//riegeli/bytes:fd_io_uring_writer", - "//riegeli/records:record_writer", - "//riegeli/bytes:fd_reader", - "//riegeli/records:record_reader", + "//riegeli/iouring:fd_async_io_uring", + "//riegeli/iouring:fd_sync_io_uring", + "@com_google_googletest//:gtest_main", ], ) \ No newline at end of file diff --git a/io_uring_test/io_test.cc b/io_uring_test/io_test.cc deleted file mode 100644 index 23424e7c..00000000 --- a/io_uring_test/io_test.cc +++ /dev/null @@ -1,55 +0,0 @@ -#include - -#include "riegeli/bytes/fd_io_uring_writer.h" -#include "riegeli/records/record_writer.h" -#include "riegeli/bytes/fd_reader.h" -#include "riegeli/records/record_reader.h" - -using WritePtr = std::unique_ptr>>; -using ReadPtr = std::unique_ptr>>; - -void CheckData(const std::string &file) { - riegeli::RecordReaderBase::Options r_options; - riegeli::FdReaderBase::Options fd_r_options; - riegeli::FdReader<> fd_reader(file, O_RDONLY, - fd_r_options); - ReadPtr reader = std::make_unique>>( - std::move(fd_reader), std::move(r_options)); - - std::string record; - int num = 1; - int result = 0; - while(reader -> ReadRecord(record)) { - if(record == std::to_string(num)) { - ++result; - } - ++num; - } - std::cout << result << std::endl; - reader -> Close(); -} - - -int main() { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; - riegeli::FdIoUringOptions fd_io_uring_options; - fd_io_uring_options.set_async(true); - fd_io_uring_options.set_fd_register(false); - - riegeli::FdIoUringWriterBase::Options fd_w_options; - fd_w_options.set_io_uring_option(fd_io_uring_options); - - riegeli::RecordWriterBase::Options w_options; - - riegeli::FdIoUringWriter<> fd_writer(file, O_WRONLY | O_CREAT | O_TRUNC, - fd_w_options); - WritePtr writer = std::make_unique>>( - std::move(fd_writer), std::move(w_options)); - for(int i = 1; i <= 100000; ++i) { - std::string temp = std::to_string(i); - writer -> WriteRecord(temp); - } - writer -> Close(); - CheckData(file); - return 0; -} \ No newline at end of file diff --git a/io_uring_test/io_uring_test.cc b/io_uring_test/io_uring_test.cc new file mode 100644 index 00000000..22fc31ac --- /dev/null +++ b/io_uring_test/io_uring_test.cc @@ -0,0 +1,156 @@ +#include "riegeli/iouring/fd_async_io_uring.h" +#include "riegeli/iouring/fd_sync_io_uring.h" + +#include +#include +#include + +#include "gtest/gtest.h" + +namespace iouringtest { +using IoUringPtr = std::unique_ptr; + +TEST(IoUringTest, CreateAsynIoUring) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> Mode(), riegeli::FdIoUring::IoUringMode::ASYNCIOURING); +} + +TEST(IoUringTest, CreateSynIoUring) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> Mode(), riegeli::FdIoUring::IoUringMode::SYNCIOURING); +} + +TEST(IoUringTest, SyncUnRegisterFd) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + options.set_fd_register(false); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> fd_register(), false); + EXPECT_EQ(IoUring -> fd(), -1); +} + +TEST(IoUringTest, AsyncUnRegisterFd) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + options.set_fd_register(false); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> fd_register(), false); + EXPECT_EQ(IoUring -> fd(), -1); +} + +TEST(IoUringTest, SyncRegisterAndUnregisterFd) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + options.set_fd_register(true); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> fd_register(), true); + EXPECT_EQ(IoUring -> fd(), 0); + + IoUring -> UnRegisterFd(); + EXPECT_EQ(IoUring -> fd_register(), false); + EXPECT_EQ(IoUring -> fd(), -1); + +} + +TEST(IoUringTest, AsyncUnRegisterAndUnregisterFd) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + options.set_fd_register(true); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> fd_register(), true); + EXPECT_EQ(IoUring -> fd(), 0); + + IoUring -> UnRegisterFd(); + EXPECT_EQ(IoUring -> fd_register(), false); + EXPECT_EQ(IoUring -> fd(), -1); +} + +TEST(IoUringTest, SyncRegisterAndUpdateFd) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + options.set_fd_register(true); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> fd_register(), true); + EXPECT_EQ(IoUring -> fd(), 0); + + std::string path = std::string(getenv("TEST_TMPDIR")) + "/io_uring_test_file"; + int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC); + IoUring -> RegisterFd(fd); + EXPECT_EQ(IoUring -> fd_register(), true); + EXPECT_EQ(IoUring -> fd(), fd); + +} + +TEST(IoUringTest, AsyncUnRegisterAndUpdateFd) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + options.set_fd_register(true); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> fd_register(), true); + EXPECT_EQ(IoUring -> fd(), 0); + + std::string path = std::string(getenv("TEST_TMPDIR")) + "/io_uring_test_file"; + int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC); + EXPECT_EQ(IoUring -> fd_register(), true); + EXPECT_EQ(IoUring -> fd(), fd); +} + +TEST(IoUringTest, SyncDefaultSize) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> size(), 8192); +} + +TEST(IoUringTest, AsyncDefaultSize) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> size(), 8192); +} + +TEST(IoUringTest, SyncSize) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + options.set_size(10); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> size(), 16); +} + +TEST(IoUringTest, AsyncSize) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + options.set_size(10); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> size(), 16); +} + +} \ No newline at end of file diff --git a/io_uring_test/io_uring_write_test.cc b/io_uring_test/io_uring_write_test.cc index 826da042..5eb26bc9 100644 --- a/io_uring_test/io_uring_write_test.cc +++ b/io_uring_test/io_uring_write_test.cc @@ -141,7 +141,7 @@ void CheckLargeData(const std::string &file) { } TEST(IoUringTest, SynWrite) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; Sync(writer, file); @@ -150,7 +150,7 @@ TEST(IoUringTest, SynWrite) { } TEST(IoUringTest, SynFdWrite) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; SyncFd(writer, file); @@ -160,7 +160,7 @@ TEST(IoUringTest, SynFdWrite) { TEST(IoUringTest, SynWriteLargeData) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; Sync(writer, file); @@ -169,7 +169,7 @@ TEST(IoUringTest, SynWriteLargeData) { } TEST(IoUringTest, SynFdWriteLargeData) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; SyncFd(writer, file); @@ -178,7 +178,7 @@ TEST(IoUringTest, SynFdWriteLargeData) { } TEST(IoUringTest, AsynWrite) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; Sync(writer, file); @@ -187,7 +187,7 @@ TEST(IoUringTest, AsynWrite) { } TEST(IoUringTest, AsynFdWrite) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; SyncFd(writer, file); @@ -197,7 +197,7 @@ TEST(IoUringTest, AsynFdWrite) { TEST(IoUringTest, AsynWriteLargeData) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; Async(writer, file); @@ -206,7 +206,7 @@ TEST(IoUringTest, AsynWriteLargeData) { } TEST(IoUringTest, AsynFdWriteLargeData) { - std::string file = "/home/werider/riegeli/io_uring_test/syn_test_file"; + std::string file = std::string(getenv("TEST_TMPDIR")) + "/write_test_file"; WritePtr writer; AsyncFd(writer, file); diff --git a/riegeli/iouring/fd_async_io_uring.cc b/riegeli/iouring/fd_async_io_uring.cc index 35fa86c8..4e077b31 100644 --- a/riegeli/iouring/fd_async_io_uring.cc +++ b/riegeli/iouring/fd_async_io_uring.cc @@ -63,6 +63,7 @@ void FdAsyncIoUring::UpdateFd() { } ssize_t FdAsyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { + std::lock_guard l(sq_mutex_); struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; @@ -71,6 +72,10 @@ ssize_t FdAsyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { } else { io_uring_prep_read(sqe, fd, buf, count, offset); } + FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); + io_uring_sqe_set_data(sqe, op); + SubmitSqe(); return count; } @@ -89,6 +94,7 @@ ssize_t FdAsyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offs } ssize_t FdAsyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { + std::lock_guard l(sq_mutex_); struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; @@ -97,10 +103,15 @@ ssize_t FdAsyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, of } else { io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); } + FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); + io_uring_sqe_set_data(sqe, op); + SubmitSqe(); return 0; } ssize_t FdAsyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { + std::lock_guard l(sq_mutex_); struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; @@ -109,6 +120,10 @@ ssize_t FdAsyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, o } else { io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); } + FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); + io_uring_sqe_set_data(sqe, op); + SubmitSqe(); return 0; } @@ -149,13 +164,13 @@ void FdAsyncIoUring::pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res) { size_t offset = op -> GetSqe().off; size_t count = op -> GetSqe().len; delete op; - + RIEGELI_ASSERT_GE(res, 0) << "pwrite() errno."; RIEGELI_ASSERT_GT(res, 0) << "pwrite() return 0."; RIEGELI_ASSERT_LE((size_t) res, count) << "pwrite() wrote more than requested."; char* newBuf = static_cast(buf); - operator delete(buf, count); + operator delete(buf, res); if(count - res > 0) { newBuf += res; offset += res; @@ -167,10 +182,27 @@ void FdAsyncIoUring::pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res) { void FdAsyncIoUring::fsyncCallBack(FdAsyncIoUringOp *op, ssize_t res) { delete op; - RIEGELI_ASSERT_EQ(res, 0) << "fsync() errno."; } +void FdAsyncIoUring::preadCallBack(FdAsyncIoUringOp *op, ssize_t res) { + delete op; + RIEGELI_ASSERT_GE(res, 0) << "pread() errno."; + RIEGELI_ASSERT_GT(res, 0) << "pread() return 0."; +} + +void FdAsyncIoUring::pwritevCallBack(FdAsyncIoUringOp *op, ssize_t res) { + delete op; + RIEGELI_ASSERT_GE(res, 0) << "pwritev() errno."; + RIEGELI_ASSERT_GT(res, 0) << "pwritev() return 0."; +} + +void FdAsyncIoUring::preadvCallBack(FdAsyncIoUringOp *op, ssize_t res) { + delete op; + RIEGELI_ASSERT_GE(res, 0) << "preadv() errno."; + RIEGELI_ASSERT_GT(res, 0) << "preadv() return 0."; +} + inline struct io_uring_sqe* FdAsyncIoUring::GetSqe() { struct io_uring_sqe *sqe = io_uring_get_sqe(&ring_); RIEGELI_ASSERT(!!sqe) << "Failed get a sqe."; @@ -184,16 +216,18 @@ inline void FdAsyncIoUring::SubmitSqe() { void FdAsyncIoUring::Reap() { while(!exit_.load() || process_num_ != 0) { - struct io_uring_cqe* cqe = NULL; - RIEGELI_ASSERT_EQ(io_uring_wait_cqe(&ring_, &cqe), 0) << "Failed to get a cqe"; - --process_num_; - ssize_t res = cqe -> res; - FdAsyncIoUringOp *op = static_cast(io_uring_cqe_get_data(cqe)); - FdAsyncIoUringOp::CallBackFunc cb = op -> GetCallBackFunc(); - if(cb != NULL) { - cb(op, res); + if(process_num_ != 0) { + struct io_uring_cqe* cqe = NULL; + RIEGELI_ASSERT_EQ(io_uring_wait_cqe(&ring_, &cqe), 0) << "Failed to get a cqe"; + --process_num_; + ssize_t res = cqe -> res; + FdAsyncIoUringOp *op = static_cast(io_uring_cqe_get_data(cqe)); + FdAsyncIoUringOp::CallBackFunc cb = op -> GetCallBackFunc(); + if(cb != NULL) { + cb(op, res); + } + io_uring_cqe_seen(&ring_, cqe); } - io_uring_cqe_seen(&ring_, cqe); } } diff --git a/riegeli/iouring/fd_async_io_uring.h b/riegeli/iouring/fd_async_io_uring.h index 3021bb8c..01d4f7c7 100644 --- a/riegeli/iouring/fd_async_io_uring.h +++ b/riegeli/iouring/fd_async_io_uring.h @@ -76,20 +76,20 @@ class FdAsyncIoUring : public FdIoUring { void UnRegisterFd() override; - std::string Mode() override { - return "Async Io_Uring"; + IoUringMode Mode() override { + return IoUringMode::ASYNCIOURING; } // Get Io_Uring settings. - bool fd_register() { + bool fd_register() override { return fd_register_; } - uint32_t size() { + uint32_t size() override { return size_; } - int fd() { + int fd() override { return fd_; } @@ -114,6 +114,9 @@ class FdAsyncIoUring : public FdIoUring { void pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res); void fsyncCallBack(FdAsyncIoUringOp *op, ssize_t res); + void preadCallBack(FdAsyncIoUringOp *op, ssize_t res); + void preadvCallBack(FdAsyncIoUringOp *op, ssize_t res); + void pwritevCallBack(FdAsyncIoUringOp *op, ssize_t res); private: // Io_Uring entrance and set up params. diff --git a/riegeli/iouring/fd_io_uring.h b/riegeli/iouring/fd_io_uring.h index 1aa4352b..02d7e868 100644 --- a/riegeli/iouring/fd_io_uring.h +++ b/riegeli/iouring/fd_io_uring.h @@ -21,6 +21,12 @@ bool IsIoUringAvailable(); // The base interface class for sync or async Io_Uring. class FdIoUring { +public: + enum class IoUringMode { + ASYNCIOURING, + SYNCIOURING, + }; + public: virtual ~FdIoUring() {} @@ -40,7 +46,13 @@ class FdIoUring { virtual void UnRegisterFd() = 0; - virtual std::string Mode() = 0; + virtual IoUringMode Mode() = 0; + + virtual bool fd_register() = 0; + + virtual uint32_t size() = 0; + + virtual int fd() = 0; }; } // namespace riegeli diff --git a/riegeli/iouring/fd_sync_io_uring.h b/riegeli/iouring/fd_sync_io_uring.h index 0e3768c9..20801e9d 100644 --- a/riegeli/iouring/fd_sync_io_uring.h +++ b/riegeli/iouring/fd_sync_io_uring.h @@ -33,20 +33,20 @@ class FdSyncIoUring : public FdIoUring { void UnRegisterFd() override; - std::string Mode() override { - return "Sync Io_Uring"; + IoUringMode Mode() override { + return IoUringMode::SYNCIOURING; } // Get Io_Uring settings. - bool fd_register() { + bool fd_register() override { return fd_register_; } - uint32_t size() { + uint32_t size() override { return size_; } - int fd() { + int fd() override { return fd_; } From fb3f19152577191ccaa42b7fbb42abf61e23940d Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Thu, 22 Jul 2021 16:58:16 -0700 Subject: [PATCH 7/9] test file path fixed --- io_uring_test/io_uring_test.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/io_uring_test/io_uring_test.cc b/io_uring_test/io_uring_test.cc index 22fc31ac..dfc09d2d 100644 --- a/io_uring_test/io_uring_test.cc +++ b/io_uring_test/io_uring_test.cc @@ -92,7 +92,7 @@ TEST(IoUringTest, SyncRegisterAndUpdateFd) { EXPECT_EQ(IoUring -> fd(), 0); std::string path = std::string(getenv("TEST_TMPDIR")) + "/io_uring_test_file"; - int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC); + int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC); IoUring -> RegisterFd(fd); EXPECT_EQ(IoUring -> fd_register(), true); EXPECT_EQ(IoUring -> fd(), fd); @@ -110,7 +110,8 @@ TEST(IoUringTest, AsyncUnRegisterAndUpdateFd) { EXPECT_EQ(IoUring -> fd(), 0); std::string path = std::string(getenv("TEST_TMPDIR")) + "/io_uring_test_file"; - int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC); + int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC); + IoUring -> RegisterFd(fd); EXPECT_EQ(IoUring -> fd_register(), true); EXPECT_EQ(IoUring -> fd(), fd); } From 92120fd184569f1d12fc4d72fb5cd395342f7e5e Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Fri, 23 Jul 2021 15:41:52 -0700 Subject: [PATCH 8/9] fix assert --- .gitignore | 3 ++- riegeli/iouring/fd_async_io_uring.cc | 34 ++++++++++++++++------------ riegeli/iouring/fd_async_io_uring.h | 2 +- riegeli/iouring/fd_sync_io_uring.cc | 18 ++++++++++----- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 03392b9e..92cc6cce 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ bazel-out bazel-riegeli bazel-testlogs .bazelversion -configure.bazelrc \ No newline at end of file +configure.bazelrc +io_uring_test \ No newline at end of file diff --git a/riegeli/iouring/fd_async_io_uring.cc b/riegeli/iouring/fd_async_io_uring.cc index 4e077b31..d1173a3e 100644 --- a/riegeli/iouring/fd_async_io_uring.cc +++ b/riegeli/iouring/fd_async_io_uring.cc @@ -13,7 +13,8 @@ FdAsyncIoUring::FdAsyncIoUring(FdIoUringOptions options, int fd) memset(&ring_, 0, sizeof(ring_)); memset(¶ms_, 0, sizeof(params_)); - RIEGELI_ASSERT(InitIoUring()) << "Failed initilization of Io_Uring. (FdAsyncIoUring)"; + const bool init_res = InitIoUring(); + RIEGELI_ASSERT(init_res) << "Failed initilization of Io_Uring. (FdAsyncIoUring)"; if(options.fd_register()) { RegisterFd(fd); @@ -45,7 +46,8 @@ void FdAsyncIoUring::RegisterFd(int fd) { fd_ = fd; if(fd_register_ == false) { - RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 0) << "Failed fd register."; + const int register_res = io_uring_register_files(&ring_, &fd_, 1); + RIEGELI_ASSERT_EQ(register_res, 0) << "Failed fd register."; fd_register_ = true; } else { UpdateFd(); @@ -54,12 +56,14 @@ void FdAsyncIoUring::RegisterFd(int fd) { void FdAsyncIoUring::UnRegisterFd() { fd_ = -1; - RIEGELI_ASSERT_EQ(io_uring_unregister_files(&ring_), 0) << "Failed fd unregister."; + const int unregister_res = io_uring_unregister_files(&ring_); + RIEGELI_ASSERT_EQ(unregister_res, 0) << "Failed fd unregister."; fd_register_ = false; } void FdAsyncIoUring::UpdateFd() { - RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; + const int update_res = io_uring_register_files_update(&ring_, 0, &fd_, 1); + RIEGELI_ASSERT_EQ(update_res, 1) << "Failed fd update."; } ssize_t FdAsyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { @@ -210,23 +214,25 @@ inline struct io_uring_sqe* FdAsyncIoUring::GetSqe() { } inline void FdAsyncIoUring::SubmitSqe() { - RIEGELI_ASSERT_GT(io_uring_submit(&ring_), 0) << "Failed to submit the sqe."; - ++process_num_; + const int submit_res = io_uring_submit(&ring_); + RIEGELI_ASSERT_GT(submit_res, 0) << "Failed to submit the sqe."; + process_num_ += submit_res; } void FdAsyncIoUring::Reap() { while(!exit_.load() || process_num_ != 0) { if(process_num_ != 0) { struct io_uring_cqe* cqe = NULL; - RIEGELI_ASSERT_EQ(io_uring_wait_cqe(&ring_, &cqe), 0) << "Failed to get a cqe"; - --process_num_; - ssize_t res = cqe -> res; - FdAsyncIoUringOp *op = static_cast(io_uring_cqe_get_data(cqe)); - FdAsyncIoUringOp::CallBackFunc cb = op -> GetCallBackFunc(); - if(cb != NULL) { - cb(op, res); + if(io_uring_wait_cqe(&ring_, &cqe) == 0) { + --process_num_; + ssize_t res = cqe -> res; + FdAsyncIoUringOp *op = static_cast(io_uring_cqe_get_data(cqe)); + FdAsyncIoUringOp::CallBackFunc cb = op -> GetCallBackFunc(); + if(cb != NULL) { + cb(op, res); + } + io_uring_cqe_seen(&ring_, cqe); } - io_uring_cqe_seen(&ring_, cqe); } } } diff --git a/riegeli/iouring/fd_async_io_uring.h b/riegeli/iouring/fd_async_io_uring.h index 01d4f7c7..48d6acb3 100644 --- a/riegeli/iouring/fd_async_io_uring.h +++ b/riegeli/iouring/fd_async_io_uring.h @@ -60,7 +60,7 @@ class FdAsyncIoUring : public FdIoUring { ~FdAsyncIoUring() override; - // Override the file operation interface for Io_Uring. + // Override the file operation interface for Io_Uring. ToDo: complete pread / preadv / pwritev function. ssize_t pread(int fd, void *buf, size_t count, off_t offset) override; ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) override; diff --git a/riegeli/iouring/fd_sync_io_uring.cc b/riegeli/iouring/fd_sync_io_uring.cc index 821f6e65..a18795d7 100644 --- a/riegeli/iouring/fd_sync_io_uring.cc +++ b/riegeli/iouring/fd_sync_io_uring.cc @@ -13,7 +13,8 @@ FdSyncIoUring::FdSyncIoUring(FdIoUringOptions options, int fd) memset(&ring_, 0, sizeof(ring_)); memset(¶ms_, 0, sizeof(params_)); - RIEGELI_ASSERT(InitIoUring()) << "Failed initilization of Io_Uring. (FdSyncIoUring)"; + const bool init_res = InitIoUring(); + RIEGELI_ASSERT(init_res) << "Failed initilization of Io_Uring. (FdSyncIoUring)"; if(options.fd_register()) { RegisterFd(fd); @@ -37,7 +38,8 @@ void FdSyncIoUring::RegisterFd(int fd) { fd_ = fd; if(fd_register_ == false) { - RIEGELI_ASSERT_EQ(io_uring_register_files(&ring_, &fd_, 1), 0) << "Failed fd register."; + const int register_res = io_uring_register_files(&ring_, &fd_, 1); + RIEGELI_ASSERT_EQ(register_res, 0) << "Failed fd register."; fd_register_ = true; } else { UpdateFd(); @@ -46,12 +48,14 @@ void FdSyncIoUring::RegisterFd(int fd) { void FdSyncIoUring::UnRegisterFd() { fd_ = -1; - RIEGELI_ASSERT_EQ(io_uring_unregister_files(&ring_), 0) << "Failed fd unregister."; + const int unregister_res = io_uring_unregister_files(&ring_); + RIEGELI_ASSERT_EQ(unregister_res, 0) << "Failed fd unregister."; fd_register_ = false; } void FdSyncIoUring::UpdateFd() { - RIEGELI_ASSERT_EQ(io_uring_register_files_update(&ring_, 0, &fd_, 1), 1) << "Failed fd update."; + const int update_res = io_uring_register_files_update(&ring_, 0, &fd_, 1); + RIEGELI_ASSERT_EQ(update_res, 1) << "Failed fd update."; } ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { @@ -126,9 +130,11 @@ inline struct io_uring_sqe* FdSyncIoUring::GetSqe() { } inline ssize_t FdSyncIoUring::SubmitAndGetResult() { - RIEGELI_ASSERT_GT(io_uring_submit(&ring_), 0) << "Failed to submit the sqe."; + const int submit_res = io_uring_submit(&ring_); + RIEGELI_ASSERT_GT(submit_res, 0) << "Failed to submit the sqe."; struct io_uring_cqe* cqe = NULL; - RIEGELI_ASSERT_EQ(io_uring_wait_cqe(&ring_, &cqe), 0) << "Failed to get a cqe"; + const int wait_res = io_uring_wait_cqe(&ring_, &cqe); + RIEGELI_ASSERT_EQ(wait_res, 0) << "Failed to get a cqe"; ssize_t res = cqe -> res; io_uring_cqe_seen(&ring_, cqe); return res; From 6897a1b3241bc75e68c360454773306071444ce9 Mon Sep 17 00:00:00 2001 From: "chi.zhang" Date: Tue, 3 Aug 2021 19:02:13 -0700 Subject: [PATCH 9/9] change structure --- io_uring_test/io_uring_test.cc | 24 +++- io_uring_test/io_uring_write_test.cc | 4 +- riegeli/bytes/fd_io_uring_writer.cc | 28 +++- riegeli/bytes/fd_io_uring_writer.h | 1 + riegeli/iouring/BUILD | 12 +- riegeli/iouring/fd_async_io_uring.cc | 186 +++++++++---------------- riegeli/iouring/fd_async_io_uring.h | 51 +------ riegeli/iouring/fd_io_uring.cc | 62 +++++++++ riegeli/iouring/fd_io_uring.h | 66 +++++++-- riegeli/iouring/fd_io_uring_options.cc | 3 + riegeli/iouring/fd_io_uring_options.h | 2 +- riegeli/iouring/fd_sync_io_uring.cc | 98 +++---------- riegeli/iouring/fd_sync_io_uring.h | 42 +----- 13 files changed, 264 insertions(+), 315 deletions(-) diff --git a/io_uring_test/io_uring_test.cc b/io_uring_test/io_uring_test.cc index dfc09d2d..3c70f158 100644 --- a/io_uring_test/io_uring_test.cc +++ b/io_uring_test/io_uring_test.cc @@ -122,7 +122,7 @@ TEST(IoUringTest, SyncDefaultSize) { options.set_async(false); IoUring = std::make_unique(options, 0); - EXPECT_EQ(IoUring -> size(), 8192); + EXPECT_EQ(IoUring -> size(), 512); } TEST(IoUringTest, AsyncDefaultSize) { @@ -131,7 +131,7 @@ TEST(IoUringTest, AsyncDefaultSize) { options.set_async(true); IoUring = std::make_unique(options, 0); - EXPECT_EQ(IoUring -> size(), 8192); + EXPECT_EQ(IoUring -> size(), 512); } TEST(IoUringTest, SyncSize) { @@ -154,4 +154,24 @@ TEST(IoUringTest, AsyncSize) { EXPECT_EQ(IoUring -> size(), 16); } +TEST(IoUringTest, SyncMaxSize) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(false); + options.set_size(4098); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> size(), 4096); +} + +TEST(IoUringTest, AsyncMaxSize) { + IoUringPtr IoUring; + riegeli::FdIoUringOptions options; + options.set_async(true); + options.set_size(4098); + IoUring = std::make_unique(options, 0); + + EXPECT_EQ(IoUring -> size(), 4096); +} + } \ No newline at end of file diff --git a/io_uring_test/io_uring_write_test.cc b/io_uring_test/io_uring_write_test.cc index 5eb26bc9..5896a659 100644 --- a/io_uring_test/io_uring_write_test.cc +++ b/io_uring_test/io_uring_write_test.cc @@ -80,7 +80,7 @@ void AsyncFd(WritePtr& writer, const std::string &file) { } void WriteData(WritePtr &writer) { - for(int i = 1; i <= 100000000; ++i) { + for(int i = 1; i <= 10000000; ++i) { std::string temp = std::to_string(i); writer -> WriteRecord(temp); } @@ -101,7 +101,7 @@ void CheckData(const std::string &file) { EXPECT_EQ(record, std::to_string(num)); ++num; } - EXPECT_EQ(num, 100000001); + EXPECT_EQ(num, 10000001); reader -> Close(); } diff --git a/riegeli/bytes/fd_io_uring_writer.cc b/riegeli/bytes/fd_io_uring_writer.cc index 7c966162..a2a52ef6 100644 --- a/riegeli/bytes/fd_io_uring_writer.cc +++ b/riegeli/bytes/fd_io_uring_writer.cc @@ -140,6 +140,10 @@ void FdIoUringWriterBase::InitializeFdIoUring(FdIoUringOptions options, int fd) } else { fd_io_uring_ = std::make_unique(options, fd); } + + if(ABSL_PREDICT_FALSE(!fd_io_uring_ -> healthy())) { + Fail(*fd_io_uring_); + } } bool FdIoUringWriterBase::FailOperation(absl::string_view operation) { @@ -151,6 +155,14 @@ bool FdIoUringWriterBase::FailOperation(absl::string_view operation) { ErrnoToCanonicalStatus(error_number, absl::StrCat(operation, " failed"))); } +bool FdIoUringWriterBase::IoUringFailOperation(const int error_number, absl::string_view operation) { + RIEGELI_ASSERT_NE(error_number, 0) + << "Failed precondition of FdIoUringWriterBase::FailOperation(): " + "zero errno"; + return Fail( + ErrnoToCanonicalStatus(error_number, absl::StrCat(operation, " failed"))); +} + void FdIoUringWriterBase::AnnotateFailure(absl::Status& status) { RIEGELI_ASSERT(!status.ok()) << "Failed precondition of Object::AnnotateFailure(): status not failed"; @@ -166,6 +178,10 @@ bool FdIoUringWriterBase::WriteInternal(absl::string_view src) { << "Failed precondition of BufferedWriter::WriteInternal(): " << status(); const int dest = dest_fd(); + if(ABSL_PREDICT_FALSE(!fd_io_uring_ -> healthy())) { + return Fail(*fd_io_uring_); + } + if (ABSL_PREDICT_FALSE(src.size() > Position{std::numeric_limits::max()} - start_pos())) { @@ -179,8 +195,8 @@ bool FdIoUringWriterBase::WriteInternal(absl::string_view src) { size_t{std::numeric_limits::max()}), IntCast(start_pos())); if (ABSL_PREDICT_FALSE(length_written < 0)) { - if (errno == EINTR) goto again; - return FailOperation("pwrite()"); + if (length_written == -EINTR || length_written == -EAGAIN) goto again; + return IoUringFailOperation(-length_written, "pwrite()"); } RIEGELI_ASSERT_GT(length_written, 0) << "pwrite()" << " returned 0"; @@ -200,9 +216,13 @@ bool FdIoUringWriterBase::FlushImpl(FlushType flush_type) { case FlushType::kFromProcess: return true; case FlushType::kFromMachine: { + if(ABSL_PREDICT_FALSE(!fd_io_uring_ -> healthy())) { + return Fail(*fd_io_uring_); + } const int dest = dest_fd(); - if (ABSL_PREDICT_FALSE(fd_io_uring_ -> fsync(dest) < 0)) { - return FailOperation("fsync()"); + const int fsync_res = fd_io_uring_ -> fsync(dest); + if (ABSL_PREDICT_FALSE(fsync_res < 0)) { + return IoUringFailOperation(-fsync_res, "fsync()"); } return true; } diff --git a/riegeli/bytes/fd_io_uring_writer.h b/riegeli/bytes/fd_io_uring_writer.h index 090998a2..19dc88c7 100644 --- a/riegeli/bytes/fd_io_uring_writer.h +++ b/riegeli/bytes/fd_io_uring_writer.h @@ -156,6 +156,7 @@ class FdIoUringWriterBase : public BufferedWriter { absl::optional independent_pos); void InitializeFdIoUring(FdIoUringOptions options, int fd); ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation); + ABSL_ATTRIBUTE_COLD bool IoUringFailOperation(const int error_number, absl::string_view operation); void AnnotateFailure(absl::Status& status) override; bool WriteInternal(absl::string_view src) override; diff --git a/riegeli/iouring/BUILD b/riegeli/iouring/BUILD index b11c84f5..e6ff0356 100644 --- a/riegeli/iouring/BUILD +++ b/riegeli/iouring/BUILD @@ -13,7 +13,12 @@ cc_library( srcs = ["fd_io_uring.cc"], hdrs = ["fd_io_uring.h"], deps = [ + "//riegeli/base", + "//riegeli/base:status", + ":fd_io_uring_options", "@liburing", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/strings", ] ) @@ -24,8 +29,6 @@ cc_library( ], hdrs = ["fd_sync_io_uring.h"], deps = [ - "//riegeli/base", - ":fd_io_uring_options", ":fd_io_uring", ], ) @@ -37,8 +40,7 @@ cc_library( ], hdrs = ["fd_async_io_uring.h"], deps = [ - "//riegeli/base", - "//riegeli/iouring:fd_io_uring_options", - "//riegeli/iouring:fd_io_uring", + ":fd_io_uring", + "@com_google_absl//absl/functional:bind_front", ], ) \ No newline at end of file diff --git a/riegeli/iouring/fd_async_io_uring.cc b/riegeli/iouring/fd_async_io_uring.cc index d1173a3e..42ca1daa 100644 --- a/riegeli/iouring/fd_async_io_uring.cc +++ b/riegeli/iouring/fd_async_io_uring.cc @@ -1,25 +1,11 @@ #include "riegeli/iouring/fd_async_io_uring.h" -#include "riegeli/base/base.h" - -#include -#include +#include "absl/functional/bind_front.h" namespace riegeli { FdAsyncIoUring::FdAsyncIoUring(FdIoUringOptions options, int fd) -:size_(options.size()), exit_(false), process_num_(0) { - - memset(&ring_, 0, sizeof(ring_)); - memset(¶ms_, 0, sizeof(params_)); - - const bool init_res = InitIoUring(); - RIEGELI_ASSERT(init_res) << "Failed initilization of Io_Uring. (FdAsyncIoUring)"; - - if(options.fd_register()) { - RegisterFd(fd); - } - +:FdIoUring(options, fd), exit_(false), process_num_(0) { reap_thread_ = std::thread([this]() { this->Reap(); }); } @@ -29,63 +15,24 @@ FdAsyncIoUring::~FdAsyncIoUring() { if(reap_thread_.joinable()) { reap_thread_.join(); } - - io_uring_queue_exit(&ring_); -} - -bool FdAsyncIoUring::InitIoUring() { - - if(io_uring_queue_init_params(size_, &ring_, ¶ms_) != 0) { - return false; - } - - return true; -} - -void FdAsyncIoUring::RegisterFd(int fd) { - fd_ = fd; - - if(fd_register_ == false) { - const int register_res = io_uring_register_files(&ring_, &fd_, 1); - RIEGELI_ASSERT_EQ(register_res, 0) << "Failed fd register."; - fd_register_ = true; - } else { - UpdateFd(); - } -} - -void FdAsyncIoUring::UnRegisterFd() { - fd_ = -1; - const int unregister_res = io_uring_unregister_files(&ring_); - RIEGELI_ASSERT_EQ(unregister_res, 0) << "Failed fd unregister."; - fd_register_ = false; -} - -void FdAsyncIoUring::UpdateFd() { - const int update_res = io_uring_register_files_update(&ring_, 0, &fd_, 1); - RIEGELI_ASSERT_EQ(update_res, 1) << "Failed fd update."; } ssize_t FdAsyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { - std::lock_guard l(sq_mutex_); - struct io_uring_sqe *sqe = GetSqe(); if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; - io_uring_prep_read(sqe, 0, buf, count, offset); - sqe -> flags |= IOSQE_FIXED_FILE; - } else { - io_uring_prep_read(sqe, fd, buf, count, offset); + return preadInternel(0, buf, count, offset); } - FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); - FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); - io_uring_sqe_set_data(sqe, op); - SubmitSqe(); - return count; + + return preadInternel(fd, buf, count, offset); } ssize_t FdAsyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offset) { void* src = operator new(count); - RIEGELI_ASSERT(!!src) << "Failed to create new space for data. (pwrite)"; + + if(ABSL_PREDICT_FALSE(!src)) { + FailOperation(12, "FdAsyncIoUring pwrite() Create Space"); + return -12; + } std::memcpy(src, buf, count); @@ -97,114 +44,109 @@ ssize_t FdAsyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offs return pwriteInternel(fd, src, count, offset); } -ssize_t FdAsyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { - std::lock_guard l(sq_mutex_); - struct io_uring_sqe *sqe = GetSqe(); +int FdAsyncIoUring::fsync(int fd) { if(fd_register_) { RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; - io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); - sqe -> flags |= IOSQE_FIXED_FILE; - } else { - io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); + return fsyncInternel(0); } - FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); - FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); - io_uring_sqe_set_data(sqe, op); - SubmitSqe(); - return 0; + + return fsyncInternel(fd); } -ssize_t FdAsyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { - std::lock_guard l(sq_mutex_); +ssize_t FdAsyncIoUring::preadInternel(int fd, void *buf, size_t count, off_t offset) { + std::lock_guard lock_g(sq_mutex_); struct io_uring_sqe *sqe = GetSqe(); + io_uring_prep_read(sqe, fd, buf, count, offset); if(fd_register_) { - RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; - io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); sqe -> flags |= IOSQE_FIXED_FILE; - } else { - io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); } - FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp::CallBackFunc cb = absl::bind_front(&FdAsyncIoUring::preadCallBack, this); FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); io_uring_sqe_set_data(sqe, op); SubmitSqe(); - return 0; + return count; } -int FdAsyncIoUring::fsync(int fd) { - std::lock_guard l(sq_mutex_); - struct io_uring_sqe *sqe = GetSqe(); +ssize_t FdAsyncIoUring::pwriteInternel(int fd, const void* buf, size_t count, off_t offset) { + std::lock_guard lock_g(sq_mutex_); + struct io_uring_sqe *sqe = GetSqe(); + io_uring_prep_write(sqe, fd, buf, count, offset); if(fd_register_) { - RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; - io_uring_prep_fsync(sqe, 0, 0); sqe -> flags |= IOSQE_FIXED_FILE; - } else { - io_uring_prep_fsync(sqe, fd, 0); } - FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::fsyncCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp::CallBackFunc cb = absl::bind_front(&FdAsyncIoUring::pwriteCallBack, this); FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); io_uring_sqe_set_data(sqe, op); SubmitSqe(); - return 0; + return count; } -ssize_t FdAsyncIoUring::pwriteInternel(int fd, const void* buf, size_t count, off_t offset) { - std::lock_guard l(sq_mutex_); - struct io_uring_sqe *sqe = GetSqe(); - io_uring_prep_write(sqe, fd, buf, count, offset); +int FdAsyncIoUring::fsyncInternel(int fd) { + std::lock_guard lock_g(sq_mutex_); + struct io_uring_sqe *sqe = GetSqe(); + io_uring_prep_fsync(sqe, fd, 0); if(fd_register_) { sqe -> flags |= IOSQE_FIXED_FILE; } - FdAsyncIoUringOp::CallBackFunc cb = std::bind(&FdAsyncIoUring::pwriteCallBack, this, std::placeholders::_1, std::placeholders::_2); + FdAsyncIoUringOp::CallBackFunc cb = absl::bind_front(&FdAsyncIoUring::fsyncCallBack, this); FdAsyncIoUringOp* op = new FdAsyncIoUringOp(sqe, cb); io_uring_sqe_set_data(sqe, op); SubmitSqe(); - return count; + return 0; } -void FdAsyncIoUring::pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res) { +void FdAsyncIoUring::preadCallBack(FdAsyncIoUringOp *op, const ssize_t res) { int fd = op -> GetSqe().fd; void* buf = reinterpret_cast(op -> GetSqe().addr); size_t offset = op -> GetSqe().off; size_t count = op -> GetSqe().len; delete op; - RIEGELI_ASSERT_GE(res, 0) << "pwrite() errno."; + if(ABSL_PREDICT_FALSE(res < 0)) { + if(res == -EINTR || res == -EAGAIN) { + preadInternel(fd, buf, count, offset); + } else { + FailOperation(-res, "pread()"); + } + } + RIEGELI_ASSERT_GT(res, 0) << "pread() return 0."; +} + +void FdAsyncIoUring::pwriteCallBack(FdAsyncIoUringOp *op, const ssize_t res) { + int fd = op -> GetSqe().fd; + void* buf = reinterpret_cast(op -> GetSqe().addr); + size_t offset = op -> GetSqe().off; + size_t count = op -> GetSqe().len; + delete op; + + if(ABSL_PREDICT_FALSE(res < 0)) { + if(res == -EINTR || res == -EAGAIN) { + pwriteInternel(fd, buf, count, offset); + } else { + operator delete(buf, count); + FailOperation(-res, "pwrite()"); + } + return; + } RIEGELI_ASSERT_GT(res, 0) << "pwrite() return 0."; RIEGELI_ASSERT_LE((size_t) res, count) << "pwrite() wrote more than requested."; char* newBuf = static_cast(buf); operator delete(buf, res); - if(count - res > 0) { + if(ABSL_PREDICT_FALSE(count - res > 0)) { newBuf += res; offset += res; count -= res; pwriteInternel(fd, newBuf, count, offset); } - } -void FdAsyncIoUring::fsyncCallBack(FdAsyncIoUringOp *op, ssize_t res) { +void FdAsyncIoUring::fsyncCallBack(FdAsyncIoUringOp *op, const ssize_t res) { delete op; - RIEGELI_ASSERT_EQ(res, 0) << "fsync() errno."; -} -void FdAsyncIoUring::preadCallBack(FdAsyncIoUringOp *op, ssize_t res) { - delete op; - RIEGELI_ASSERT_GE(res, 0) << "pread() errno."; - RIEGELI_ASSERT_GT(res, 0) << "pread() return 0."; -} - -void FdAsyncIoUring::pwritevCallBack(FdAsyncIoUringOp *op, ssize_t res) { - delete op; - RIEGELI_ASSERT_GE(res, 0) << "pwritev() errno."; - RIEGELI_ASSERT_GT(res, 0) << "pwritev() return 0."; -} - -void FdAsyncIoUring::preadvCallBack(FdAsyncIoUringOp *op, ssize_t res) { - delete op; - RIEGELI_ASSERT_GE(res, 0) << "preadv() errno."; - RIEGELI_ASSERT_GT(res, 0) << "preadv() return 0."; + if(ABSL_PREDICT_FALSE(res < 0)) { + FailOperation(-res, "fsync()"); + } } inline struct io_uring_sqe* FdAsyncIoUring::GetSqe() { @@ -225,7 +167,7 @@ void FdAsyncIoUring::Reap() { struct io_uring_cqe* cqe = NULL; if(io_uring_wait_cqe(&ring_, &cqe) == 0) { --process_num_; - ssize_t res = cqe -> res; + const ssize_t res = cqe -> res; FdAsyncIoUringOp *op = static_cast(io_uring_cqe_get_data(cqe)); FdAsyncIoUringOp::CallBackFunc cb = op -> GetCallBackFunc(); if(cb != NULL) { diff --git a/riegeli/iouring/fd_async_io_uring.h b/riegeli/iouring/fd_async_io_uring.h index 48d6acb3..7f91a964 100644 --- a/riegeli/iouring/fd_async_io_uring.h +++ b/riegeli/iouring/fd_async_io_uring.h @@ -6,7 +6,6 @@ #include #include -#include "riegeli/iouring/fd_io_uring_options.h" #include "riegeli/iouring/fd_io_uring.h" namespace riegeli { @@ -15,7 +14,7 @@ namespace riegeli { class FdAsyncIoUringOp { public: // Call back function. - using CallBackFunc = std::function; + using CallBackFunc = std::function; // Consturctor and destructor for FdAsyncIoUringOp. explicit FdAsyncIoUringOp() : cb_(NULL) {} @@ -65,41 +64,14 @@ class FdAsyncIoUring : public FdIoUring { ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) override; - ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; - - ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; - int fsync(int fd) override; - // Interface for register and unregister fd. - void RegisterFd(int fd) override; - - void UnRegisterFd() override; - + // Get the mode of Io_Uring. IoUringMode Mode() override { return IoUringMode::ASYNCIOURING; } - // Get Io_Uring settings. - bool fd_register() override { - return fd_register_; - } - - uint32_t size() override { - return size_; - } - - int fd() override { - return fd_; - } - private: - // Initilize Io_Uring. - bool InitIoUring(); - - // Update registered fd. - void UpdateFd(); - // Reap handler function. void Reap(); @@ -111,23 +83,14 @@ class FdAsyncIoUring : public FdIoUring { // Internel part and call back function of file operation. ssize_t pwriteInternel(int fd, const void *buf, size_t count, off_t offset); - void pwriteCallBack(FdAsyncIoUringOp *op, ssize_t res); + ssize_t preadInternel(int fd, void *buf, size_t count, off_t offset); + int fsyncInternel(int fd); - void fsyncCallBack(FdAsyncIoUringOp *op, ssize_t res); - void preadCallBack(FdAsyncIoUringOp *op, ssize_t res); - void preadvCallBack(FdAsyncIoUringOp *op, ssize_t res); - void pwritevCallBack(FdAsyncIoUringOp *op, ssize_t res); + void preadCallBack(FdAsyncIoUringOp *op, const ssize_t res); + void pwriteCallBack(FdAsyncIoUringOp *op, const ssize_t res); + void fsyncCallBack(FdAsyncIoUringOp *op, const ssize_t res); private: - // Io_Uring entrance and set up params. - struct io_uring_params params_; - struct io_uring ring_; - - // Io_Uring settings. - bool fd_register_ = false; - uint32_t size_ = 0; - int fd_ = -1; - // Joinable thread flag. std::atomic_bool exit_; diff --git a/riegeli/iouring/fd_io_uring.cc b/riegeli/iouring/fd_io_uring.cc index 68be81fb..20197bea 100644 --- a/riegeli/iouring/fd_io_uring.cc +++ b/riegeli/iouring/fd_io_uring.cc @@ -1,5 +1,10 @@ #include "riegeli/iouring/fd_io_uring.h" +#include "riegeli/base/errno_mapping.h" + +#include "absl/base/optimization.h" +#include "absl/strings/str_cat.h" + namespace riegeli { namespace ioUring { @@ -15,4 +20,61 @@ bool IsIoUringAvailable() { } } + +FdIoUring::FdIoUring(FdIoUringOptions options, int fd) : Object(kInitiallyOpen), size_(options.size()) { + Init(options.fd_register(), fd); +} + +bool FdIoUring::Init(bool fd_register, int fd) { + memset(&ring_, 0, sizeof(ring_)); + memset(¶ms_, 0, sizeof(params_)); + + const int init_res = io_uring_queue_init_params(size_, &ring_, ¶ms_); + if(ABSL_PREDICT_FALSE(init_res < 0)) { + return FailOperation(-init_res, "Init Io_Uring"); + } + + if(fd_register) { + RegisterFd(fd); + } + + return true; +} + +FdIoUring::~FdIoUring() { + io_uring_queue_exit(&ring_); +} + +void FdIoUring::RegisterFd(int fd) { + fd_ = fd; + + if(fd_register_ == false) { + const int register_res = io_uring_register_files(&ring_, &fd_, 1); + RIEGELI_ASSERT_EQ(register_res, 0) << "Failed fd register."; + fd_register_ = true; + } else { + UpdateFd(); + } +} + +void FdIoUring::UnRegisterFd() { + fd_ = -1; + const int unregister_res = io_uring_unregister_files(&ring_); + RIEGELI_ASSERT_EQ(unregister_res, 0) << "Failed fd unregister."; + fd_register_ = false; +} + +void FdIoUring::UpdateFd() { + const int update_res = io_uring_register_files_update(&ring_, 0, &fd_, 1); + RIEGELI_ASSERT_EQ(update_res, 1) << "Failed fd update."; +} + +bool FdIoUring::FailOperation(const int error_number, absl::string_view operation) { + RIEGELI_ASSERT_NE(error_number, 0) + << "Failed precondition of FdWriterBase::FailOperation(): " + "zero errno"; + return Fail( + ErrnoToCanonicalStatus(error_number, absl::StrCat(operation, " failed"))); +} + } // namespace riegeli \ No newline at end of file diff --git a/riegeli/iouring/fd_io_uring.h b/riegeli/iouring/fd_io_uring.h index 02d7e868..635109be 100644 --- a/riegeli/iouring/fd_io_uring.h +++ b/riegeli/iouring/fd_io_uring.h @@ -11,6 +11,13 @@ #include "liburing.h" #include "syscall.h" +#include "absl/base/attributes.h" +#include "absl/strings/string_view.h" + +#include "riegeli/base/base.h" +#include "riegeli/base/object.h" +#include "riegeli/iouring/fd_io_uring_options.h" + namespace riegeli { namespace ioUring { @@ -19,8 +26,8 @@ bool IsIoUringAvailable(); } -// The base interface class for sync or async Io_Uring. -class FdIoUring { +// The base class for sync or async Io_Uring. +class FdIoUring : public Object { public: enum class IoUringMode { ASYNCIOURING, @@ -28,31 +35,64 @@ class FdIoUring { }; public: - virtual ~FdIoUring() {} + FdIoUring() = delete; + FdIoUring(const FdIoUring&) = delete; + FdIoUring& operator=(const FdIoUring&) = delete; + +protected: + FdIoUring(FdIoUringOptions options, int fd); + +public: + virtual ~FdIoUring(); // The interface for file operation for Io_Uring. virtual ssize_t pread(int fd, void *buf, size_t count, off_t offset) = 0; virtual ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) = 0; - virtual ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) = 0; - - virtual ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) = 0; - virtual int fsync(int fd) = 0; + // Get the mode of Io_Uring. + virtual IoUringMode Mode() = 0; + // Pre-register or unregister file descriptor for Io_Uring. - virtual void RegisterFd(int fd) = 0; + void RegisterFd(int fd); - virtual void UnRegisterFd() = 0; + void UnRegisterFd(); - virtual IoUringMode Mode() = 0; + // Get Io_Uring settings. + bool fd_register() { + return fd_register_; + } + + uint32_t size() { + return size_; + } + + int fd() { + return fd_; + } + +private: + // Init. + bool Init(bool fd_register, int fd); + + // Update registered fd. + void UpdateFd(); - virtual bool fd_register() = 0; +protected: + // Fail Operation + ABSL_ATTRIBUTE_COLD bool FailOperation(const int error_number, absl::string_view operation); - virtual uint32_t size() = 0; +protected: + // Io_Uring entrance and set up params. + struct io_uring_params params_; + struct io_uring ring_; - virtual int fd() = 0; + // Io_Uring settings. + bool fd_register_ = false; + uint32_t size_ = 0; + int fd_ = -1; }; } // namespace riegeli diff --git a/riegeli/iouring/fd_io_uring_options.cc b/riegeli/iouring/fd_io_uring_options.cc index 87ef7d9b..a19421aa 100644 --- a/riegeli/iouring/fd_io_uring_options.cc +++ b/riegeli/iouring/fd_io_uring_options.cc @@ -13,6 +13,9 @@ uint32_t FdIoUringOptions::RoundUpToNextPowerTwo(uint32_t size) { size |= size >> 4; size |= size >> 8; size |= size >> 16; + if(size + 1 > 4096) { + return 4096; + } return size + 1; } diff --git a/riegeli/iouring/fd_io_uring_options.h b/riegeli/iouring/fd_io_uring_options.h index 8dcb91c6..892ebde4 100644 --- a/riegeli/iouring/fd_io_uring_options.h +++ b/riegeli/iouring/fd_io_uring_options.h @@ -81,7 +81,7 @@ class FdIoUringOptions { uint32_t RoundUpToNextPowerTwo(uint32_t size); bool async_ = true; - uint32_t size_ = 8192; + uint32_t size_ = 512; bool fd_register_ = false; }; diff --git a/riegeli/iouring/fd_sync_io_uring.cc b/riegeli/iouring/fd_sync_io_uring.cc index a18795d7..68efcd43 100644 --- a/riegeli/iouring/fd_sync_io_uring.cc +++ b/riegeli/iouring/fd_sync_io_uring.cc @@ -1,62 +1,9 @@ #include "riegeli/iouring/fd_sync_io_uring.h" -#include "riegeli/base/base.h" - -#include -#include - namespace riegeli { FdSyncIoUring::FdSyncIoUring(FdIoUringOptions options, int fd) -: size_(options.size()) { - - memset(&ring_, 0, sizeof(ring_)); - memset(¶ms_, 0, sizeof(params_)); - - const bool init_res = InitIoUring(); - RIEGELI_ASSERT(init_res) << "Failed initilization of Io_Uring. (FdSyncIoUring)"; - - if(options.fd_register()) { - RegisterFd(fd); - } -} - -FdSyncIoUring::~FdSyncIoUring() { - io_uring_queue_exit(&ring_); -} - -bool FdSyncIoUring::InitIoUring() { - - if(io_uring_queue_init_params(size_, &ring_, ¶ms_) != 0) { - return false; - } - - return true; -} - -void FdSyncIoUring::RegisterFd(int fd) { - fd_ = fd; - - if(fd_register_ == false) { - const int register_res = io_uring_register_files(&ring_, &fd_, 1); - RIEGELI_ASSERT_EQ(register_res, 0) << "Failed fd register."; - fd_register_ = true; - } else { - UpdateFd(); - } -} - -void FdSyncIoUring::UnRegisterFd() { - fd_ = -1; - const int unregister_res = io_uring_unregister_files(&ring_); - RIEGELI_ASSERT_EQ(unregister_res, 0) << "Failed fd unregister."; - fd_register_ = false; -} - -void FdSyncIoUring::UpdateFd() { - const int update_res = io_uring_register_files_update(&ring_, 0, &fd_, 1); - RIEGELI_ASSERT_EQ(update_res, 1) << "Failed fd update."; -} +: FdIoUring(options, fd) {} ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { struct io_uring_sqe *sqe = GetSqe(); @@ -67,7 +14,12 @@ ssize_t FdSyncIoUring::pread(int fd, void *buf, size_t count, off_t offset) { } else { io_uring_prep_read(sqe, fd, buf, count, offset); } - ssize_t res = SubmitAndGetResult(); + const ssize_t res = SubmitAndGetResult(); + if(ABSL_PREDICT_FALSE(res < 0)) { + if(res != -EINTR && res != -EAGAIN) { + FailOperation(-res, "pread()"); + } + } return res; } @@ -80,33 +32,12 @@ ssize_t FdSyncIoUring::pwrite(int fd, const void *buf, size_t count, off_t offse } else { io_uring_prep_write(sqe, fd, buf, count, offset); } - ssize_t res = SubmitAndGetResult(); - return res; -} - -ssize_t FdSyncIoUring::preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { - struct io_uring_sqe *sqe = GetSqe(); - if(fd_register_) { - RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; - io_uring_prep_readv(sqe, 0, iov, iovcnt, offset); - sqe -> flags |= IOSQE_FIXED_FILE; - } else { - io_uring_prep_readv(sqe, fd, iov, iovcnt, offset); + const ssize_t res = SubmitAndGetResult(); + if(ABSL_PREDICT_FALSE(res < 0)) { + if(res != -EINTR && res != -EAGAIN) { + FailOperation(-res, "pwrite()"); + } } - ssize_t res = SubmitAndGetResult(); - return res; -} - -ssize_t FdSyncIoUring::pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) { - struct io_uring_sqe *sqe = GetSqe(); - if(fd_register_) { - RIEGELI_ASSERT_EQ(fd_, fd) << "The fd is not epual to the registered fd."; - io_uring_prep_writev(sqe, 0, iov, iovcnt, offset); - sqe -> flags |= IOSQE_FIXED_FILE; - } else { - io_uring_prep_writev(sqe, fd, iov, iovcnt, offset); - } - ssize_t res = SubmitAndGetResult(); return res; } @@ -119,7 +50,10 @@ int FdSyncIoUring::fsync(int fd) { } else { io_uring_prep_fsync(sqe, fd, 0); } - ssize_t res = SubmitAndGetResult(); + const ssize_t res = SubmitAndGetResult(); + if(ABSL_PREDICT_FALSE(res < 0)) { + FailOperation(-res, "fsync()"); + } return res; } diff --git a/riegeli/iouring/fd_sync_io_uring.h b/riegeli/iouring/fd_sync_io_uring.h index 20801e9d..5a07f305 100644 --- a/riegeli/iouring/fd_sync_io_uring.h +++ b/riegeli/iouring/fd_sync_io_uring.h @@ -1,7 +1,6 @@ #ifndef RIEGELI_IOURING_FD_SYNC_IO_URING_H_ #define RIEGELI_IOURING_FD_SYNC_IO_URING_H_ -#include "riegeli/iouring/fd_io_uring_options.h" #include "riegeli/iouring/fd_io_uring.h" namespace riegeli { @@ -15,63 +14,26 @@ class FdSyncIoUring : public FdIoUring { explicit FdSyncIoUring(FdIoUringOptions options, int fd = -1); - ~FdSyncIoUring() override; + ~FdSyncIoUring() override {} // Override the file operation interface for Io_Uring. ssize_t pread(int fd, void *buf, size_t count, off_t offset) override; ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) override; - ssize_t preadv(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; - - ssize_t pwritev(int fd, const struct ::iovec *iov, int iovcnt, off_t offset) override; - int fsync(int fd) override; - // Interface for register and unregister fd. - void RegisterFd(int fd) override; - - void UnRegisterFd() override; - + // Get the mode of Io_Uring. IoUringMode Mode() override { return IoUringMode::SYNCIOURING; } - // Get Io_Uring settings. - bool fd_register() override { - return fd_register_; - } - - uint32_t size() override { - return size_; - } - - int fd() override { - return fd_; - } - private: - // Initilize Io_Uring. - bool InitIoUring(); - - // Update registered fd. - void UpdateFd(); - // Get sqe. struct io_uring_sqe* GetSqe(); // Submit sqe to kernel. ssize_t SubmitAndGetResult(); - - private: - // Io_Uring entrance and set up params. - struct io_uring_params params_; - struct io_uring ring_; - - // Io_Uring settings. - bool fd_register_ = false; - uint32_t size_ = 0; - int fd_ = -1; }; } // namespace riegeli