[aio] host_monitoring_v2 without a topology plugin fails the first statement on cluster-endpoint connections
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 49/100
Hướng nghiên cứu
Start with aio/wrapper.py and _build_host_list_provider, then compare the Aurora dialect provider selection in database_dialect.py with the async behavior. Trace how AsyncHostMonitoringPlugin._get_monitoring_host_info identifies and caches a host, using the described mocked reproduction as a starting point. Done when the first statement succeeds through a cluster endpoint and monitoring targets the connected instance, with regression coverage for the failure and cache behavior.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Describe the bug
With the async API, host_monitoring_v2 used without a topology plugin (no failover, failover_v2, aurora_connection_tracker, ...) fails the first statement on every new connection made through an Aurora cluster endpoint, with AwsWrapperError: [HostMonitoringV2Plugin] Unable to identify the connected database instance. Later statements on that connection succeed, but the monitor watches the cluster endpoint's DNS name instead of the instance the connection is on.
Cause:
aio/wrapper.py_build_host_list_providerreturnsAsyncStaticHostListProviderwhenpluginscontains none of_TOPOLOGY_REQUIRING_PLUGINS, whatever the database dialect.host_monitoring_v2isn't in that set.- For a cluster endpoint,
AsyncHostMonitoringPlugin._get_monitoring_host_infocallsplugin_service.identify_connection. With the static provider the topology has nohost_id, so it returnsNoneand the plugin raises before running the statement. _get_monitoring_host_infoassignsself._monitoring_host_info = current_host_infobefore identifying, so on the next statement it returns the cached cluster endpoint and monitors that.
The sync wrapper doesn't hit this: Aurora dialects always use RdsHostListProvider (database_dialect.py, AuroraPgDialect.get_host_list_provider_supplier), regardless of plugins, so identify_connection resolves the instance.
Expected Behavior
As in sync, host_monitoring_v2 alone on a cluster endpoint identifies the instance the connection landed on and monitors it, and the first statement runs normally.
What plugins are used? What other connection properties were set?
wrapper_dialect=aurora-pg&wrapper_plugins=host_monitoring_v2, connecting through the cluster (writer) endpoint. With failover added, or through an instance endpoint, it works.
Current Behavior
Checked without a database by building the provider the way connect does and calling _get_monitoring_host_info with get_instance_id patched to return an instance id:
AsyncStaticHostListProvider mydb.cluster-xyz... -> 1st call: AwsWrapperError: Unable to identify the connected database instance
2nd call: monitors mydb.cluster-xyz.us-east-1.rds.amazonaws.com
AsyncStaticHostListProvider inst-1.xyz... -> monitors inst-1.xyz.us-east-1.rds.amazonaws.com
Reproduction Steps
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
from aws_advanced_python_wrapper.aio import release_resources_async
async def main():
engine = create_async_engine(
"postgresql+aws_wrapper_psycopg://USER:PASSWORD@<name>.cluster-<id>.<region>.rds.amazonaws.com:5432/DB"
"?wrapper_dialect=aurora-pg&wrapper_plugins=host_monitoring_v2")
try:
async with engine.connect() as conn:
await conn.execute(text("SELECT 1")) # raises AwsWrapperError
finally:
await engine.dispose()
await release_resources_async()
asyncio.run(main())
Possible Solution
Match sync: pick the topology-aware provider from the Aurora/Multi-AZ/Global dialect even when no topology plugin is configured, or add host_monitoring_v2 (and host_monitoring) to _TOPOLOGY_REQUIRING_PLUGINS. Either way, resolve the instance (the topology monitor is shared per cluster after #1285, so this costs one monitoring connection per cluster). Separately, _get_monitoring_host_info shouldn't cache the cluster endpoint when identification fails.
Additional Information/Context
Found while answering a user question about using host_monitoring_v2 without failover. Related: #1284.
The AWS Advanced Python Wrapper version used
main at 8feea85 (3.1.0)
python version used
Python 3.14
Operating System and version
macOS (checked locally, not against a live cluster)
- Ngôn ngữ chính
- Python
- Star
- 99
- Fork
- 22
- Merge trung bình
- 1 ngày 7 giờ
- Pull request đã merge (30 ngày)
- 4
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của aws/aws-advanced-python-wrapper
-
[aio] host_monitoring_v2: event loops stop each other's monitors, recreating them on every statementCó thể đã có người làm @AhmadMasry đã nhận 1 ngày trước. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
aws/aws-advanced-python-wrapper#1287 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Async: every connection opens its own topology monitor connection (pool of N holds 2N connections)Có thể đã có người làm @AhmadMasry đã nhận 1 ngày trước. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
aws/aws-advanced-python-wrapper#1284 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
aws/aws-advanced-python-wrapper#1278 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 72/100
aws/aws-advanced-python-wrapper#1276 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
aws/aws-advanced-python-wrapper#1275 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của aws/aws-advanced-python-wrapper
Issue tương tự
-
changelog investigate
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
ramnes/notion-sdk-py#409 ·
-
good first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
lindicaphxag-tech/kaggle#28 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
BSData/horus-heresy-3rd-edition#3211 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Unreachable-proxy mount test depends on fixed port 9999Có thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởbug tests
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 1 ngày