michaellukashov / Far-NetBox

SFTP/SCP/FTP/FTPS/WebDAV/S3 client for Far Manager 3 (http://farmanager.com/)
https://forum.farmanager.com/viewtopic.php?t=6317
GNU General Public License v2.0
155 stars 52 forks source link

Ошибка при чтении ссылок (SCP) и неоптимальный порядок чтения #421

Closed ssvine closed 4 months ago

ssvine commented 4 months ago

В режиме SCP некоторые последовательности ссылок могут читаться неправильно.

Пример. Листинг текущей директории:

$ ls -la python*
lrwxrwxrwx 1 root root  7 мая 19  2020 python -> python3
lrwxrwxrwx 1 root root 16 мая 19  2020 python3 -> /usr/bin/python3

Листинг директории /usr/bin:

$ ls -la /usr/bin/python*
lrwxrwxrwx 1 root root       9 окт 25  2018 /usr/bin/python3 -> python3.6
-r-xr-xr-x 2 root root 4526456 мар 10  2023 /usr/bin/python3.6

После чтения ссылки python3 плагин увидит, что она указывает на /usr/bin/python3, которая тоже ссылка. Она, в свою очередь, указывает на файл python3.6, расположеный в директории /usr/bin, но плагин не учитывает относительность ссылки и начнёт читать её в текущей директории.

Пулл реквест исправляет ошибку с чтением ссылок.

Когда разбирался с этой ошибкой, обнаружил, что ссылки читаются неоптимально - дважды. Первый раз при чтении директории, второй раз при вызове функции GetFindDataW.

Ссылки читаются с одной целью - узнать, директория это или нет. В пулл реквесте схема чтения ссылок переделана так, чтобы тип устанавливался сразу при чтении директории и не возникала необходимость перечитывать их повторно. Для некоторых серверов со слабым каналом и большим количеством ссылок можно получить увеличение скорости чтения директории почти в 2 раза. Для примера можно привести директорию ftp@cygwin.mirror.rafal.ca:/Debian/debian/dists, которая на моих тестах читалась за 26 секунд, а стала за 14.

Помимо этого внесены следующие изменения:

michaellukashov commented 4 months ago

Спасибо, добавлено в v24.3.0.597