தளத்தின் வெளியீட்டுத் தளத்தில் (publishing platform) இயக்கப்பட்ட ஒரு சுத்திகரிப்பு ஸ்கிரிப்ட் (cleanup script), குறியீடு துண்டுகளை (code snippets) தவறான முறையில் அமைக்கப்பட்ட Liquid மாறிகள் என்று தவறாகக் கருதி, அவை இருந்த அனைத்துக் கட்டுரைகளிலிருந்தும் அவற்றை நீக்கிவிட்டது. இந்தத் தவறு, வாசகர்கள் நம்பிய உதாரணக் குறியீடுகள் இல்லாத நிலையில் டஜன் கணக்கான தொழில்நுட்பப் பதிவுகளை விட்டுச் சென்றது, இது அவசரமான முந்தைய நிலைக்குத் திருப்புதலை (rollback) மேற்கொள்ளவும், உள்ளடக்க இடமாற்றங்கள் (content migrations) எவ்வாறு சோதிக்கப்படுகின்றன என்பதைப் பற்றி மறுபரிசீலனை செய்யவும் தூண்டியது.

இந்த பிழை எவ்வாறு தப்பியது

இந்தத் தளம் Liquid என்ற டெம்ப்ளேட்டிங் மொழியைப் பயன்படுத்துகிறது, இது {{ … }} போன்ற டேக்குகளைக் கொண்டு இயக்கமுறை உள்ளடக்கத்தைக் குறிக்கிறது (dynamic content). வழக்கமான பராமரிப்புப் பணியின் ஒரு பகுதியாக, காட்சிப்படுத்துதலைப் (rendering) பாதிக்கும் stray tags எனப்படும் stray tags-களை நீக்க வேண்டியிருந்தது. ஸ்கிரிப்ட்டின் பாசர் (parser), பொருத்தமான மூடும் டேக் (closing tag) இல்லாத தொடக்க டேக்குகளைத் தேடியது, மேலும் ஒன்றைக் கண்டறிந்ததும், அந்தப் பிழையை "சரிசெய்ய" முழுத் தொகுதியையும் (block) நீக்கியது.

நடைமுறையில், குறியீடு தொகுப்புகளைச் (code blocks) சுற்றியுள்ள {% raw %} மற்றும் {% endraw %} டேக்குகளைப் புரிந்துகொள்வதில் பாசர் தோல்வியடைந்தது. அந்தத் டேக்குகள் உள்ளே இருக்கும் அனைத்தையும் சாதாரண உரையாக (literal text) கருதும்படி Liquid-க்குக் கூறுகின்றன, ஆனால் பிழையான ஸ்கிரிப்ட், தொடக்க {% raw %} என்பதை மூடப்படாத ஒரு மாறியாக ({{% raw %}) கருதி, அதைச் சுற்றியுள்ள குறியீட்டை நீக்கியது. பதிவு செய்யப்பட்ட பிழைச் செய்தி:

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

ஸ்கிரிப்ட் நேரடி உள்ளடக்கக் களஞ்சியத்தில் (live content repository) இயங்கியதால், இந்த நீக்கம் ஒரே நேரத்தில் பெருமளவில் நடந்தது, இது ஒரே முறையில் பாதிக்கப்பட்ட அனைத்துக் கட்டுரைகளிலிருந்தும் குறியீடு உதாரணங்களை அழித்துவிட்டது.

இதில் உள்ள ஆபத்து என்ன

கருத்துகளை விளக்கவும், முடிவுகளை மீண்டும் உருவாக்கவும் மற்றும் வாசகர்களுக்குப் படிபடியான வழிமுறைகளை வழங்கவும் தொழில்நுட்பக் கட்டுரைகள் குறியீடு துண்டுகளை (code snippets) நம்பியுள்ளன. அந்தத் தொகுப்புகளை இழப்பது பதிவுகளைப் பெரும்பாலும் பயனற்றதாக்குகிறது, ஆசிரியர்களை உள்ளடக்கத்தை மீண்டும் எழுதத் தூண்டுகிறது மற்றும் தளத்தின் நம்பகத்தன்மையில் உள்ள நம்பிக்கையைச் சிதைக்கிறது. உயர்தர டெவலப்பர் ஆவணங்களின் (developer documentation) அடிப்படையில் தனது நற்பெயரைக் கட்டியெழுப்பும் ஒரு தளத்திற்கு, இந்தச் சம்பவம் வாசகர் எண்ணிக்கையையும் பங்களிப்பாளர்களின் நன்மதிப்பையும் அச்சுறுத்துகிறது.

பெரும்பாலான வாசகர்கள் கவனிக்கத் தவறும் விவரங்கள்

  • சாண்ட்பாக்ஸிங் (sandboxing) இல்லாத தொகுதி செயலாக்கம் (Batch processing) – ஸ்கிரிப்ட் ஒரு ஸ்டேஜிங் நகலுக்குப் (staging copy) பதிலாக நேரடியாகத் தயாரிப்புத் தரவுகளில் (production data) இயக்கப்பட்டது.
  • போதுமான டேக் கையாளுதல் இல்லாமை – Liquid டேக்குகளின் ஒரு பகுதி மட்டுமே கணக்கில் கொள்ளப்பட்டது; {% raw %} என்பது வெள்ளைப்பட்டியலில் (whitelist) சேர்க்கப்படவில்லை.
  • படிப்படியான சோதனை இல்லாமை – ஒரு சிறிய மாதிரியில் முன்னோடி ஓட்டம் (pilot run) நடத்தாமல், முழுத் தரவுத் தொகுப்பிலும் இந்தப்பணி செயல்படுத்தப்பட்டது.

இதைத் தடுக்க முடிந்தவை

  • நகலில் இடமாற்றங்களை இயக்குதல் – எந்தவொரு மொத்த மாற்றத்தையும் (bulk transformation) முதலில் தரவுத்தளத்தின் சாண்ட்பாக்ஸ் செய்யப்பட்ட பதிப்பில் (sandboxed version) செயல்படுத்தவும்.
  • அனைத்து டேக் மாறுபாடுகளுக்கும் எதிராக பாசர்களை யூனிட்-டெஸ்ட் (Unit-test) செய்தல் – raw தொகுப்புகள், கருத்துத் டேக்குகள் (comment tags) மற்றும் ஒன்றினுள் ஒன்று அமைந்த கட்டமைப்புகள் (nested structures) போன்ற விளிம்பு நிலை நிகழ்வுகளை (edge cases) இதில் சேர்க்கவும்.
  • படிப்படியான வெளியீடு – குறிப்பிட்ட எண்ணிக்கையிலான கட்டுரைகளைச் செயலாக்கி, முடிவுகளைச் சரிபார்த்து, பின்னர் அளவை அதிகரிக்கவும்.

மாற்றுக்கருத்து

வேகமாக இயங்கும் தளங்களுக்கு ஒவ்வொரு ஸ்கிரிப்ட்டையும் முழுமையான பேக்கப்பில் (full backup) சோதிப்பது நடைமுறைக்குச் சாத்தியமற்றது என்றும், விரைவான தீர்வுகளுக்கானத் தேவையை விடத் தரவு இழப்பின் அபாயம் குறைவு என்றும் சிலர் வாதிடுகின்றனர். வேகம் முக்கியம் என்றாலும், ஒரு மொத்த நீக்கத்தைத் திருத்துவதற்கான செலவு – டெவலப்பர் நேரம் மற்றும் நற்பெயர் சேதம் ஆகிய இரண்டிலும் – ஒரு எச்சரிக்கையான வெளியீட்டினால் ஏற்படும் தாமதத்தை விட பெரும்பாலும் அதிகமாக இருக்கும்.

அடுத்து என்ன எதிர்பார்க்கலாம்

குழுவினர் பேக்கப்புகளில் இருந்து விடுபட்ட குறியீட்டை மீட்டெடுத்துவிட்டனர் மற்றும் அனைத்து Liquid கட்டமைப்புகளையும் அடையாளம் காண சுத்திகரிப்பு கருவியை (cleanup tool) மாற்றியமைத்து வருகின்றனர். அவர்கள் புதுப்பிக்கப்பட்ட சோதனைப் பணிப்பாய்வை (testing workflow) விவரிக்கும் ஒரு பிழை ஆய்வு அறிக்கையை (post-mortem) வெளியிடவும், மற்ற வெளியீட்டாளர்கள் இதே போன்ற சிக்கல்களைத் தவிர்க்க திருத்தப்பட்ட ஸ்கிரிப்டை பொதுப்படையாகப் பகிரவும் திட்டமிட்டுள்ளனர். இந்தச் சம்பவம் ஒரு நினைவூட்டலாக அமைகிறது: ஒரு சிறிய பாசிங் பிழை கூட (parsing error) ஆசிரியரின் வாரக்கணக்கான உழைப்பை அழித்துவிடும், எனவே கடுமையான சோதனை என்பது தவிர்க்க முடியாதது.