added back anchor and selfheal broken chunks
This commit is contained in:
parent
fd035148bb
commit
6122768619
8 changed files with 65 additions and 44 deletions
|
|
@ -98,8 +98,12 @@ func (f *File) Read(p []byte) (n int, err error) {
|
|||
if err == io.EOF {
|
||||
return
|
||||
}
|
||||
if err == crypto.ErrDecrypt {
|
||||
log.V(2).Info("rereading to cache file", "err", err)
|
||||
return f.readToCache(p)
|
||||
}
|
||||
if err != nil {
|
||||
if !IsIOErr(err) && err != crypto.ErrDecrypt {
|
||||
if !IsIOErr(err) {
|
||||
log.Error(err, "error reading cache file")
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,13 +129,13 @@ const (
|
|||
func FileSize(s int64) string {
|
||||
switch {
|
||||
case s >= TiB:
|
||||
return strconv.Itoa(int(s/TiB)) + " TiB"
|
||||
return strconv.FormatFloat(float64(s)/TiB, 'f', 2, 64) + " TiB"
|
||||
case s >= GiB:
|
||||
return strconv.Itoa(int(s/GiB)) + " GiB"
|
||||
return strconv.FormatFloat(float64(s)/GiB, 'f', 2, 64) + " GiB"
|
||||
case s >= MiB:
|
||||
return strconv.Itoa(int(s/MiB)) + " MiB"
|
||||
return strconv.FormatFloat(float64(s)/MiB, 'f', 2, 64) + " MiB"
|
||||
case s >= KiB:
|
||||
return strconv.Itoa(int(s/KiB)) + " KiB"
|
||||
return strconv.FormatFloat(float64(s)/KiB, 'f', 2, 64) + " KiB"
|
||||
}
|
||||
return strconv.Itoa(int(s)) + " B"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -381,6 +381,7 @@ func (md *Metadata) close() (err error) {
|
|||
md.cancel()
|
||||
if md.wc != nil {
|
||||
close(md.wc)
|
||||
<-md.done
|
||||
md.wc = nil
|
||||
}
|
||||
if md.f != nil {
|
||||
|
|
@ -449,30 +450,27 @@ type writeAt struct {
|
|||
|
||||
func (md *Metadata) resetChans() {
|
||||
md.wc = make(chan writeAt, 10)
|
||||
md.done = make(chan struct{})
|
||||
}
|
||||
|
||||
func (md *Metadata) writer() {
|
||||
md.resetChans()
|
||||
md.err.Store(nil)
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-md.ctx.Done():
|
||||
return
|
||||
case wa := <-md.wc:
|
||||
atomic.StoreInt64(&md.Atime, now())
|
||||
n, err := md.f.WriteAt(wa.data, wa.pos)
|
||||
if err == nil {
|
||||
md.addChunk(wa.pos, n)
|
||||
md.fs.q.Add(n)
|
||||
} else {
|
||||
md.err.Store(&mdErr{err})
|
||||
}
|
||||
if wa.ret != nil {
|
||||
streamingPool.Put(wa.ret)
|
||||
}
|
||||
for wa := range md.wc {
|
||||
atomic.StoreInt64(&md.Atime, now())
|
||||
n, err := md.f.WriteAt(wa.data, wa.pos)
|
||||
if err == nil {
|
||||
md.addChunk(wa.pos, n)
|
||||
md.fs.q.Add(n)
|
||||
} else {
|
||||
md.err.Store(&mdErr{err})
|
||||
}
|
||||
if wa.ret != nil {
|
||||
streamingPool.Put(wa.ret)
|
||||
}
|
||||
}
|
||||
close(md.done)
|
||||
}()
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue