Назад | Перейти на главную страницу

sftp-server over gcsfuse - большие загрузки выполняются успешно, но небольшие загрузки (<0,5 МБ) дают ошибку

Я пытаюсь настроить 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.