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" )