Skip to content

Commit ef8e82d

Browse files
committed
feat(sqldata): standardize on synchronous direct SqlDataSocket and remove async TCP tunnel
- Replace local TCP loopback tunnel server and event loop reader/writer forwarding with direct synchronous SqlDataSocket implementation - Remove async mode, GOOGLE_CLOUD_SQL_DATA_IMPL toggle, and FallbackSocket - Update SqlDataClient to manage synchronous gRPC streams and return SqlDataSocket wrapping _RequestQueue and background response reader - Update unit tests to verify direct socket connection and lifecycle
1 parent c0778f2 commit ef8e82d

6 files changed

Lines changed: 858 additions & 657 deletions

File tree

‎google/cloud/sql/connector/connector.py‎

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@
4343
from google.cloud.sql.connector.enums import RefreshStrategy
4444
from google.cloud.sql.connector.exceptions import ClosedConnectorError
4545
from google.cloud.sql.connector.exceptions import ConnectorLoopError
46+
from google.cloud.sql.connector.exceptions import IncompatibleDriverError
4647
from google.cloud.sql.connector.exceptions import ResourceExhaustedError
4748
from google.cloud.sql.connector.instance import RefreshAheadCache
4849
from google.cloud.sql.connector.lazy import LazyRefreshCache
4950
from google.cloud.sql.connector.monitored_cache import MonitoredCache
5051
from google.cloud.sql.connector.resolver import DefaultResolver
5152
from google.cloud.sql.connector.resolver import DnsResolver
52-
from google.cloud.sql.connector.sqldata_client import FallbackSocket
5353
from google.cloud.sql.connector.sqldata_client import SqlDataClient
5454
from google.cloud.sql.connector.utils import format_database_user
5555
from google.cloud.sql.connector.utils import generate_keys
@@ -283,7 +283,7 @@ def __init__(
283283
)
284284
self._sql_data_fallback_cache: set[str] = set()
285285
self._sql_data_conn_state: dict[str, SqlDataConnState] = {}
286-
self._sqldata_clients: set[SqlDataClient] = set()
286+
self._sqldata_clients: set[Any] = set()
287287

288288

289289

@@ -468,6 +468,10 @@ async def connect_async(
468468
# attempt to establish connection
469469
try:
470470
if ip_type == IPTypes.SQL_DATA:
471+
if driver in ASYNC_DRIVERS:
472+
raise IncompatibleDriverError(
473+
f"Driver '{driver}' is not supported with ip_type '{ip_type}'."
474+
)
471475
state = self._sql_data_conn_state.setdefault(
472476
str(conn_name), SqlDataConnState()
473477
)
@@ -526,7 +530,7 @@ async def get_conn_info():
526530
cache = self._get_or_create_cache(conn_name, enable_iam_auth)
527531
return await cache.connect_info()
528532

529-
tunnel_port = await sqldata_client.connect_tunnel(
533+
sock = await sqldata_client.connect(
530534
instance_connection_name=str(conn_name),
531535
region=conn_name.region,
532536
project=conn_name.project,
@@ -539,36 +543,24 @@ async def get_conn_info():
539543
connect_timeout=kwargs.get("timeout", self._timeout),
540544
)
541545

542-
if driver in ASYNC_DRIVERS:
543-
return await connector(
544-
"127.0.0.1",
545-
None,
546-
port=tunnel_port,
547-
**kwargs,
548-
)
549-
else:
550-
raw_sock = socket.create_connection(("127.0.0.1", tunnel_port))
551-
fd = raw_sock.detach()
552-
fallback_sock = FallbackSocket(fileno=fd)
553-
554-
cache = None
555-
if conn_name.domain_name:
556-
cache = self._get_or_create_cache(conn_name, enable_iam_auth)
557-
cache.sockets.append(fallback_sock)
558-
559-
connect_partial = partial(
560-
connector,
561-
"127.0.0.1",
562-
fallback_sock,
563-
**kwargs,
564-
)
565-
try:
566-
return await self._loop.run_in_executor(None, connect_partial)
567-
except Exception:
568-
fallback_sock.close()
569-
if conn_name.domain_name and cache:
570-
cache._purge_closed_sockets()
571-
raise
546+
cache = None
547+
if conn_name.domain_name:
548+
cache = self._get_or_create_cache(conn_name, enable_iam_auth)
549+
cache.sockets.append(sock)
550+
551+
connect_partial = partial(
552+
connector,
553+
"127.0.0.1",
554+
sock,
555+
**kwargs,
556+
)
557+
try:
558+
return await self._loop.run_in_executor(None, connect_partial)
559+
except Exception:
560+
sock.close()
561+
if conn_name.domain_name and cache:
562+
cache._purge_closed_sockets()
563+
raise
572564
else:
573565
try:
574566
conn_info = await monitored_cache.connect_info()

‎google/cloud/sql/connector/proto/sql_data_service_pb2.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
)
3535
# @@protoc_insertion_point(imports)
3636

37+
from google.rpc import status_pb2 as _status_pb2 # noqa: F401
38+
3739
_sym_db = _symbol_database.Default()
3840

3941

0 commit comments

Comments
 (0)