סקריפט ניקוי שהופעל בפלטפורמת הפרסום של האתר זיהה בטעות קטעי קוד כמשתני Liquid לא תקינים והסיר אותם מכל מאמר שכלל אותם. התקלה השאירה עשרות פוסטים טכניים ללא קוד הדוגמה שעליו מסתמכים הקוראים, מה שהוביל לביצוע rollback דחוף ולחשיבה מחדש על האופן שבו נבדקים תהליכי הגירת תוכן (content migrations).

איך הבאג חמק

הפלטפורמה משתמשת ב-Liquid, שפת תבניות (templating language) המסמנת תוכן דינמי באמצעות תגיות כמו {{ … }}. משימת תחזוקה שגרתית הייתה אמורה לנקות תגיות תועות שעלולות לשבש את הרינדור. ה-parser של הסקריפט חיפש תגיות פתיחה שחסרה להן תגית סגירה תואמת, וכאשר הוא מצא כזו, הוא מחק את הבלוק כולו כדי "לתקן" את השגיאה.

בפועל, ה-parser נכשל בזיהוי התגיות {% raw %} ו-{% endraw %} שעוטפות בלוקים של קוד. התגיות הללו מנחות את Liquid להתייחס לכל מה שבתוכן כטקסט רגיל (literal text), אך הסקריפט הפגום התייחס לתגית הפתיחה {% raw %} כמשתנה שלא נסגר ({{% raw %}) והסיר את הקוד שמסביב. הודעת השגיאה שנרשמה הייתה:

Liquid syntax error: Variable '{{% raw %}' was not properly terminated.

מכיוון שהסקריפט פעל על מאגר התוכן החי (live content repository), ההסרה התבצעה בהמוניה, וניקתה את דוגמאות הקוד מכל המאמרים המושפעים במעבר אחד.

מה עומד על הפרק

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

הפרטים שרוב הקוראים מפספסים

  • עיבוד אצווה (Batch processing) ללא sandboxing – הסקריפט הורץ ישירות על נתוני production במקום על עותק של סביבת staging.
  • טיפול לא מספק בתגיות – רק תת-קבוצה של תגיות Liquid נלקחה בחשבון; {% raw %} הושמטה מרשימת ה-whitelist.
  • חוסר בבדיקות הדרגתיות – המשימה הופעלה על כל מערך הנתונים ללא הרצה ניסיונית (pilot run) על מדגם קטן.

מה היה יכול למנוע זאת

  • הרץ הגירות על עותק – החל כל שינוי המוני (bulk transformation) תחילה על גרסה מבודדת (sandboxed) של מסד הנתונים.
  • בצע unit-test ל-parsers מול כל וריאציות התגיות – כלול מקרי קצה כמו בלוקי raw, תגיות הערה ומבנים מקוננים.
  • פריסה הדרגתית – עבד על מספר מוגבל של מאמרים, וודא את התוצאות, ואז הגדל את ההיקף.

נקודת מבט נגדית

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

מה לצפות בהמשך

הצוות שחזר את הקוד החסר מגיבויים ועובד על עדכון כלי הניקוי כך שיזהה את כל מבני ה-Liquid. הם מתכננים לפרסם post-mortem המפרט את תהליך הבדיקה המעודכן, ולשתף את הסקריפט המתוקן בפומבי כדי שמוציאים לאור אחרים יוכלו להימנע מאותה מלכודת. האירוע משמש כתזכורת: אפילו שגיאת parsing קטנה ביותר יכולה למחוק שבועות של עבודה של כותבים, מה שהופך בדיקות קפדניות לדבר שאינו ניתן למשא ומתן.