Katkestuse kirje saabub pärast seda, kui teine ühendus sama nime all on juba alanud, ja käsitleja, mis uuendab selle kasutaja uusimat rida, sulgeb vale sessiooni. Viga ei ole ajatemplite võrdlemises. See on eelduses, et nimi pluss terve sekund identifitseerivad ühe sessiooni. Haagisündmused kirjeldavad ühendusi ja ühendus vajab võtit, mis kuulub ainult talle.

Alustage sellest, mida katkestusmuutujad tegelikult tähendavad. Alles siis on identifikaatori valik mõttekas.

Mida katkestushaak tegelikult kannab

Community OpenVPN 2.6-s määratleb haagi viide time_unix hetke, mil klient ühendus; see määratakse enne ühendushaagi käivitumist ja seda ei määratleta uuesti, kui katkestushaak hiljem käivitub. time_duration annab selle sessiooni pikkuse sekundites, seega lõpp on ligikaudu ühendamisaeg pluss kestus. Mõlemad on terved sekundid ja kumbki ei ole hetk, mil teie andmebaas sündmuse töötles. Nende kolme aja lahus hoidmine on see, mis paneb korrelatsiooni pidama, selle asemel et see ainult testimise ajal õige välja näeks.

See aritmeetika väärib kirjapanekut, sest see on ainus lõppaeg, mida haak ise pakub. Töötlemise viivitus ja hostidevahelised kellaerinevused jäävad sellest endiselt välja.

Miks ilmne paar pole unikaalne

Nime sidumine ühendamisajaga kitsendab otsingut ja ei identifitseeri ikkagi sessiooni. Klient võib samas sekundis uuesti ühenduda, nii et kaks sessiooni võivad mõlemat väärtust jagada. Kaks deemoninstantsi või serveri asendamine, mis säilitab sama konfiguratsiooni, võivad selle paari erinevatest protsessidest tekitada. Tunnelite aadressid ringlussevõetakse samal põhjusel, mis teeb neist sessiooni atribuudid, mitte identifikaatorid selle jaoks.

Tõrkerežiim on vaikne. Esimese sessiooni hilinenud katkestus sobib uusima reaga ja lõpetab eraldise, mida teine sessioon veel kasutab, nii et kasutaja kogeb juhuslikku juurdepääsu kaotust, mida ta millegagi ei põhjustanud. Ridade arv, mis pärast seda õige välja näeb, teeb probleemi raskemini märgatavaks.

Kust tuleb stabiilne identiteet

Haldusliides omistab igale kliendile kliendiinstantsi identifikaatori ja see identifikaator on piiratud deemoninstantsiga, mis selle väljastas. Toimiv väline võti ühendab stabiilse serveri identifikaatori, epohhi, mis muutub deemonit käivitades, ja selle kliendi-ID. Epohh on oluline, sest identifikaatorid taaskäivituvad koos protsessiga ja paljas protsessi-ID võib hiljem sattuda millegi mitteseotud poolt uuesti kasutusse.

Lapse ühendusskripti sees seatud keskkonnamuutujad ei liigu vanemdeemoni hilisemasse katkestusskripti, sest need skriptid töötavad eraldi protsessidena oma keskkondadega. Seega on UUID genereerimine ühendamise ajal pool lahendust. Katkestuse pool peab suutma sama UUID-d nimetada, mis tähendab, et identiteet peab elama kuskil, kuhu mõlemad sündmused jõuavad.

Tee lõpetamine tingimuslikuks ja idempotentseks

Lõpetage sessiooni omaniku järgi, mitte kasutaja järgi. Käsitleja, mis kustutab ükskõik millise eraldise, mis parasjagu mõnele nimele kuulub, kustutab lõpuks vale, ja ainus kaitse on kontrollida, et eemaldatav kirje on kirje, mida see sündmus kirjeldab.

Haldusliides võtab vastu ühe ühendatud halduskliendi korraga, seega integreeruge sellega, kes seda juba omab, selle asemel et kinnitada teine vaatleja, mis samale soklile konkureerib.

Käsitlege korduvaid sündmusi ilma tulemust kaks korda muutmata ja hoidke sidumata sündmused lepitamiseks alles, selle asemel et need ära visata. Katkestuse tagasikutsel on dokumenteeritud elutsükli tingimused ja see ei pruugi pärast krahhi või kõva seiskamist kunagi saabuda, seega vajab disain viisi, kuidas esitada sessiooni, mille lõpusündmus puudub.

Testige ebamugavaid juhtumeid meelega: kaks taasühendumist ühe sekundi jooksul, kaks deemoninstantsi, ühendus, mille töötlemine ebaõnnestus, ja deemoni taaskäivitamine keset sessiooni. Võti, mis peab vastu kõigile neljale, on usaldamist väärt võti.

Seotud artiklid