دسکتاپ، Worker و محاسبات محلی · فصل ۵ — Reconciliation، Rollout و Watchdog · 191
Backup/Restore Smoke و Independent Watchdog
اپ یا worker محلی را اجرا میکند اما device identity، privilege، offline state و fleet behavior را طراحی نکرده است. موضوع جاری: «Backup/Restore Smoke و Independent Watchdog». میتواند «Backup/Restore Smoke و Independent Watchdog» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
خلاصهٔ درس
اپ یا worker محلی را اجرا میکند اما device identity، privilege، offline state و fleet behavior را طراحی نکرده است. موضوع جاری: «Backup/Restore Smoke و Independent Watchdog».
میتواند «Backup/Restore Smoke و Independent Watchdog» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
خروجی این درس
میتواند «Backup/Restore Smoke و Independent Watchdog» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
1. Backup موجود، معادل Recovery آماده نیست
داشتن یک فایل Backup فقط نشان میدهد چیزی ذخیره شده است. Recovery readiness زمانی معنا دارد که Backup به source generation و digest مشخص متصل باشد، در یک مقصد ایزوله restore شود، integrity و invariantهای برنامه را پاس کند و نتیجه قابل ممیزی بماند. همزمان، زندهبودن workload باید از بیرون workload نیز قابل سنجش باشد.
2. مرز مالکیت LOC-018
این درس فقط Evidence Contract مربوط به Backup/Restore Smoke و Independent Watchdog را مالک است. Drift reconciliation در LOC-016 و progressive rollout در LOC-017 است. Restore موفق نیز بهتنهایی liveness supervision را ثابت نمیکند و restart موفق هم صحت داده restoreشده را ثابت نمیکند.
3. Backup را به محتوای منبع Bind کن
حداقل باید backup_id، source_generation، source_digest، backup_created_at و backup_digest ثبت شوند. filename یا وجود فایل برای اثبات کافی نیست. اگر digest یا generation منبع معلوم نباشد، نمیتوان گفت این Backup دقیقاً نماینده کدام state بوده است.
4. SQLite Online Backup چه چیزی ثابت میکند
SQLite Online Backup API محتوای یک database را به database دیگر کپی میکند و میتواند این کار را incremental انجام دهد تا source برای تمام مدت عملیات lock نماند. این مکانیزم برای ساخت snapshot مناسب است، اما completion آن بهتنهایی application restore correctness را ثابت نمیکند.
5. Restore Smoke باید Isolated باشد
Restore را روی target جداگانه انجام بده تا تست Recovery روی داده فعال overwrite نشود. restore_target، زمان شروع/پایان و isolation_confirmed باید ثبت شوند. اگر restore روی همان مسیر زنده انجام شود، evidence از recovery test به عملیات مخرب تبدیل میشود.
6. Integrity Check فقط یک لایه از Proof است
PRAGMA integrity_check consistency سطح پایین SQLite را بررسی میکند و در حالت بدون خطا ok برمیگرداند. خطاهای foreign key مرز جدا دارند و باید با foreign_key_check بررسی شوند. حتی ok نیز business invariant یا صحت application behavior را تضمین نمیکند.
7. Application Smoke را بعد از Structural Check اجرا کن
پس از restore، حداقل یک invariant قابل مشاهده اجرا کن؛ مثلاً وجود schema مورد انتظار، شمار رکورد bounded، یا state marker شناختهشده. application_smoke_result و expected_invariant باید کنار integrity evidence ثبت شوند. اگر invariant شکست خورد، نتیجه RESTORE_FAILED است حتی اگر integrity_check برابر ok باشد.
8. Content Binding را با Digest دوباره ببند
Backup و Restore باید از نظر محتوایی به هم وصل شوند. source_digest، backup_digest و در صورت استفاده restored_digest کمک میکنند corruption یا اشتباه در artifact را آشکار کنیم. فایل با همان نام میتواند خراب شده باشد؛ نام artifact proof نیست.
9. Watchdog باید خارج از Workload تصمیم بگیرد
Heartbeatی که فقط خود workload تولید و خودش تفسیر میکند independent supervision نیست. watchdog_owner باید یک supervisor بیرونی باشد؛ در Linux میتواند service manager باشد. هدف این است که workload نتواند هم failure را ایجاد کند و هم evidence سلامت خودش را کنترل کند.
10. WatchdogSec و Heartbeat Deadline
در systemd، WatchdogSec deadline را تعیین میکند و service با WATCHDOG=1 keep-alive میفرستد. عبور از deadline باید یک event قابلردیابی بسازد. صرف فعال بودن process یا UI کافی نیست؛ event loop میتواند wedged باشد در حالی که process هنوز وجود دارد.
11. Restart Budget باید Finite باشد
Automatic restart بدون سقف میتواند failure loop بسازد. restart_count و restart_budget را ثبت کن. تا وقتی budget باقی است، restart ممکن است مجاز باشد؛ پس از exhaustion، state باید به WATCHDOG_EXHAUSTED یا escalation واضح برود، نه retry بینهایت.
12. Post-restart Readiness یک Gate مستقل است
Restart شدن process موفقیت recovery نیست. بعد از restart باید readiness یا application probe دوباره اجرا شود. اگر post_restart_readiness=false باشد، state نباید RECOVERED شود؛ باید escalation یا halt رخ دهد.
13. Worked Example: Backup سالم، Heartbeat از دسترفته
Node یک backup content-bound دارد و restore isolated تمام checkها را پاس میکند. بعداً worker heartbeat را از دست میدهد؛ supervisor مستقل آن را restart میکند، budget هنوز باقی است و post-restart readiness پاس میشود. در Evidence Pack دو claim جدا داریم: RESTORE_PROVEN برای داده و RECOVERED برای watchdog path.
14. Failure Probeهای قطعی
چهار mutation را بررسی کن: یک صفحه restoreشده خراب ولی filename ثابت؛ integrity_check برابر ok ولی application invariant شکستخورده؛ process زنده ولی heartbeat دیرتر از deadline؛ restart budget تمامشده و readiness هنوز false. هر mutation باید state تایپشده و دلیل قابلممیزی تولید کند.
15. Transfer: Windows بهجای systemd
در Transfer، data directory عوض میشود و supervisor به Windows service failure actions تغییر میکند. Contract را حفظ کن: backup content binding، isolated restore، structural + application checks، supervisor مستقل، deadline، restart budget، post-restart readiness و escalation. مکانیزم پلتفرمی عوض میشود؛ معیار Evidence عوض نمیشود.
ارزیابی
پاسخنامهی این درس در بستهی آموزش وجود ندارد؛ خودت جواب بده و صادقانه علامت بزن. «نیاز به مرور» درس را به صف تکرار میفرستد.
F1 retrieval
F2 diagnosis
S1 application
S2 diagnosis
S3 decision
S4 transfer
ملاکهای ارزیابی (rubric)
| Dimension | Sufficient evidence | Blocking failure |
|---|---|---|
| Backup binding | source generation and digest link the backup to a source state | filename/existence is treated as proof |
| Restore proof | isolated restore + integrity + FK + application invariant are visible | structural check substitutes for application smoke |
| Watchdog independence | supervisor is outside workload and heartbeat deadline is explicit | workload self-reports and self-judges health |
| Finite recovery | restart budget, readiness and escalation are explicit | infinite retry or restart=success |
| Transfer | Windows mechanism changes while evidence contract is recomputed | Linux-specific result is copied as an oracle |
منابع و تازگی
مطالعهٔ موارد (case studies)
تصاویر درس
فایلهای آزمایشگاه
Use only the supplied synthetic records. Implement evaluate(case) in starter.py. Keep backup/restore evidence separate from watchdog evidence, fail closed on missing decisive evidence, require an independent supervisor, enforce a finite restart budget, and never equate process restart with readiness.
Run python run_checks.py. The learner checker validates output shape and safety boundaries only; expected decision labels and reference logic are kept outside learner-publishable paths.