Чого насправді торкається видалення лічильника
У цій статті
Видалення лічильника тут очищає 33 таблиці. Учора очищало 25.
Ті вісім, які воно оминало, були створені напередодні — між 11:10 ранку та 15:10 дня.
Як працює видалення
Власник може видалити свій лічильник. Потрібні POST, власницький токен і номер лічильника, набраний вручну, бо назад дороги немає. Нічого не відкладається вбік: тіньова копія була б протилежністю прохання, а посилання на вивантаження стоять над кнопкою для всіх, кому вона потрібна.
Потім список таблиць очищається в одній транзакції, головна таблиця останньою, а в архів лягає надгробок, щоб номер ніколи не дістався комусь іншому. Якщо якась частина зривається, відкочується все. Нічого не видалено краще, ніж видалено наполовину.
Над цим списком, у файлі, написано:
«Кожна таблиця, яка щось знає про цей лічильник. Списком, а не врозсип по коду: чого тут бракує, залишиться осиротілим рядком, і ніхто цього не помітить.»
Примітка описала прогалину за день до її появи
Учора з'явилося шість нових таблиць для нової можливості — час на сторінці, глибина прокручування, сторінки виходу — і ще дві. Між 11:10 і 15:10.
Список видалення правили того самого дня, щоб вписати іншу нову таблицю. Вісім прийшли після, і список більше не ворухнувся. Отже, протягом одного вечора видалення лічильника лишало по собі 4 840 рядків поведінкових даних у восьми таблицях. Прогалину знайшли наступного дня і закрили; вона показала, що списку потрібне щось інше, ніж пам’ять, аби лишатися повним.
Це не розповідь про недбалість. Хтось написав цей список, точно зрозумів, чому він список, записав, що буває, коли він відстає, — і того самого дня доповнив його однією таблицею. І список усе одно відстав, бо тримати дві речі в ногу, пам'ятаючи про це, — те, що люди роблять надійно рівно до того дня, коли не роблять.
Виправлення, і друге виправлення
Вісім імен тепер у списку. Їх вставили на абеткові місця, а не дописали в кінець, бо впорядкований список робить прогалину видимою, а список-із-дописками ні.
Це мале виправлення. Те, що важить, — сценарій, який питає базу, які таблиці несуть номер лічильника, читає список із вихідного файлу, а не повторює його, і порівнює одне з одним. Хто заводить таблицю, запускає його один раз. Його не можна забути так, як забувають список, бо він нічого не зберігає — він щоразу виводить відповідь зі схеми.
На першому прогоні він знайшов ще дещо: 25 рядків у восьми інших таблицях, чий номер лічильника не стоїть ані в живій таблиці, ані в архіві. Не видалені лічильники — ті лишають надгробок. Номери, що не належать нічому; більшість — очевидні тестові номери з часу до перевірки архіву. Їх записали у файл поза веб-каталогом і потім прибрали.
До чого це узагальнюється
Будь-який список, який треба тримати в ногу з чимось іншим, рано чи пізно з ноги вийде, і прогалина буде невидимою, бо список, у якому бракує запису, виглядає рівно як повний.
Захист — не дисципліна. Він у тому, щоб виводити один бік з іншого й перевіряти, що вони збігаються, — і запускати цю перевірку тієї миті, коли хтось додає річ, а не тієї, коли хтось замислюється.
Коментар над списком мав рацію в усьому, крім одного слова. Він сказав: ніхто не помітить. Хтось помітив, днем пізніше, бо пішов дивитися сценарієм, а не пам'яттю.