diff --git a/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc b/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc index b596237cb4..7063236863 100644 --- a/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc +++ b/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc @@ -16,6 +16,7 @@ #include "google/cloud/odbc/bq_client_interface/datasets.h" #include "google/cloud/odbc/bq_client_interface/jobs.h" #include "google/cloud/odbc/bq_client_interface/odbc_authentication.h" +#include "google/cloud/odbc/bq_client_interface/setenv.h" #include "google/cloud/odbc/bq_client_interface/projects.h" #include "google/cloud/odbc/bq_client_interface/storage.h" #include "google/cloud/odbc/bq_client_interface/tables.h" @@ -292,6 +293,7 @@ StatusRecordOr> ODBCBQClient::CreateBQClient( read_options.set(ssl_creds); } #endif + SetEnv("GRPC_DNS_RESOLVER", "native"); BigQueryReadClient bigquery_read_client = BigQueryReadClient(MakeBigQueryReadConnection(read_options)); diff --git a/google/cloud/odbc/bq_driver/internal/odbc_sql_execute_utils.cc b/google/cloud/odbc/bq_driver/internal/odbc_sql_execute_utils.cc index a4480d7f6d..74618afc9a 100644 --- a/google/cloud/odbc/bq_driver/internal/odbc_sql_execute_utils.cc +++ b/google/cloud/odbc/bq_driver/internal/odbc_sql_execute_utils.cc @@ -13,10 +13,12 @@ // limitations under the License. #include "google/cloud/odbc/bq_driver/internal/odbc_sql_execute_utils.h" +#include "google/cloud/odbc/bq_client_interface/setenv.h" #include "google/cloud/odbc/bq_client_interface/utils.h" #include "google/cloud/odbc/bq_driver/internal/odbc_internal_commons.h" #include "google/cloud/odbc/bq_driver/internal/trace_utils.h" #include +#include ////////////////////////////////////////////////////////////////// // This file has query execution related utilities which can have @@ -47,6 +49,13 @@ using google::cloud::odbc_bq_driver_internal::StatementHandle; using google::cloud::odbc_internal::SQLStates; using chrono_ms = std::chrono::milliseconds; +#if (!defined(_WIN32) || defined(_WIN64)) && !defined(NO_ARROW) +bool IsGrpcDnsResolverError(StatusRecord const& status) { + return status.message.find("hostname lookup error") != std::string::npos || + status.message.find("DNS query cancelled") != std::string::npos; +} +#endif // (!defined(_WIN32) || defined(_WIN64)) && !defined(NO_ARROW) + StatusRecord ConstructPositionalQueryParams( DescriptorHandle& apd, DescriptorHandle& ipd, std::vector& basic_query_params, bool is_data_buff_req) { @@ -596,7 +605,20 @@ StatusRecord FetchBQDataReadArrow(StatementHandle& stmt_handle, auto read_session_status = bq_client->CreateReadSession(create_read_session_request, options); if (!read_session_status) { - return read_session_status.GetStatusRecord(); + StatusRecord status = read_session_status.GetStatusRecord(); + if (!IsGrpcDnsResolverError(status)) { + return status; + } +#ifdef _WIN32 + _putenv_s("GRPC_DNS_RESOLVER", "native"); +#else + setenv("GRPC_DNS_RESOLVER", "native", 1); +#endif + read_session_status = + bq_client->CreateReadSession(create_read_session_request, options); + if (!read_session_status) { + return read_session_status.GetStatusRecord(); + } } auto session = *read_session_status; @@ -624,6 +646,19 @@ StatusRecord FetchBQDataReadArrow(StatementHandle& stmt_handle, read_rows_stream = bq_client->GetReadRowsStream(read_rows_request, options); stmt_handle.SetReadRowsStream(std::move(read_rows_stream)); + StatusRecord status = ReadNextResultsFromStream(stmt_handle); + if (status.ok() || !IsGrpcDnsResolverError(status)) { + return status; + } +#ifdef _WIN32 + _putenv_s("GRPC_DNS_RESOLVER", "native"); +#else + setenv("GRPC_DNS_RESOLVER", "native", 1); +#endif + stmt_handle.ClearReadRowsStream(); + stmt_handle.ClearReadRowsIterator(); + read_rows_stream = bq_client->GetReadRowsStream(read_rows_request, options); + stmt_handle.SetReadRowsStream(std::move(read_rows_stream)); return ReadNextResultsFromStream(stmt_handle); }