mirror of
https://github.com/octoleo/restic.git
synced 2024-11-02 19:49:44 +00:00
introduce RWLock for caching obj.Stat()
This commit is contained in:
parent
b523eef294
commit
f1ba45723c
@ -7,6 +7,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"restic"
|
"restic"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"restic/backend"
|
"restic/backend"
|
||||||
"restic/errors"
|
"restic/errors"
|
||||||
@ -24,8 +25,8 @@ type s3 struct {
|
|||||||
connChan chan struct{}
|
connChan chan struct{}
|
||||||
bucketname string
|
bucketname string
|
||||||
prefix string
|
prefix string
|
||||||
cacheObjName string
|
cacheMutex sync.RWMutex
|
||||||
cacheSize int64
|
cacheObjSize map[string]int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the S3 backend at bucket and region. The bucket is created if it
|
// Open opens the S3 backend at bucket and region. The bucket is created if it
|
||||||
@ -38,7 +39,12 @@ func Open(cfg Config) (restic.Backend, error) {
|
|||||||
return nil, errors.Wrap(err, "minio.New")
|
return nil, errors.Wrap(err, "minio.New")
|
||||||
}
|
}
|
||||||
|
|
||||||
be := &s3{client: client, bucketname: cfg.Bucket, prefix: cfg.Prefix}
|
be := &s3{
|
||||||
|
client: client,
|
||||||
|
bucketname: cfg.Bucket,
|
||||||
|
prefix: cfg.Prefix,
|
||||||
|
cacheObjSize: make(map[string]int64),
|
||||||
|
}
|
||||||
|
|
||||||
tr := &http.Transport{MaxIdleConnsPerHost: connLimit}
|
tr := &http.Transport{MaxIdleConnsPerHost: connLimit}
|
||||||
client.SetCustomTransport(tr)
|
client.SetCustomTransport(tr)
|
||||||
@ -189,17 +195,20 @@ func (be *s3) Load(h restic.Handle, length int, offset int64) (io.ReadCloser, er
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// otherwise use a buffer with ReadAt
|
// otherwise use a buffer with ReadAt
|
||||||
if be.cacheObjName == objName {
|
be.cacheMutex.RLock()
|
||||||
size = be.cacheSize
|
size, cacheHit := be.cacheObjSize[objName]
|
||||||
} else {
|
be.cacheMutex.RUnlock()
|
||||||
|
|
||||||
|
if !cacheHit {
|
||||||
info, err := obj.Stat()
|
info, err := obj.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = obj.Close()
|
_ = obj.Close()
|
||||||
return nil, errors.Wrap(err, "obj.Stat")
|
return nil, errors.Wrap(err, "obj.Stat")
|
||||||
}
|
}
|
||||||
size = info.Size
|
size = info.Size
|
||||||
be.cacheObjName = objName
|
be.cacheMutex.Lock()
|
||||||
be.cacheSize = size
|
be.cacheObjSize[objName] = size
|
||||||
|
be.cacheMutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
if offset > size {
|
if offset > size {
|
||||||
|
Loading…
Reference in New Issue
Block a user