Как предотвратить ошибки сегментации параллельных заданий в Базеле? - PullRequest
0 голосов
/ 28 апреля 2020

Я написал правило для запуска некоторого компилятора (Synopsys VCS MX). При запуске одной цели все отлично работает. При одновременном запуске нескольких целей компилятор сталкивается с ошибкой сегментации. Этого не происходит при запуске Bazel с --spawn_strategy=local. Также работает настройка --jobs 1.

Единственная причина, по которой я могу думать, это то, что компилятор пытается записать в файл с абсолютным путем, сталкиваясь с другими его экземплярами.

У меня следующие вопросы:

  1. Если бы моя теория была правильной, не возникла бы проблема независимо от погоды, в которой я играю в песочнице, или нет?
  2. Если я ошибаюсь Как могли компиляторы конфликтовать, если бы не какой-то общий файл?
  3. Скажите, что для каждой песочницы я хотел смонтировать /tmp, который указывает на другой каталог, это было бы возможно?

Обновление : Согласно тому, что я видел в strace, оба экземпляра компилятора открывают файл /tmp/vcs_20200428163636_3/v710_tok для чтения и записи, и в какой-то момент вызывает один экземпляр pread64() который вызывает segfault. Обратите внимание на имя файла, которое выглядит подозрительно как дата, намекающая на то, что была предпринята попытка получить уникальное имя файла, но оба экземпляра не были выполнены достаточно далеко друг от друга.

Вопрос 1 и 3 все еще стоят.

1 Ответ

0 голосов
/ 29 апреля 2020

Решение:

При добавлении --sandbox_tmpfs_path=/tmp проблема была решена. Это говорит Bazel, что при создании песочницы для действия она должна смонтировать пустой каталог с возможностью записи, смонтированный по пути /tmp. Таким образом, у каждого компилятора есть свои /tmp, и они не сталкиваются.

Почему столкновение происходит только при песочнице?

При выполнении run_shell в песочнице Bazel выполнит оболочку, используя clone , что приведет к ее запуску в новом пространстве имен PID . PID компилятора (в данном случае 3, как видно из /tmp/vcs_20200428163636_3/v710_tok) добавляется к файлу, открытому в /tmp, в попытке сделать имя файла уникальным. Однако, поскольку оба компилятора разветвляются в своих отдельных пространствах имен PID песочницы, они оба видят свой PID относительно своей песочницы, что позволяет им конфликтовать.

...