【发布时间】:2022-08-04 16:12:34
【问题描述】:
我写了一小段golang代码,递归遍历一个目录,上传director中的文件。目录中大约有 93K+ 项。 过了一会儿,我收到以下错误:
上传文件时出错:/Users/randolphhill/Fat-Tree-Business/SandBox/DDD/heydoc/ios/Pods/gRPC-Core/src/core/ext/transport/chttp2/alpn/alpn.h 操作错误 S3:PutObject,https 响应错误 StatusCode:0,RequestID:,HostID:,已取消,超出上下文期限。
下面是代码sn-p
func PutFile(c context.Context, api S3PutObjectAPI, input *s3.PutObjectInput) (*s3.PutObjectOutput, error) {
return api.PutObject(c, input)
}
func PutFileS3(dir, filename, bucket, reg string) error {
var cfg aws.Config
st, err := fthash.Filehash(dir + filename)
if err != nil {
panic(\"configuration error, \" + err.Error())
return err
}
m := make(map[string]string)
m[\"hashcode\"] = st
cfg, err = config.LoadDefaultConfig(context.TODO(), config.WithRegion(reg))
if err != nil {
panic(\"configuration error, \" + err.Error())
}
client := s3.NewFromConfig(cfg)
tmp := \"backup\" + dir + filename
uri := strings.Replace(tmp, \" \", \"##,##\", -1)
if checkFileOnS3(client, bucket, uri, st) {
fmt.Println(\" FILE EXIST\")
return nil
}
file, err2 := os.Open(dir + filename)
defer file.Close()
if err2 != nil {
fmt.Println(\"Unable to open file \" + filename)
return err2
}
tmp = \"backup\" + dir + filename
//uri := \"backup\" + dir + filename
uri = strings.Replace(tmp, \" \", \"##,##\", -1)
input := &s3.PutObjectInput{
Bucket: &bucket,
Key: aws.String(uri),
//Key: &filename,
Body: file,
Metadata: m,
}
ctx, cancelFn := context.WithTimeout(context.TODO(), 10*time.Second)
defer cancelFn()
_, err2 = PutFile(ctx, client, input)
if err2 != nil {
fmt.Println(\"Got error uploading file:\", dir+filename)
fmt.Println(err2)
return err2
}
return nil
}
-
您是否有任何可能需要超过 10 秒才能上传的较大文件?
-
超时与上下文创建有关,与收到的最新字节无关。 Iirc 有第三方软件包可以解决缺少实际传输超时的问题。
-
这只是一个实验。我认为拥有大量 goroutine(数千个)是一个沉重的负担。不确定在哪一端。该程序基于 OSX 12.1 构建。我将在 Ubuntu 上进行测试,看看是否得到相同的结果
-
你可以运行几千个 goroutine 没问题,如果它们正在等待网络 I/O,它们真的没有开销。但是 S3 只会让你发出这么多的并发请求 - 它很多,但不是无限的。您的操作系统可能也为您的用户配置了默认的
ulimit1024,除非您已更改它。