otzaria icon indicating copy to clipboard operation
otzaria copied to clipboard

באג בקריסה באמצע סנכרון

Open YOSEFTT opened this issue 9 months ago • 2 comments

Describe the bug | תיאור הבאג

בסנכרון ספרים, אם יש תקלה באמצע הסנכרון, והתוכנה נכבית באמצע, אח"כ בסנכרון חדש הכל מתחיל מההתחלה לסנכרן את כל הספריי' כולה.

Steps to reproduce | צעדים לשחזור

קורה מתי שמכבים את התוכנה באמצע סנכרון, או כשנגמר הבטריי' באמצע, או יש פתאום הפסקת חשמל, או מסך המוות של ווינדוס.

Expected behavior | התנהגות צפוייה

לדעתי זה קורה בגלל שהסנכרון בכל עדכון כותב ממש מחדש מההתחלה את קובץ המניפסט, files_manifest.json, ולכן כשהוא נדפק באמצע אז הקובץ פגום. מצופה שהסנכרון לא ישנה את הקובץ הזה כלל, אלא ייצור קובץ נוסף בכל סנכרון, או קובץ זמני בזכרון, או קובץ ממשי בתיקיית אוצריא, ואחרי שנגמר כל סנכרון של כל ספר אז הוא יכניס את תוכן הקובץ לתוך קובץ המניפסט ובקיצור, שהוא עצמו לא ישתנה רק בסיום הסנכרון או עכ"פ כל שינוי יכנס אליו אחרי שנכתב בקובץ אחר, כך גם בקריסה הוא לא יפגם.

Environment | סביבה

גירסת מפתחים אחרונה. נראה לי שזה תמיד הי' כך.

@dosu מה אתה אומר על מה שכתבתי? נראה לך שאני צודק בסיבת התופעה? אתה חושב שהפתרון שלי יעיל? א"כ, איך לבצע אותו? אולי יש לך פתרונות יותר טובים?

YOSEFTT avatar Feb 28 '25 09:02 YOSEFTT

שלום @YOSEFTT! אני פה כדי לעזור עם הבאג שלך. אני בוט שיכול לעזור לך לפתור באגים, לענות על שאלות ולשדרג את הקוד. אני פה גם כדי לעזור כשאתה ממתין לתמיכה אנושית.

הפתרון שהצעת בהחלט יעיל ויכול למנוע את הבעיה של קובץ files_manifest.json שנפגם במהלך הפסקת סנכרון. השימוש בקובץ זמני או בקובץ מניפסט נפרד הוא גישה נפוצה לשמירה על שלמות הנתונים במהלך פעולות קבצים. הנה איך תוכל ליישם את זה:

  1. שימוש בקובץ זמני: כתוב את המניפסט המעודכן לקובץ זמני תחילה. לאחר שהכתיבה הושלמה בהצלחה, שנה את שם הקובץ הזמני ל-files_manifest.json. זה מבטיח שהמניפסט המקורי לא יוחלף עד שהמניפסט החדש נכתב במלואו.

  2. קובץ מניפסט נפרד: שמור קובץ מניפסט נפרד במהלך תהליך הסנכרון והחלף את קובץ המניפסט הראשי רק לאחר שהסנכרון הושלם.

הנה דוגמה לקוד שממחיש את השימוש בקובץ זמני:

Future<void> _updateLocalManifestForFile(
    String filePath, Map<String, dynamic> fileInfo) async {
  try {
    final manifestFile = File(await _localManifestPath);
    final tempManifestFile = File('${manifestFile.path}.tmp');
    Map<String, dynamic> localManifest = await _getLocalManifest();

    // עדכן את המניפסט עבור הקובץ הספציפי הזה
    localManifest[filePath] = fileInfo;

    // כתוב את המניפסט המעודכן לקובץ זמני
    await tempManifestFile.writeAsString(
      json.encode(localManifest),
      encoding: utf8,
    );

    // שנה את שם הקובץ הזמני לקובץ המניפסט המקורי
    await tempManifestFile.rename(manifestFile.path);
  } catch (e) {
    print('Error updating local manifest for file $filePath: $e');
  }
}

שיטה זו מבטיחה שקובץ files_manifest.json יוחלף רק לאחר שהנתונים החדשים נכתבו בבטחה, מה שמפחית את הסיכון לפגיעה במהלך הפסקות [1].

To continue talking to Dosu, mention @dosu.


Help Dosu learn! Give it feedback: Great Response | Irrelevant Answer | Incorrect Sources | Too Verbose | Hallucination | Bug Report | Other

dosubot[bot] avatar Feb 28 '25 09:02 dosubot[bot]

סוף סוף אני מבין למה זה קורה...

Y-PLONI avatar Feb 28 '25 13:02 Y-PLONI

אני חושב שתוקן אפשר לסגור?

IEUDI2 avatar Jul 23 '25 17:07 IEUDI2