我正在尝试通过 GCS 设置 sftp 服务器。
容器中 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
- 我正在标准的 debian-stretch 实例上运行。
- 该实例具有存储R/W权限。
- 我尝试了一些 gcsfuse 选项,但没有成功:--type-cache-ttl 0 --stat-cache-ttl 0 --implicit-dirs
- 我尝试在客户端和服务器上进行 ssh 调试日志记录 - 没有新信息。
由于大文件上传成功,我认为这与权限或 sftp 设置无关。什么原因导致小文件上传失败?
(已编辑删除对 K8 和 GKE 的引用,因为无需此操作即可重现此行为)
答案1
这似乎是由于每次传输后写入没有刷新到磁盘造成的。请参见以下示例:
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
如果我在 sftp 客户端上使用 -f 参数,则每次传输后都会触发 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
"[email protected]" extension.