From ab668d799045ff2110e546c6b3d11a3e024aeb62 Mon Sep 17 00:00:00 2001 From: hyungi Date: Wed, 10 Jun 2026 13:43:29 +0900 Subject: [PATCH] =?UTF-8?q?fix(news):=20crawl=5Fraw=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EB=AA=85=20CHAR(64)=20=ED=8C=A8=EB=94=A9=20strip=20+=20politen?= =?UTF-8?q?ess=20=EB=8C=80=EA=B8=B0=20=EB=A1=9C=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - documents.file_hash 실 컬럼이 character(64) — 32자 해시가 공백 패딩되어 gz 파일명에 공백 32개 포함 (실배포 1건 실측). _raw_html_path 에서 strip. - _respect_domain_rate silent sleep 에 대기 로그 1줄 (검증 게이트·운영 가시성). Co-Authored-By: Claude Fable 5 --- app/core/crawl_politeness.py | 2 ++ app/workers/fulltext_worker.py | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/core/crawl_politeness.py b/app/core/crawl_politeness.py index d4f6df2..d54687d 100644 --- a/app/core/crawl_politeness.py +++ b/app/core/crawl_politeness.py @@ -75,6 +75,8 @@ async def _respect_domain_rate(domain: str) -> None: delay = random.uniform(_DOMAIN_DELAY_MIN, _DOMAIN_DELAY_MAX) wait = last + delay - time.monotonic() if wait > 0: + # silent sleep 금지 — politeness 동작 검증·운영 관찰 가시성 + logger.info("[politeness] %s %.1fs 대기", domain, wait) await asyncio.sleep(wait) diff --git a/app/workers/fulltext_worker.py b/app/workers/fulltext_worker.py index c9d7ee3..ab94e35 100644 --- a/app/workers/fulltext_worker.py +++ b/app/workers/fulltext_worker.py @@ -70,11 +70,15 @@ def _extract_body(html_text: str) -> tuple[str, str | None, str | None]: def _raw_html_path(source_id: int | None, file_hash: str, now: datetime) -> Path: - """A-7 원본 보존 경로 — NAS 본진. 한글 디렉토리의 NFC/NFD 비대칭을 피해 source_id 사용.""" + """A-7 원본 보존 경로 — NAS 본진. 한글 디렉토리의 NFC/NFD 비대칭을 피해 source_id 사용. + + file_hash 는 DB 컬럼이 character(64) 라 32자 해시가 공백 패딩되어 돌아옴 — strip 필수 + (미적용 시 NAS 파일명에 공백 32개 = 쉘/rsync 함정). + """ src_dir = f"src_{source_id}" if source_id is not None else "src_unknown" return ( Path(settings.nas_mount_path) / "crawl_raw" / src_dir - / now.strftime("%Y-%m") / f"{file_hash}.html.gz" + / now.strftime("%Y-%m") / f"{file_hash.strip()}.html.gz" )