From 3f91730dc4e97b9d1f60439764a1f360ccf49337 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Thu, 4 Mar 2021 13:26:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20improve=20upload=20file=20parallel=20?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84=E6=96=87=E4=BB=B6=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/group_file.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/client/group_file.go b/client/group_file.go index 04f0207f..d8b4fd82 100644 --- a/client/group_file.go +++ b/client/group_file.go @@ -8,6 +8,7 @@ import ( "math/rand" "os" "runtime/debug" + "sync" "google.golang.org/protobuf/proto" @@ -54,6 +55,8 @@ type ( } ) +var fileSingleFlight = sync.Map{} + func init() { decoders["OidbSvc.0x6d8_1"] = decodeOIDB6d81Response decoders["OidbSvc.0x6d6_0"] = decodeOIDB6d60Response @@ -156,6 +159,17 @@ func (fs *GroupFileSystem) GetFilesByFolder(folderId string) ([]*GroupFile, []*G } func (fs *GroupFileSystem) UploadFile(p, name, folderId string) error { + // 同文件等待其他线程上传 + if wg, ok := fileSingleFlight.Load(p); ok { + wg.(*sync.WaitGroup).Wait() + } else { + wg := &sync.WaitGroup{} + wg.Add(1) + fileSingleFlight.Store(p, wg) + defer wg.Done() + defer fileSingleFlight.Delete(p) + } + file, err := os.OpenFile(p, os.O_RDONLY, 0666) if err != nil { return errors.Wrap(err, "open file error")