From: Lucian Petrut Date: Fri, 17 Feb 2023 10:55:07 +0000 (+0000) Subject: librados/asio: use boost::system::generic_category on Windows X-Git-Tag: v18.1.0~314^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c93daea80a18e87a2267c350dca81b8ed8c99687;p=ceph.git librados/asio: use boost::system::generic_category on Windows librados uses "errno.h" error codes. On Windows, boost::system::system_category refers to errors from winerror.h. That being considered, we'll add a platform check and use boost::system::generic_category on Windows. This ensures that error code comparisons work as expected. This issue was brought up by the following test assertion failure: ft2.4: ceph_test_rados_api_asio.AsioRados.AsyncWriteCallbacktesttools. testresult.real._StringException: details: {{{ /ceph/src/test/librados/asio.cc:148 Expected equality of these values: boost::system::errc::read_only_file_system Which is: 30 ec Which is: system:30 }}} Signed-off-by: Lucian Petrut --- diff --git a/src/librados/librados_asio.h b/src/librados/librados_asio.h index c9b5ffba7e3ed..bd672d951f730 100644 --- a/src/librados/librados_asio.h +++ b/src/librados/librados_asio.h @@ -32,6 +32,15 @@ namespace librados { namespace detail { +#ifndef _WIN32 +constexpr auto err_category = boost::system::system_category; +#else +// librados uses "errno.h" error codes. On Windows, +// boost::system::system_category refers to errors from winerror.h. +// That being considered, we'll use boost::system::generic_category. +constexpr auto err_category = boost::system::generic_category; +#endif + /// unique_ptr with custom deleter for AioCompletion struct AioCompletionDeleter { void operator()(AioCompletion *c) { c->release(); } @@ -76,7 +85,7 @@ struct AsyncOp : Invoker { const int ret = op.aio_completion->get_return_value(); boost::system::error_code ec; if (ret < 0) { - ec.assign(-ret, boost::system::system_category()); + ec.assign(-ret, librados::detail::err_category()); } op.dispatch(std::move(p), ec); } @@ -107,7 +116,7 @@ auto async_read(ExecutionContext& ctx, IoCtx& io, const std::string& oid, int ret = io.aio_read(oid, op.aio_completion.get(), &op.result, len, off); if (ret < 0) { - auto ec = boost::system::error_code{-ret, boost::system::system_category()}; + auto ec = boost::system::error_code{-ret, librados::detail::err_category()}; ceph::async::post(std::move(p), ec, bufferlist{}); } else { p.release(); // release ownership until completion @@ -130,7 +139,7 @@ auto async_write(ExecutionContext& ctx, IoCtx& io, const std::string& oid, int ret = io.aio_write(oid, op.aio_completion.get(), bl, len, off); if (ret < 0) { - auto ec = boost::system::error_code{-ret, boost::system::system_category()}; + auto ec = boost::system::error_code{-ret, librados::detail::err_category()}; ceph::async::post(std::move(p), ec); } else { p.release(); // release ownership until completion @@ -154,7 +163,7 @@ auto async_operate(ExecutionContext& ctx, IoCtx& io, const std::string& oid, int ret = io.aio_operate(oid, op.aio_completion.get(), read_op, flags, &op.result); if (ret < 0) { - auto ec = boost::system::error_code{-ret, boost::system::system_category()}; + auto ec = boost::system::error_code{-ret, librados::detail::err_category()}; ceph::async::post(std::move(p), ec, bufferlist{}); } else { p.release(); // release ownership until completion @@ -177,7 +186,7 @@ auto async_operate(ExecutionContext& ctx, IoCtx& io, const std::string& oid, int ret = io.aio_operate(oid, op.aio_completion.get(), write_op, flags); if (ret < 0) { - auto ec = boost::system::error_code{-ret, boost::system::system_category()}; + auto ec = boost::system::error_code{-ret, librados::detail::err_category()}; ceph::async::post(std::move(p), ec); } else { p.release(); // release ownership until completion @@ -200,7 +209,7 @@ auto async_notify(ExecutionContext& ctx, IoCtx& io, const std::string& oid, int ret = io.aio_notify(oid, op.aio_completion.get(), bl, timeout_ms, &op.result); if (ret < 0) { - auto ec = boost::system::error_code{-ret, boost::system::system_category()}; + auto ec = boost::system::error_code{-ret, librados::detail::err_category()}; ceph::async::post(std::move(p), ec, bufferlist{}); } else { p.release(); // release ownership until completion