സൈറ്റിന്റെ പബ്ലിഷിംഗ് പ്ലാറ്റ്ഫോമിൽ പ്രവർത്തിപ്പിച്ച ഒരു ക്ലീനപ്പ് സ്ക്രിപ്റ്റ്, കോഡ് സ്നിപ്പറ്റുകളെ തെറ്റായ രീതിയിലുള്ള Liquid വേരിയബിളുകളായി തെറ്റായി തിരിച്ചറിയുകയും അവ അടങ്ങിയ എല്ലാ ലേഖനങ്ങളിൽ നിന്നും അവ നീക്കം ചെയ്യുകയും ചെയ്തു. ഈ പിശക് കാരണം വായനക്കാർ ആശ്രയിക്കുന്ന ഉദാഹരണ കോഡുകൾ ഇല്ലാതെ ഡസൻ കണക്കിന് സാങ്കേതിക പോസ്റ്റുകൾ അപ്രസക്തമായി, ഇത് അടിയന്തരമായ ഒരു റോൾബാക്കിനും കണ്ടന്റ് മൈഗ്രേഷനുകൾ എങ്ങനെ പരിശോധിക്കണം എന്നതിനെക്കുറിച്ചുള്ള പുനർചിന്തനത്തിനും കാരണമായി.
ഈ ബഗ് എങ്ങനെ സംഭവിച്ചു
{{ … }} പോലുള്ള ടാഗുകൾ ഉപയോഗിച്ച് ഡൈനാമിക് കണ്ടന്റ് അടയാളപ്പെടുത്തുന്ന ഒരു ടെംപ്ലേറ്റിംഗ് ലാംഗ്വേജായ Liquid ആണ് ഈ പ്ലാറ്റ്ഫോം ഉപയോഗിക്കുന്നത്. റെൻഡറിംഗിനെ തടസ്സപ്പെടുത്താൻ സാധ്യതയുള്ള അനാവശ്യ ടാഗുകൾ നീക്കം ചെയ്യാനാണ് ഒരു സാധാരണ മെയിന്റനൻസ് ജോബ് ലക്ഷ്യമിട്ടത്. സ്ക്രിപ്റ്റിന്റെ പാഴ്സർ, പൊരുത്തപ്പെടുന്ന ക്ലോസിംഗ് ടാഗുകൾ ഇല്ലാത്ത ഓപ്പണിംഗ് ടാഗുകൾക്കായി തിരയുകയും, അത്തരമൊന്ന് കണ്ടെത്തിയാൽ പിശക് "ശരിയാക്കുന്നതിനായി" ആ ബ്ലോക്ക് മുഴുവനായി നീക്കം ചെയ്യുകയും ചെയ്തു.
പ്രായോഗികമായി പറഞ്ഞാൽ, കോഡ് ബ്ലോക്കുകളെ പൊതിഞ്ഞുനിൽക്കുന്ന {% raw %}, {% endraw %} എന്നീ ടാഗുകളെ തിരിച്ചറിയുന്നതിൽ പാഴ്സർ പരാജയപ്പെട്ടു. ഉള്ളിലുള്ള കാര്യങ്ങളെ ലിറ്ററൽ ടെക്സ്റ്റ് ആയി പരിഗണിക്കാനാണ് ഈ ടാഗുകൾ Liquid-നോട് പറയുന്നത്, എന്നാൽ പിശകുള്ള സ്ക്രിപ്റ്റ് ഓപ്പണിംഗ് {% raw %} എന്നതിനെ ഒരു ക്ലോസ് ചെയ്യാത്ത വേരിയബിളായി ({{% raw %}) കണക്കാക്കുകയും ചുറ്റുമുള്ള കോഡ് നീക്കം ചെയ്യുകയും ചെയ്തു. രേഖപ്പെടുത്തിയ എറർ മെസ്സേജ് ഇതായിരുന്നു:
Liquid syntax error: Variable '{{% raw %}' was not properly terminated.
സ്ക്രിപ്റ്റ് ലൈവ് കണ്ടന്റ് റെപ്പോസിറ്ററിയിലാണ് പ്രവർത്തിച്ചതുകൊണ്ട്, ഈ നീക്കം ഒരുമിച്ച് നടന്നതിനാൽ ഒറ്റ പാസ്സിൽ തന്നെ ബാധിക്കപ്പെട്ട എല്ലാ ലേഖനങ്ങളിൽ നിന്നും കോഡ് ഉദാഹരണങ്ങൾ മാഞ്ഞുപോയി.
ഇതിന്റെ ആഘാതം എന്താണ്
ആശയങ്ങൾ വിശദീകരിക്കാനും ഫലങ്ങൾ ആവർത്തിക്കാനും വായനക്കാരെ ഘട്ടം ഘട്ടമായുള്ള നടപടിക്രമങ്ങളിലൂടെ നയിക്കാനും സാങ്കേതിക ലേഖനങ്ങൾ കോഡ് സ്നിപ്പറ്റുകളെ ആശ്രയിക്കുന്നു. ഈ ബ്ലോക്കുകൾ നഷ്ടപ്പെടുന്നത് പോസ്റ്റുകളെ വലിയ തോതിൽ അപ്രസക്തമാക്കുന്നു, എഴുത്തുകാരെ ഉള്ളടക്കം വീണ്ടും എഴുതാൻ നിർബന്ധിതരാക്കുന്നു, കൂടാതെ പ്ലാറ്റ്ഫോമിന്റെ വിശ്വസനീയതയിലുള്ള വിശ്വാസം തകർക്കുകയും ചെയ്യുന്നു. ഉയർന്ന നിലവാരമുള്ള ഡെവലപ്പർ ഡോക്യുമെന്റേഷനിലൂടെ പേര് നേടിയെടുത്ത ഒരു സൈറ്റിനെ സംബന്ധിച്ചിടത്തോളം, ഈ സംഭവം വായനക്കാരെയും സംഭാവന നൽകുന്നവരുടെ വിശ്വാസത്തെയും ഒരുപോലെ ബാധിക്കുന്നു.
മിക്ക വായനക്കാരും ശ്രദ്ധിക്കാതെ പോകുന്ന കാര്യങ്ങൾ
- സാൻഡ്ബോക്സിംഗ് ഇല്ലാതെ ബാച്ച് പ്രോസസ്സിംഗ് നടത്തുക – സ്ക്രിപ്റ്റ് ഒരു സ്റ്റേജിംഗ് കോപ്പിക്ക് പകരം നേരിട്ട് പ്രൊഡക്ഷൻ ഡാറ്റയിലാണ് പ്രവർത്തിപ്പിച്ചത്.
- അപര്യാപ്തമായ ടാഗ് കൈകാര്യം ചെയ്യൽ – ലിക്വിഡ് ടാഗുകളുടെ ഒരു ചെറിയ ഭാഗം മാത്രമേ പരിഗണിച്ചിരുന്നുള്ളൂ; വൈറ്റ്ലിസ്റ്റിൽ നിന്ന്
{% raw %}ഒഴിവാക്കപ്പെട്ടു. - ഇൻക്രിമെന്റൽ ടെസ്റ്റിംഗിന്റെ അഭാവം – ചെറിയൊരു സാമ്പിളിൽ പൈലറ്റ് റൺ നടത്താതെ തന്നെ മുഴുവൻ ഡാറ്റാസെറ്റിലും ഈ ജോലി നടപ്പിലാക്കി.
ഇത് എങ്ങനെ തടയാമായിരുന്നു
- ഒരു കോപ്പിയിൽ മൈഗ്രേഷനുകൾ നടത്തുക – ഏത് ബൾക്ക് ട്രാൻസ്ഫോർമേഷനും ആദ്യം ഡാറ്റാബേസിന്റെ ഒരു സാൻഡ്ബോക്സ് വേർഷനിൽ പ്രയോഗിക്കുക.
- എല്ലാ ടാഗ് വേരിയേഷനുകൾക്കെതിരെയും പാഴ്സറുകളെ യൂണിറ്റ് ടെസ്റ്റ് ചെയ്യുക – റോ ബ്ലോക്കുകൾ, കമന്റ് ടാഗുകൾ, നെസ്റ്റഡ് സ്ട്രക്ചറുകൾ തുടങ്ങിയ എഡ്ജ് കേസുകൾ ഇതിൽ ഉൾപ്പെടുത്തുക.
- ഘട്ടം ഘട്ടമായുള്ള അവതരണം (Gradual rollout) – പരിമിതമായ എണ്ണം ലേഖനങ്ങൾ മാത്രം പ്രോസസ്സ് ചെയ്യുക, ഫലങ്ങൾ പരിശോധിക്കുക, തുടർന്ന് വ്യാപിപ്പിക്കുക.
വിപരീത വാദം
വേഗത്തിൽ മാറിക്കൊണ്ടിരിക്കുന്ന സൈറ്റുകളിൽ ഓരോ സ്ക്രിപ്റ്റും ഫുൾ ബാക്കപ്പിൽ ടെസ്റ്റ് ചെയ്യുന്നത് പ്രായോഗികമല്ലെന്നും, ഡാറ്റ നഷ്ടപ്പെടാനുള്ള സാധ്യതയേക്കാൾ വേഗത്തിലുള്ള പരിഹാരങ്ങൾ ആവശ്യമാണെന്നും ചിലർ വാദിക്കുന്നു. വേഗത പ്രധാനമാണെങ്കിലും, ഒരു കൂട്ടമായ ഡിലീഷൻ തിരുത്തുന്നതിനുള്ള ചിലവ് – ഡെവലപ്പർമാരുടെ സമയവും പ്ലാറ്റ്ഫോമിന് സംഭവിക്കുന്ന നാശനഷ്ടങ്ങളും കണക്കിലെടുക്കുമ്പോൾ – ജാഗ്രതയോടെയുള്ള ഒരു റോളൗട്ട് മൂലമുണ്ടാകുന്ന കാലതാമസത്തേക്കാൾ കൂടുതലായിരിക്കും.
ഇനി ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ
ടീം ബാക്കപ്പുകളിൽ നിന്ന് നഷ്ടപ്പെട്ട കോഡ് വീണ്ടെടുക്കുകയും എല്ലാ ലിക്വിഡ് കൺസ്ട്രക്റ്റുകളെയും തിരിച്ചറിയുന്നതിനായി ക്ലീനപ്പ് ടൂൾ പരിഷ്കരിക്കുകയും ചെയ്തിട്ടുണ്ട്. പുതുക്കിയ ടെസ്റ്റിംഗ് വർക്ക്ഫ്ലോ വിശദീകരിച്ചുകൊണ്ടുള്ള ഒരു പോസ്റ്റ്-മോർട്ടം പ്രസിദ്ധീകരിക്കാനും, മറ്റ് പബ്ലിഷർമാർക്ക് ഇതേ പിശക് ഒഴിവാക്കാൻ പരിഷ്കരിച്ച സ്ക്രിപ്റ്റ് പരസ്യമായി പങ്കുവെക്കാനും അവർ പദ്ധതിയിടുന്നു. ഈ സംഭവം ഒരു ഓർമ്മപ്പെടുത്തലാണ്: ഒരു ചെറിയ പാഴ്സിംഗ് പിശക് പോലും എഴുത്തുകാരുടെ ആഴ്ചകളോളം നീണ്ട പരിശ്രമത്തെ ഇല്ലാതാക്കാം, അതിനാൽ കർശനമായ പരിശോധനകൾ അനിവാര്യമാണ്.
