עדכון ספרייה: בחירת מסלול על דלתא כבדה, מד התקדמות בהחלה, שימוש חוזר ב-patch ובדיקת מקום (issue #1211) - #1223
Merged
Conversation
This was referenced Sep 7, 2026
Y-PLONI
force-pushed
the
library-update-heavy-delta-1211
branch
from
September 7, 2026 21:21
59a0d87 to
2e61a9e
Compare
…ב-patch ובדיקת מקום (issue Otzaria#1211) patch v23→v27 של 3GB פרוסים הוחל במשך שעה ומעלה כשהחיווי מציג ספינר בלבד, וסגירת התוכנה גרמה להורדה מחדש של 585MB. הדלתא נבחרה כי ה-planner השווה רק גודל הורדה. בחירת מסלול: כשה-planner מסמן isHeavyDelta ויש DB מלא, העדכון לא רץ אוטומטית אלא עובר ל-needsRouteChoice עם שתי פעולות שקולות — עדכון דלתא (הורדה קטנה, החלה ארוכה; מתאים לרשת איטית) או הורדה מלאה (הורדה גדולה, החלה קצרה) — עם הגדלים. ConfirmHeavyDelta מריץ את הדלתא; ConfirmFullDownload עובר ל-toFullDownloadFallback ומכניס את התוכנית ל-state כדי שה-reconcile של האינדקס ירוץ. בלי DB מלא הדלתא רצה עם הערה שההחלה עשויה להימשך זמן רב. checkForUpdate מעביר את גודל seforim.db ל-planner. מד התקדמות: onApplyProgress של החבילה מועבר מה-isolate כרשומה מתויגת ומוצג כ-applyProgress בשלבי upserts/deletes, בוויסות הקיים של 200ms. שימוש חוזר: StreamingPatchDownloader מחזיר patch פרוס קיים אחרי אימות גודל ו-sha256 במקום להוריד שוב; אי-התאמה מוחקת ומורידה. בסיום תוכנית וגם לפני בדיקת המקום נמחקים קובצי patch-*.db שאינם חלק מהתוכנית, כדי ששריד של 3GB לא ינעל משתמש על "אין מקום". מקום פנוי: בדיקה לפני כל צעד דלתא — הקאש צריך דחוס+פרוס (בניכוי מה שכבר קיים) ותיקיית ה-DB צריכה מרווח WAL בגודל ה-patch הפרוס. LibraryUpdateDiskSpaceException ממופה להודעה אחת בשני המסלולים ואינו מציע הורדה מלאה, שדורשת עוד יותר מקום. דורש seforim_library_updater 0.5.0 (Otzaria/otzaria_library_updater — PR נלווה). ה-CI אדום עד מיזוגו כי pubspec.yaml עוקב אחרי main.
…atch לשימוש חוזר (issue Otzaria#1211) סוג חיווי חדש WorkStatusKind.awaitingInput: פריט שמחכה להחלטת המשתמש מוצג עם אייקון שאלה ולא עם טבעת התקדמות ריקה שנראית כמו עבודה שנתקעה. אימות ה-sha256 של patch פרוס (3GB, עשרות שניות) רץ ב-isolate שמדווח התקדמות כל 8MB ומקבל הודעת ביטול; הריפוזיטורי מעביר את זה כשלב verifying עם applyProgress, וה-BLoC מאפשר ביטול בדלתא כל עוד לא התחילה כתיבה ל-DB. ביטול משאיר את הקובץ לריצה הבאה.
Y-PLONI
force-pushed
the
library-update-heavy-delta-1211
branch
from
September 8, 2026 04:45
2e61a9e to
f3973f0
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
סוגר את #1211.
מה
isHeavyDeltaויש DB מלא, העדכון לא רץ אוטומטית אלא עובר לסטטוס חדשneedsRouteChoiceבפריט החיווי הרגיל, עם שתי פעולות שקולות והגדלים של כל אחת: עדכון דלתא (הורדה קטנה, החלה ארוכה של עשרות דקות ומעלה; מתאים לרשת איטית) או הורדה מלאה (הורדה גדולה, החלה קצרה).ConfirmHeavyDeltaמריץ את הדלתא;ConfirmFullDownloadעובר ל-toFullDownloadFallbackומכניס את התוכנית ל-state כדי שה-reconcile של האינדקס ירוץ. בלי DB מלא הדלתא רצה כרגיל עם הערה שההחלה עשויה להימשך זמן רב.checkForUpdateמעביר את גודלseforim.dbל-planner.onApplyProgressשל החבילה מועבר מה-isolate כרשומה מתויגת ומוצג כ-applyProgressבשלבי upserts/deletes, דרך הוויסות הקיים (200ms). עד היום "מוסיף ומעדכן רשומות" היה ספינר בלבד, גם על 3GB.StreamingPatchDownloaderמחזירpatch-*.dbקיים אחרי אימות גודל ו-sha256 (ב-isolate) במקום להוריד שוב 585MB; אי-התאמה מוחקת ומורידה. קובצי patch שאינם חלק מהתוכנית נמחקים בסיום תוכנית וגם לפני בדיקת המקום, כדי ששריד של 3GB לא ינעל משתמש על "אין מקום".LibraryUpdateDiskSpaceExceptionממופה להודעה אחת (LibraryMessages.updateDiskSpaceError) בשני המסלולים, ואינו מציע הורדה מלאה שדורשת עוד יותר מקום.למה
משתמש דיווח שהעדכון "תקוע" על "מוסיף ומעדכן רשומות" מעל חצי שעה, ושסגירה ופתיחה מחדש התחילו את ההורדה מאפס. השורש: patch v23→v27 של 585MB דחוסים / 3.05GB פרוסים (id churn במחולל, מטופל ב-Otzaria/SeforimLibrary#28), שה-planner בחר כי השווה רק גודל הורדה. ההחלה של 3GB לתוך DB של 6.4GB בטרנזקציה אחת אורכת שעה ומעלה; הורדה מלאה של 1.4GB הייתה נגמרת בדקות. עם זאת, ברשת איטית מאוד 585MB עדיפים על 1.4GB, ולכן הבחירה נשארת אצל המשתמש.
תלות וסדר מיזוג
onApplyProgress,localDbSizeBytes,heavyDeltaReason,deltaUncompressedBytes).pubspec.yamlעוקב אחריref: mainשל החבילה, ולכן ה-CI כאן אדום עד שה-PR הזה ממוזג; אחרי המיזוג יש להריץ את ה-CI מחדש.heavyDeltaReason == null⇒ זרימה זהה לקיימת.בדיקות
flutter analyze(כל הפרויקט) נקי.flutter test test/library_update/ test/widgets/work_status_overlay_test.dart test/library/view/library_update_button_test.dart— 159 עברו, 1 skip ידוע (libzstd), על Flutter 3.47.2 כמו ב-CI. בדיקות חדשות: needsRouteChoice ושני מסלולי האישור, דלתא כבדה בלי חלופה, applyProgress ב-upserts, localDbSizeBytes, שימוש חוזר + hash שגוי, בדיקת מקום (same-volume, נפרד, פרוס קיים, ניקוי לפני הבדיקה), מיפוי חוסר מקום בשני המסלולים, רינדור שתי הפעולות.החלטות שנסגרו (קומיט שני, 59a0d87)
WorkStatusKind.awaitingInputבשתי שורות ה-overlay: אין עבודה רצה, יש שאלה. טבעת ריקה משדרת "תקוע" — בדיוק התסמין של זמן עידכון הספריה #1211.verifyingעם אחוזים, וה-BLoC מאפשר ביטול בדלתא כל עוד לא התחילה כתיבה ל-DB. ביטול משאיר את הקובץ לריצה הבאה. דורש את ה-hookonVerifyProgressשנוסף ב-החלת patch עם מד התקדמות אמיתי וסימון דלתא כבדה (0.5.0) otzaria_library_updater#11 (קומיט 30bf3ff).בדיקות לקומיט השני:
flutter analyzeנקי;flutter test test/library_update/ test/widgets/work_status_overlay_test.dart— כולם עברו (151 + 1 skip ידוע). חדשות: דיווח התקדמות אימות מ-0 עד גודל הקובץ, ביטול באמצע אימות משאיר את הקובץ, פריט awaitingInput בלי טבעת ובלי 0%.