Bug 50981

Summary: Метод http пытается создавать файлы неоправданно длинными именами
Product: Sisyphus Reporter: Ivan A. Melnikov <iv>
Component: aptAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: boyarsh, glebfm, imz, ldv, placeholder
Version: unstable   
Hardware: all   
OS: Linux   

Description Ivan A. Melnikov 2024-07-24 18:44:39 MSK
В процессе работы над специфичными для loongarch64 модулями ядра поймал такую вот ошибку:

Err http://[...] 22662/build/repo/loongarch64/task kernel-modules-la_ow_syscall-loongarch#1:0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port:sisyphus_loongarch64+22662.200.1.1@1721832509 1:0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port:sisyphus_loongarch64+22662.200.1.1@1721832509
  Could not open file /var/cache/apt/archives/partial/kernel-modules-la%5fow%5fsyscall-loongarch#1%3a0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port%3asisyphus%5floongarch64+22662.200.1.1@1721832509_1%3a0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port%3asisyphus%5floongarch64+22662.200.1.1@1721832509_loongarch64.rpm - open (36 File name too long)
Failed to fetch http://[...]/loongarch64/tasks/22662/build/repo/loongarch64/RPMS.task/kernel-modules-la_ow_syscall-loongarch-0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port.loongarch64.rpm  Could not open file /var/cache/apt/archives/partial/kernel-modules-la%5fow%5fsyscall-loongarch#1%3a0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port%3asisyphus%5floongarch64+22662.200.1.1@1721832509_1%3a0.1.0-alt0.port.395520.0.4.0.g5aec712dc5f3.0.port%3asisyphus%5floongarch64+22662.200.1.1@1721832509_loongarch64.rpm - open (36 File name too long)

Действительно, у модуля для пре-релизного ядра получился релиз из 43 символов (это не я, это kernel-build-tools), поэтому имя файла полчилось длиной в 266 символов, что больше, чем ограничения ext4 (255).

Да, я могу, например обновить ядро, и при этом сделать ему релиз покороче. Но даже в этом случае мы оказываемся опасно близко к лимиту.

Поэтому предлагаю подумать, насколько оправдано дважды повторять версию, релиз, дисттаг и время сборки в имени файла.
Comment 1 Ivan Zakharyaschev 2024-07-25 05:20:47 MSK
Они два раза повторяются для пакетов, подпадающих под Allow-Duplicates. Уникальная версия становится частью имени для таких пакетов (это можно увидеть дополняя аргумент команды install в apt-shell и т.п.), а дальше версия по общей схеме.

Получается, можно подумать о том, чтобы при скачивании пакетов из Allow-Duplicates, не повторять эту информацию в имени файла. (И теоретически для сокращения имени файла можно в качестве него использовать какой-нибудь хэш, но тогда оно будет непонятно людям. Правда, это внутреннее дело скорее, не для людей, но иногда их там люди находят и ставят rpm -U. Можно хэш и потом имя сколько влезет.)
Comment 2 Ivan Zakharyaschev 2024-07-25 05:24:57 MSK
(In reply to Ivan Zakharyaschev from comment #1)

> Получается, можно подумать о том, чтобы при скачивании пакетов из
> Allow-Duplicates, не повторять эту информацию в имени файла. (И теоретически
> для сокращения имени файла можно в качестве него использовать какой-нибудь
> хэш, но тогда оно будет непонятно людям. Правда, это внутреннее дело скорее,
> не для людей, но иногда их там люди находят и ставят rpm -U. Можно хэш и
> потом имя сколько влезет.)

Можно оставить полностью дисттаг, время сборки, версию, а имя пакета в начале имени файла при необходимости сокращать. Тогда по большей части имя файла будет совпадать со старым, но иногда имя пакета будет обрезано.
Comment 3 Ivan A. Melnikov 2024-07-30 11:57:31 MSK
(In reply to Ivan Zakharyaschev from comment #1)
> Они два раза повторяются для пакетов, подпадающих под Allow-Duplicates.
> Уникальная версия становится частью имени для таких пакетов (это можно
> увидеть дополняя аргумент команды install в apt-shell и т.п.)

Для истории: это здесь:

https://git.altlinux.org/gears/a/apt.git?a=blob;f=apt-pkg/rpm/rpmlistparser.cc;h=8355680ade350a54ac8fb9890fd6f1b99ea6400b#l127

(In reply to Ivan Zakharyaschev from comment #2)
> Можно оставить полностью дисттаг, время сборки, версию, а имя пакета в
> начале имени файла при необходимости сокращать.

Это хорошая мысль. Как я понимаю, окончательно имя файла формируется здесь:

https://git.altlinux.org/gears/a/apt.git?p=apt.git;a=blob;f=apt-pkg/acquire-item.cc;h=906eb287dba0e38654330fe7f335c474cb53e5c3#l717

Оно состоит из четырёх компонент:
- имя пакета (в терминах apt; для пакетов с Allow-Duplicated это name#evrdt);
- строка версии (в терминах apt; с точки зрения rpm это тот самый evrdt);
- архитектура
- точка и расширение из оригинального URI (.rpm).

Именно тут можно проверить, что имя файла оказалась больше 255 (например, NAME_MAX из limits.h; c pathconf(3) я бы не заморачивался), то первый компонент можно сделать короче ровно на столько, чтобы влезло.