TLDR Неймспейсы в линуксе и Golang лучше не смешивать — by weave.works

tl;dr Если вы используете Linux API, которое влияет только на текущий OS-тред, то выйдет нежданчик когда ваша go-рутина стартанет в другом OS-треде. — by nevyn

pavel trukhanov
some-tldrs-ru
1 min readJun 30, 2017

--

Weave.works пытались написать golang-тулзу котороя по id контейнера покажет информацию о сетевом контроллере. Примерно так:

  1. Берем контейнер и находим его сетевой неймспейс
  2. Делаем setNS в него из текущей go-рутины
  3. Вызываем netlink чтобы получить инфо о сетевухе
  4. Profit!

На самом деле то, как работает рантайм golang и вот этот go netlink враппер приводит к неожиданной баге: при чтении ответа netlink, рантайм go может зашедулить вашу го-рутину в другой тред, для которого не скопирует сетевой неймспейс , хотя вы ожидали что всё будет выполнятся в этом неймспейсе.

Так вы получаете трудновоспроизводимую ошибку =/

--

--