לדלג לתוכן

פתרון הגירה שנקטעת

לפני החלפת manifest הדור הישן נשאר הבחירה הפעילה, גם אם דור חדש שלם כבר נכתב. אחרי rename אך לפני sync של התיקייה, recovery חייב להיות מוכן לראות את הבחירה הישנה או החדשה בהתאם לחוזה האחסון. הוא יאמת את הדור שנבחר ולא יבחר אוטומטית את הקובץ בעל המספר הגבוה ביותר.

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

fn generation_name(text: &str) -> Result<&str, &'static str> {
    let name = text.strip_suffix('\n').ok_or("missing terminator")?;
    if name.is_empty() || name.len() > 80 ||
        !name.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-') {
        return Err("invalid generation name");
    }
    Ok(name)
}

האלפבית המוגבל דוחה גם נתיבים וגם שורות נוספות בלי צורך לנרמל אותם. בתיקייה שאינה מהימנה עדיין נדרש טיפול ב־symlinks ובמרוצי פתיחה באמצעות dirfd וכללי resolution מתאימים; בדיקת מחרוזת לבדה אינה גבול אבטחה.

המדיניות הפשוטה והכנה עבור עשר כתיבות חדשות היא חסימת downgrade שאינו יודע לייצג אותן. אם בוחרים restore, נרשום את נקודת הגיבוי ואת מספר הפעולות שיאבדו ונבקש החלטת מפעיל לפי חוזה המוצר. מבחן הקבלה צריך להוכיח שאף startup אינו קורא חצי schema ואינו מסמן דור פגום כתקין רק משום ששמו נראה חדש.