Я пытаюсь настроить sftp-сервер через GCS.
Пример монтирования gcsfuse в контейнере:
gcsfuse -o nonempty --only-dir user1 $BUCKET /home/user1/ftp
Когда я загружаю два файла с помощью sftp:
sftp> put 1024K.txt
Uploading 1024K.txt to /ftp/1024K.txt
1024K.txt 100% 1025KB 426.0KB/s 00:02
sftp> put 8K.txt
Uploading 8K.txt to /ftp/8K.txt
8K.txt 100% 8200 117.6KB/s 00:00
Couldn't close file: Failure
но оба файла передаются нормально:
sftp> ls -l
-rw-r--r-- 1 1003 1003 1049600 Mar 15 13:33 1024K.txt
-rw-r--r-- 1 1003 1003 8200 Mar 15 13:33 8K.txt
Поскольку загрузка большого файла прошла успешно, я не думаю, что это связано с разрешениями или настройкой sftp. Что могло вызвать сбой при загрузке небольшого файла?
(Отредактировано, чтобы удалить ссылку на K8 и GKE, поскольку поведение воспроизводимо без)
Похоже, это вызвано тем, что записи не сбрасываются на диск после каждой передачи. См. Этот пример:
sftp> put 8K.txt
Uploading 8K.txt to /home/jasper_humphrey/user1/8K.txt
8K.txt 100% 8200 111.5KB/s 00:00
Couldn't close file: Failure
sftp> ls
8K.txt
sftp> put 8K.txt
Uploading 8K.txt to /home/jasper_humphrey/user1/8K.txt
8K.txt 100% 8200 125.9KB/s 00:00
sftp> ls
8K.txt
sftp> put 8K.txt
Uploading 8K.txt to /home/jasper_humphrey/user1/8K.txt
remote open("/home/jasper_humphrey/user1/8K.txt"): Failure
Если я использую аргумент -f в sftp-клиенте, это запускает fsync после каждой передачи, и ошибка не возникает. На странице руководства sftp:
-f Requests that files be flushed to disk immediately after transfer. When
uploading files, this feature is only enabled if the server implements the
"fsync@openssh.com" extension.