From 12cab1b171f9e9854bb5dc8ae9960340c38a5bbb Mon Sep 17 00:00:00 2001 From: kenkoooo Date: Sun, 14 Jun 2026 04:17:41 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8F=90=E5=87=BA=E3=83=9A=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=81=8C404=E3=81=AE=E3=82=B3=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AF=E5=8D=B3=E3=82=B9=E3=82=AD=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit submissions のクロールで404も他のエラーと同様に最大10回・指数 バックオフ(2s→…→1024s, 約34分)でリトライしており、提出ページが 404を返す古い/非公開コンテスト1件ごとに大量の時間を浪費していた。 これにより crawl-new / crawl-all が1周しきれず、abc308/358/410 など 古いコンテストへの提出が反映されない一因となっていた (#1518, #1520)。 fetch_submissions が404を CrawlerError::NotFound として返すようにし (fetch_problems と同じ扱い)、リトライ層では404を即スキップ。429や 5xx など他のエラーは従来どおりリトライする。 Co-Authored-By: Claude Opus 4.8 (1M context) --- atcoder-problems-backend/crawler/src/client.rs | 3 +++ atcoder-problems-backend/src/crawler_utils.rs | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/atcoder-problems-backend/crawler/src/client.rs b/atcoder-problems-backend/crawler/src/client.rs index e29194b3..ac4b1511 100644 --- a/atcoder-problems-backend/crawler/src/client.rs +++ b/atcoder-problems-backend/crawler/src/client.rs @@ -125,6 +125,9 @@ impl CrawlerClient { ); let request = self.client.get(&url); let response = request.send().await?; + if response.status() == 404 { + return Err(CrawlerError::NotFound); + } if !response.status().is_success() { return Err(CrawlerError::HttpError(response.text().await?)); } diff --git a/atcoder-problems-backend/src/crawler_utils.rs b/atcoder-problems-backend/src/crawler_utils.rs index e137d91e..9c77ae0a 100644 --- a/atcoder-problems-backend/src/crawler_utils.rs +++ b/atcoder-problems-backend/src/crawler_utils.rs @@ -23,6 +23,14 @@ pub async fn fetch_submissions( Ok(submissions) => { return submissions; } + Err(CrawlerError::NotFound) => { + tracing::warn!( + "Submissions page not found for contest {} page {} (404), skipping", + contest_id, + page + ); + return vec![]; + } Err(e) => { retry_count += 1; tracing::warn!(