From d5e56b634e9d49b6e763f6099ae5dd756ef876b7 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Sun, 5 Apr 2026 17:44:34 +0900 Subject: [PATCH] GH-49661: [CI][C++] Suppress deprecated warnings with gRPC 1.80.0 --- .../flight/transport/grpc/grpc_client.cc | 18 ++++++-- .../flight/transport/grpc/util_internal.cc | 43 +++++++++++++++++++ .../flight/transport/grpc/util_internal.h | 12 ++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/flight/transport/grpc/grpc_client.cc b/cpp/src/arrow/flight/transport/grpc/grpc_client.cc index 737ec5fe910a..f1a5dcd68635 100644 --- a/cpp/src/arrow/flight/transport/grpc/grpc_client.cc +++ b/cpp/src/arrow/flight/transport/grpc/grpc_client.cc @@ -732,19 +732,31 @@ class GrpcClientImpl : public internal::ClientTransport { # endif // defined(GRPC_USE_CERTIFICATE_VERIFIER) # if defined(GRPC_USE_TLS_CHANNEL_CREDENTIALS_OPTIONS) +# if GRPC_CPP_VERSION_CHECK(1, 80, 0) + auto certificate_provider = + std::make_shared<::grpc::experimental::InMemoryCertificateProvider>(); + RETURN_NOT_OK(FromAbslStatus(certificate_provider->UpdateRoot(kDummyRootCert))); +# else auto certificate_provider = std::make_shared<::grpc::experimental::StaticDataCertificateProvider>( kDummyRootCert); +# endif # if defined(GRPC_USE_TLS_CHANNEL_CREDENTIALS_OPTIONS_ROOT_CERTS) ::grpc::experimental::TlsChannelCredentialsOptions tls_options( certificate_provider); -# else // defined(GRPC_USE_TLS_CHANNEL_CREDENTIALS_OPTIONS_ROOT_CERTS) - // While gRPC >= 1.36 does not require a root cert (it has a default) - // in practice the path it hardcodes is broken. See grpc/grpc#21655. +# else // defined(GRPC_USE_TLS_CHANNEL_CREDENTIALS_OPTIONS_ROOT_CERTS) + // While gRPC >= 1.36 does not require a root cert (it has a default) + // in practice the path it hardcodes is broken. See grpc/grpc#21655. ::grpc::experimental::TlsChannelCredentialsOptions tls_options; +# if GRPC_CPP_VERSION_CHECK(1, 80, 0) + tls_options.set_root_certificate_provider(certificate_provider); +# else tls_options.set_certificate_provider(certificate_provider); +# endif # endif // defined(GRPC_USE_TLS_CHANNEL_CREDENTIALS_OPTIONS_ROOT_CERTS) +# if !GRPC_CPP_VERSION_CHECK(1, 80, 0) tls_options.watch_root_certs(); +# endif tls_options.set_root_cert_name("dummy"); # if defined(GRPC_USE_CERTIFICATE_VERIFIER) tls_options.set_certificate_verifier(std::move(cert_verifier)); diff --git a/cpp/src/arrow/flight/transport/grpc/util_internal.cc b/cpp/src/arrow/flight/transport/grpc/util_internal.cc index ff8607778b9f..95b205d67808 100644 --- a/cpp/src/arrow/flight/transport/grpc/util_internal.cc +++ b/cpp/src/arrow/flight/transport/grpc/util_internal.cc @@ -331,6 +331,49 @@ ::grpc::Status ToGrpcStatus(const Status& arrow_status, ::grpc::ServerContext* c return status; } +#if GRPC_CPP_VERSION_CHECK(1, 80, 0) +Status FromAbslStatus(const ::absl::Status& absl_status) { + switch (absl_status.code()) { + case ::absl::StatusCode::kOk: + return Status::OK(); + case ::absl::StatusCode::kCancelled: + return Status::Cancelled(absl_status.ToString()); + case ::absl::StatusCode::kUnknown: + return Status::UnknownError(absl_status.ToString()); + case ::absl::StatusCode::kInvalidArgument: + return Status::Invalid(absl_status.ToString()); + case ::absl::StatusCode::kDeadlineExceeded: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kNotFound: + return Status::KeyError(absl_status.ToString()); + case ::absl::StatusCode::kAlreadyExists: + return Status::AlreadyExists(absl_status.ToString()); + case ::absl::StatusCode::kPermissionDenied: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kResourceExhausted: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kFailedPrecondition: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kAborted: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kOutOfRange: + return Status::Invalid(absl_status.ToString()); + case ::absl::StatusCode::kUnimplemented: + return Status::NotImplemented(absl_status.ToString()); + case ::absl::StatusCode::kInternal: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kUnavailable: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kDataLoss: + return Status::IOError(absl_status.ToString()); + case ::absl::StatusCode::kUnauthenticated: + return Status::IOError(absl_status.ToString()); + default: + return Status::UnknownError(absl_status.ToString()); + } +} +#endif + } // namespace grpc } // namespace transport } // namespace flight diff --git a/cpp/src/arrow/flight/transport/grpc/util_internal.h b/cpp/src/arrow/flight/transport/grpc/util_internal.h index 5687c7a872a4..6f3d86eb6535 100644 --- a/cpp/src/arrow/flight/transport/grpc/util_internal.h +++ b/cpp/src/arrow/flight/transport/grpc/util_internal.h @@ -34,6 +34,12 @@ class Status; namespace flight { +#define GRPC_CPP_VERSION_CHECK(major, minor, patch) \ + ((GRPC_CPP_VERSION_MAJOR > (major) || \ + (GRPC_CPP_VERSION_MAJOR == (major) && GRPC_CPP_VERSION_MINOR > (minor)) || \ + ((GRPC_CPP_VERSION_MAJOR == (major) && GRPC_CPP_VERSION_MINOR == (minor) && \ + GRPC_CPP_VERSION_PATCH >= (patch))))) + #define GRPC_RETURN_NOT_OK(expr) \ do { \ ::arrow::Status _s = (expr); \ @@ -90,6 +96,12 @@ ARROW_FLIGHT_EXPORT ::grpc::Status ToGrpcStatus(const Status& arrow_status, ::grpc::ServerContext* ctx = nullptr); +// gRPC 1.80.0 or later use absl::Status. +#if GRPC_CPP_VERSION_CHECK(1, 80, 0) +/// Convert an Abseil status to an Arrow status. +ARROW_FLIGHT_EXPORT +Status FromAbslStatus(const ::absl::Status& absl_status); +#endif } // namespace grpc } // namespace transport } // namespace flight