/** * WAL Checkpoint Scheduler * SQLite WAL 파일의 주기적 체크포인트를 관리하는 스케줄러 * * 클린코드 원칙: * - 단일 책임 원칙: WAL 체크포인트 스케줄링만 담당 * - 명확한 인터페이스: CheckpointMode enum과 CheckpointResult interface로 명확한 타입 정의 */ /** * 체크포인트 모드 * - PASSIVE: 다른 연결이 읽기 중이면 체크포인트를 건너뜀 (성능 영향 최소화) * - TRUNCATE: WAL 파일을 완전히 제거 (디스크 공간 절약) * - FULL: 모든 페이지를 메인 DB로 이동 후 WAL 파일 제거 (장기 트랜잭션이 없을 때만 사용) */ export declare enum CheckpointMode { PASSIVE = "PASSIVE", TRUNCATE = "TRUNCATE", FULL = "FULL" } /** * 체크포인트 실행 결과 */ export interface CheckpointResult { /** * 체크포인트 모드 */ mode: CheckpointMode; /** * 성공 여부 */ success: boolean; /** * WAL 파일의 페이지 수 */ log: number; /** * 체크포인트된 페이지 수 */ checkpointed: number; /** * 락 상태 (1: 락, 0: 정상) */ busy: number; /** * 에러 (실패 시) */ error?: Error; } /** * WAL 체크포인트 스케줄러 설정 */ export interface WalCheckpointSchedulerConfig { /** * 체크포인트 실행 주기 (밀리초) * 기본값: 5분 (300000ms) */ intervalMs: number; /** * WAL 파일 크기 경고 임계값 (바이트) * 기본값: 16MB (16777216 bytes) */ walSizeWarningThreshold: number; /** * WAL 파일 크기 위험 임계값 (바이트) * 기본값: 24MB (25165824 bytes) */ walSizeDangerThreshold: number; /** * 전용 커넥션 사용 여부 * 기본값: true * true인 경우 체크포인트 전용 연결을 생성하여 메인 연결과 분리 */ useDedicatedConnection: boolean; /** * 최대 재시도 횟수 * 기본값: 3 */ maxRetries: number; /** * 재시도 백오프 시간 (밀리초) * 기본값: 1000ms * 지수 백오프의 기본 단위로 사용됨 (1초, 2초, 4초) */ retryBackoffMs: number; } /** * Logger 인터페이스 */ export interface Logger { info(message: string, meta?: Record): void; warn(message: string, meta?: Record): void; error(message: string, meta?: Record): void; } /** * PerformanceMonitor 인터페이스 */ export interface PerformanceMonitor { recordMetric(name: string, value: number): void; incrementCounter(name: string): void; } import Database from 'better-sqlite3'; import type { RuntimeDiagnosticsLogger } from '../../domains/monitoring/services/runtime-diagnostics-logger.js'; /** * WAL 체크포인트 스케줄러 클래스 * SQLite WAL 파일의 주기적 체크포인트를 관리 */ export declare class WalCheckpointScheduler { private mainDb; private config; private logger?; private performanceMonitor?; private diagnosticsLogger?; private intervalId; private isRunning; private dedicatedConnection; private checkpointInProgress; constructor(mainDb: Database.Database, config: WalCheckpointSchedulerConfig, logger?: Logger | undefined, performanceMonitor?: PerformanceMonitor | undefined, diagnosticsLogger?: Pick | undefined); /** * 스케줄러 시작 (idempotent) */ start(): void; /** * 스케줄러 중지 (idempotent, 비동기) */ stop(): Promise; /** * 즉시 체크포인트 실행 * @param mode 체크포인트 모드 (기본값: TRUNCATE) * @returns 체크포인트 실행 결과 */ checkpointNow(mode?: CheckpointMode): Promise; /** * 체크포인트 실행 (재시도 로직 포함) * busy=1인 경우 실패로 간주하여 재시도 수행 * 동시 실행 방지: checkpointInProgress 플래그로 중첩 실행 방지 * * @param mode 체크포인트 모드 * @returns 체크포인트 실행 결과 */ private checkpoint; /** * 주기적 체크포인트 스케줄링 * 동시 실행 방지: checkpointInProgress 플래그로 중첩 실행 방지 */ private scheduleCheckpoint; /** * 대기 함수 (지수 백오프용) * @param ms 대기 시간 (밀리초) */ private sleep; /** * 체크포인트 실행 (실제 SQL 실행) * better-sqlite3의 pragma는 기본적으로 배열을 반환함 * * @param db 데이터베이스 연결 * @param mode 체크포인트 모드 * @returns 체크포인트 실행 결과 */ private executeCheckpoint; /** * WAL 파일 크기 조회 * 파일 시스템 API를 통한 크기 조회 (읽기 전용, 락 유발 없음) * * @returns WAL 파일 크기 (바이트), 파일이 없거나 에러 발생 시 0 반환 */ private getWalFileSize; private writeDiagnosticsEvent; } //# sourceMappingURL=wal-checkpoint-scheduler.d.ts.map