mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
perf: 删除 Key 前显式清理关联表,避免 CASCADE 级联删除超时
在 ProviderAPIKey 删除前,先批量删除 RequestCandidate、GeminiFileMapping、 VideoTask 等关联表记录,替代依赖数据库 CASCADE 级联删除,防止大量关联 记录导致删除操作超时。Pool 批量删除、封禁清理、Endpoint 批量删除三处 统一使用 cleanup_key_references。
This commit is contained in:
@@ -40,6 +40,7 @@ from src.services.provider.pool.scheduling_dimensions import (
|
||||
evaluate_pool_scheduling_dimensions,
|
||||
summarize_pool_scheduling_dimensions,
|
||||
)
|
||||
from src.services.provider_keys.key_side_effects import cleanup_key_references
|
||||
from src.services.provider_keys.quota_reader import get_quota_reader
|
||||
|
||||
from .schemas import (
|
||||
@@ -1071,12 +1072,18 @@ class AdminBatchActionKeysAdapter(AdminApiAdapter):
|
||||
if self.body.action == "delete":
|
||||
delete_started_at = time.perf_counter()
|
||||
sql_delete_ms = 0.0
|
||||
cleanup_ms = 0.0
|
||||
commit_ms = 0.0
|
||||
side_effects_ms = 0.0
|
||||
key_ids = list(dict.fromkeys(self.body.key_ids))
|
||||
delete_batch_size = _resolve_delete_batch_size(db)
|
||||
delete_batch_count = 0
|
||||
try:
|
||||
# 先清理关联表,避免 CASCADE 级联删除导致超时
|
||||
cleanup_started_at = time.perf_counter()
|
||||
cleanup_key_references(db, key_ids)
|
||||
cleanup_ms = (time.perf_counter() - cleanup_started_at) * 1000.0
|
||||
|
||||
for batch in _iter_batches(key_ids, delete_batch_size):
|
||||
batch_started_at = time.perf_counter()
|
||||
result = db.execute(
|
||||
@@ -1097,12 +1104,13 @@ class AdminBatchActionKeysAdapter(AdminApiAdapter):
|
||||
db.rollback()
|
||||
total_ms = (time.perf_counter() - delete_started_at) * 1000.0
|
||||
logger.error(
|
||||
"batch delete commit failed: {} | provider={} requested={} batches={} sql_ms={:.2f} commit_ms={:.2f} total_ms={:.2f}",
|
||||
"batch delete commit failed: {} | provider={} requested={} batches={} sql_ms={:.2f} cleanup_ms={:.2f} commit_ms={:.2f} total_ms={:.2f}",
|
||||
exc,
|
||||
pid[:8],
|
||||
len(key_ids),
|
||||
delete_batch_count,
|
||||
sql_delete_ms,
|
||||
cleanup_ms,
|
||||
commit_ms,
|
||||
total_ms,
|
||||
)
|
||||
@@ -1127,12 +1135,13 @@ class AdminBatchActionKeysAdapter(AdminApiAdapter):
|
||||
|
||||
total_ms = (time.perf_counter() - delete_started_at) * 1000.0
|
||||
logger.info(
|
||||
"[POOL_BATCH_DELETE_TIMING] provider={} requested={} affected={} batches={} batch_size={} sql_ms={:.2f} commit_ms={:.2f} side_effects_ms={:.2f} total_ms={:.2f}",
|
||||
"[POOL_BATCH_DELETE_TIMING] provider={} requested={} affected={} batches={} batch_size={} cleanup_ms={:.2f} sql_ms={:.2f} commit_ms={:.2f} side_effects_ms={:.2f} total_ms={:.2f}",
|
||||
pid[:8],
|
||||
len(key_ids),
|
||||
affected,
|
||||
delete_batch_count,
|
||||
delete_batch_size,
|
||||
cleanup_ms,
|
||||
sql_delete_ms,
|
||||
commit_ms,
|
||||
side_effects_ms,
|
||||
@@ -1245,6 +1254,7 @@ class AdminCleanupBannedKeysAdapter(AdminApiAdapter):
|
||||
|
||||
banned_key_ids = [str(key.id) for key in banned_keys]
|
||||
try:
|
||||
cleanup_key_references(db, banned_key_ids)
|
||||
db.execute(
|
||||
sa_delete(ProviderAPIKey).where(
|
||||
ProviderAPIKey.provider_id == pid,
|
||||
|
||||
Reference in New Issue
Block a user