tgoop.com/itpgchannel/2500
Last Update:
Будни #bootstrap
Я как-то писал про устройство хеша в своем cas - https://www.tgoop.com/itpgchannel/575
После https://www.tgoop.com/itpgchannel/2477 я решил, что хватит экономить на спичках, и взял в путь не 16 символов от хеша, а 22 (вот так вот странно, потому что у меня там base62) - https://github.com/pg83/ix/commit/d4c1c6cb2b0438d918715f73301848f6408531f1 https://github.com/pg83/ix/commit/8bb1e74c10b7185cda6d4092c0d6553d0fafc919
Решил и решил, но, после этого, у меня начала падать в CI сборка ya
, и nix
.
Падать с одной и той же ошибкой - E2BIG, она же https://github.com/pg83/ix/commit/d4c1c6cb2b0438d918715f73301848f6408531f1, она же "Argument list too long".
Это довольно известная ошибка, она связана с тем, как ядро запускает новый процесс (argc, argv, env передаются через стек вызвающего процесса). Ну и если стека не хватает, то получается вот такая вот хтонь.
То есть, падать стало довольно закономерно - пути стали длиннее, и перестали помещаться в размер стека.
Я про эту проблему знал, поэтому просто увеличил ulimit -s
, и стал ждать того, что мой CI добежит до конца.
Но нифига, ошибка продолжила иметь место быть. И, что самое, СУКА, интересное, если я локально запускал в shell ту же команду, что падала в CI, то, после ulimit -s unlimited
, локально все работало, а в CI - нет.
Не буду утомлять вас подробностями дебага, тем, как я запускал strace в сборочных нодах, и тем, как я думал, что ошибка в gnu make
, потому что там были манипуляции с max stack size (которые я тоже очень элегантно отключил - https://github.com/pg83/ix/blob/main/pkgs/bin/make/proper/ix.sh).
В итоге, все оказалось довольно просто - make просто брал команду, и запускал ее через /bin/sh -c "very long command".
Понимаете, да?
Я напоролся на ограничение размера одного аргумента командной строки, а не на суммарную длину всех аргументов.
Второе лечится через ulimit -s
, первое - нет.
Тут же стало понятно, почему локально "все работало".
Потому что интерактивный sh токенизировал эту очень длинную команду, и делал exec('very', 'long', 'command')
, а не exec('sh', '-c', 'very long command')
!
Для ya
я это починил очень изящно - сделал так, что переменные в команде раскрывал не make, а сам shell, для этого оказалось достаточно заменить несколько переменных из $(A)
-> $${A}
. https://github.com/pg83/ix/blob/main/pkgs/bin/ya/0/preproc.py#L3-L11
А вот nix
пока так и не починил, там все очень печально.
BY commit -m "better"
Share with your friend now:
tgoop.com/itpgchannel/2500