Tailscale-ը հայտնաբերել է SQLite-ի 16-ամյա WAL-Reset սխալը
Վեց ամսում տվյալների բազայի վնասման 19 դեպքից հետո Tailscale-ը և SQLite-ի ծրագրավորողները գտել են հազվադեպ data race, որը թաքնված էր շարժիչում առնվազն 16 տարի։
Վեց ամսվա ընթացքում Tailscale-ի կառավարման հարթությունը տվյալների բազայի վնասման 19 առանձին դեպք է գրանցել, որոնք բոլորը պայմանավորված էին SQLite-ի խորքում թաքնված մեկ սխալով։ Ընկերության մանրամասն բլոգ-գրառման համաձայն՝ տվյալների բազայի հիմնական ծրագրավորողների հետ միասին իրենք գտել և ուղղել են «WAL-Reset» սխալը՝ հազվադեպ data race, որը, ըստ գնահատականների, SQLite-ում գոյություն է ունեցել առնվազն 16 տարի։
Մեկ գրողով շարդեր և ագրեսիվ checkpoint-ներ
Tailscale-ի կառավարման հարթությունը բաժանված է կոորդինացիոն շարդերի, որոնցից յուրաքանչյուրն ունի իր SQLite բազան՝ հասանելի միայն մեկ Go պրոցեսի համար՝ հենց այն ձևավորումը, որի համար ստեղծված է SQLite-ը։ Ընկերությունը SQLite-ը որպես հիմնական բազա օգտագործում է 2022 թվականից. ամեն մի քանի րոպեն մեկ արվում է ամբողջական snapshot և վերբեռնվում S3։
Անցյալ տարվա օգոստոսին այդ պահուստային պատճեները կարդացող pipeline-ը սխալ է գրանցել, և PRAGMA integrity_check-ը հաստատել է ֆայլի վնասումը։ Դեպքը կրկնվել է՝ ընդհանուր 19 անգամ վեց ամսում։ Ամեն անգամ շարդի կառավարման հարթությունը դադարեցվել է՝ սկզբում մեկ ժամից ավելի, ինչի պատճառով նոր միացող սարքերը չէին կարողանում միանալ, իսկ ադմինիստրացիայի վահանակն ու API-ն անհասանելի էին։
Սխալ, որը չհաջողվեց վերարտադրել
Վնասումը չէր կապվում ոչ մի կոնկրետ շարդի, հաճախորդի, ֆունկցիայի կամ բեռնվածության մակարդակի հետ, և այն հնարավոր չէր վերարտադրել։ Tailscale-ը պրոֆեսիոնալ աջակցության պայմանագիր է կնքել SQLite-ի ծրագրավորողների հետ և արտադրական միջավայրում տեղադրել ֆորենզիկ հեռաչափություն։ Տրանզակցիաների լոգավորման pipeline-ը, որը վերարտադրում է յուրաքանչյուր փոփոխող SQL հրահանգ լավ պահուստային պատճենի վրա, տվեց առաջին իրական հուշումը. երկու դեպքում մեկ տրանզակցիայի գրած ու հաստատած տվյալները անտեսանելի էին հետագա տրանզակցիաների համար։
WAL-Reset սխալը
SQLite-ի թիմը ստեղծել է tmstmpvfs-ը՝ վիրտուալ ֆայլային համակարգի շերտի շուրջ փաթաթան՝ checkpoint-ները հետևելու համար։ Լոգերը բացահայտել են հազվադեպ data race checkpoint-ի և գրող տրանզակցիայի միջև. checkpoint-ը կարծում է, որ էջերը WAL-ից պատճենվել են հիմնական բազայի ֆայլում, սակայն իրականում դա տեղի չի ունեցել՝ տվյալները ընդմիշտ կորչում են, և ինդեքսները ցույց են տալիս գոյություն չունեցող էջերի։ Ուղղումը թողարկվել է SQLite 3.51.3-ով և ավելացնում է ստուգում, որը հայտնաբերում է, երբ WAL-ը վերականգնվել է այլ թելի կողմից։
Առաջին փորձը՝ 3.52.0-ը, ստիպված են եղել հետ կանչել, քանի որ այն կեղծ վնասման ահազանգեր է առաջացրել Tailscale-ի 13 բազաներում՝ հին expression ինդեքսների հետ կապված խնդրի պատճառով։ Tailscale-ը ժամանշանների ճշգրտությունը նվազեցրել է մինչև ամբողջ վայրկյաններ, իսկ SQLite-ը հետագայում ավելացրել է ինքնավերականգնվող ինդեքսների ֆունկցիա։ Երկու ամիս սպասելուց հետո ախտորոշիչ ահազանգը վերջապես աշխատել է և ապացուցել, որ այդ մրցավազքը տեղի է ունենում նաև արտադրությունում։ Այդ պահից չորս ամիս անց որևէ միջադեպ չի գրանցվել։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։