Неизбежность нодокалипсиса

от автора

Каждый объект в OpenStreetMap имеет уникальный номер. Базовый элемент карт — точка, из них состоит всё, и их очень много. 9 февраля идентификаторы точек превысили 2³¹−1: максимальное число, помещающееся в 32-битный int со знаком. О надвигающейся проблеме предупредили за полтора года, и все более-менее популярные программы успели перейти на long. Та суббота прошла без приключений.

На самом деле, нет.

Все знают, что через 25 лет метки времени тоже перестанут влезать в int, но никто не беспокоится: времени исправить более чем достаточно. Точно так же мы подумали про свои инструменты в мае 2011 года, когда Фредерик Рамм впервые поднял этот вопрос. Идентификаторы точек стремительно росли, и график как бы намекал. В osm2pgsql (главной программе для загрузки данных в PostgreSQL) ввели переключатель для 64-битного режима, затем начали обсуждать, нельзя ли как-нибудь перенумеровать узлы или обойтись unsigned int, оттуда разговор перешёл на необходимость отрицательных идентификаторов и сдулся.

Сменился год, количество участников OpenStreetMap приближалось к миллиону, французы вовсю импортировали из кадастра контуры сараев о полусотне вершин каждый, немцы разрабатывали схемы тегирования для поребриков, канализационных люков и дорожной разметки. Среди мапперов распространились смартфоны и планшеты, и для них написали удобные редакторы. Исследования сообщали о неудержимом росте OSM и о поразительном качестве данных. Microsoft пополнял массив спутниковых снимков Bing, и тысячи энтузиастов дни напролёт их обклацывали. Подошёл декабрь 2012 года.

«Ещё 62 миллиона точек — и ваши программы могут сломаться», — напомнил Фредерик, — «Я загрузил в SVN несколько файлов с большими идентификаторами, чтобы вам было проще проверить свои инструменты». Есть ли смысл предупреждать людей за пять дней до Нового года, через неделю после «апокалипсиса»? Не до того, участникам приятнее другие разговоры: о новом js-редакторе и рейтинге по количеству нарисованных домов.

Наступил февраль, Пол Норман заметил в рассылке, что уже без пяти миллионов 2³¹. Пользователи добавляют примерно по миллиону точек в день — считайте сами. Дряхлая программа для подготовки шейпов береговых линий не переживёт этого потрясения, но ей есть замена. PHP-скрипты могут сломаться, поскольку 64-битные числа распознаются только на 64-битных ОС. Вроде, ничего серьёзного: вики-страничка со списком требуемых версий программ росла, но из заметного — только требование дополнительного ключа для популярного Osmosis, программы для фильтрации и преобразования данных OSM.

Участники возбуждённо следили за обратным отсчётом, в другом окне загружая свеженарисованные домики и леса.

Первым зрителей порадовал сайт отсчёта: конечно же, написанный на PHP и запущенный в 32 битах. Сапожник без сапог. Через несколько часов Тоби Мюррей захотел добавить на карту прокат машин, и редактор для андроида Vespucci вылетел. Затем японец запустил iOS-редактор POI+, чтобы отметить фаст-фуд в Нагое, но вместо создания новой точки тот воспользовался уже нарисованной с номером 2³¹−1, которая принадлежала контуру дома на юге Германии. Дом стал выглядеть примерно так:

Затем появились озадаченные пользователи Osmosis. Не важно, что об обязательном ключе предупредили на форуме, в новостном блоге, в чатике, в рассылке и в вики. Снова и снова пришлось объяснять, что дописать в командную строку, — и на форуме, и в чатике. И в новостном блоге во второй раз. Помогло не сразу: поскольку Osmosis используется для региональных выгрузок, последние не обновлялись несколько дней. А вместе с ними застыли экспорт в навигаторы и валидация.

Наконец, очередной дамп планеты удивил всех своим размером: вместо 26 гигабайт — 80 байт. Небольшой скрипт на С++ для подготовки самого важного в проекте файла хранил идентификаторы в поле типа int.

Всю прошлую неделю сервисы понемногу выправлялись. Обработчик береговой линии починили, и попутно обновили саму линию (она обрабатывается отдельно от остальной карты, поскольку это один 300-мегабайтный мультиполигон; обновление запускают раз в пару месяцев). Выпустили новый Osmosis, куда помимо исправления бага вошёл новый мощный обработчик тегов. Авторы Vespucci и POI+ починили проблемы с идентификаторами почти сразу, но в мобильной среде всё непросто: Google Play и AppStore выложили исправленные версии лишь 16 февраля. Планету собрали, пусть и с третьего раза. Отсчёт перестал быть обратным.

В отличие от истории с 25-летними cookies, «нодокалипсис» был предсказан, про него напомнили за два месяца и за несколько дней. Все описанные программы — с открытым исходным кодом, проверить тип переменной, в которой хранится номер точки, мог любой. Тем не менее, даже инструменты, которыми пользуются тысячи человек, были исправлены лишь когда полезли ошибки.

Выводов два. Не игнорируйте предупреждения, в том числе свои. И, как месяц назад посоветовал блогер из PJ Online, если ровно через 25 лет семь утра вас застанет за рулём — сверните на обочину, постойте минут двадцать. Так, на всякий случай.

ссылка на оригинал статьи http://habrahabr.ru/post/169993/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *