fix(pool): keep schedulable keys when stale inactive scores exist

- delete pool member scores when a provider key is deactivated
- fall through to the catalog key scan when the pool score page is empty
- log skipped local candidates with a skip_reason for diagnosis
- add regressions for inactive keys with stale available scores
This commit is contained in:
hkxiaoyao
2026-09-14 20:42:47 +08:00
parent 60b89cc840
commit 7daf355e65
4 changed files with 178 additions and 1 deletions
+40
View File
@@ -804,12 +804,43 @@ impl AppState {
if updated.is_some() {
self.invalidate_provider_routing_caches();
}
if let Some(key) = updated.as_ref().filter(|key| !key.is_active) {
self.delete_inactive_provider_catalog_key_pool_scores(
key.provider_id.as_str(),
key.id.as_str(),
)
.await;
}
match updated {
Some(key) => self.open_provider_catalog_key(key).await.map(Some),
None => Ok(None),
}
}
async fn delete_inactive_provider_catalog_key_pool_scores(
&self,
provider_id: &str,
key_id: &str,
) {
if let Err(err) = self
.data
.delete_pool_member_scores_for_member(
&pool_scores::PoolMemberIdentity::provider_api_key(
provider_id.to_string(),
key_id.to_string(),
),
)
.await
{
warn!(
provider_id,
key_id,
error = ?err,
"gateway provider catalog key deactivate: failed to delete pool member scores"
);
}
}
pub(crate) async fn compare_and_update_provider_catalog_key_admin_state(
&self,
update: &provider_catalog::ProviderCatalogKeyAdminCasUpdate,
@@ -843,6 +874,15 @@ impl AppState {
if updated.as_ref().is_some_and(|keys| !keys.is_empty()) {
self.invalidate_provider_routing_caches();
}
if let Some(keys) = updated.as_ref() {
for key in keys.iter().filter(|key| !key.is_active) {
self.delete_inactive_provider_catalog_key_pool_scores(
key.provider_id.as_str(),
key.id.as_str(),
)
.await;
}
}
match updated {
Some(keys) => self.open_provider_catalog_keys(keys).await.map(Some),
None => Ok(None),