diff --git a/weed/filer/reader_cache.go b/weed/filer/reader_cache.go index bce97cc49..c319f6c78 100644 --- a/weed/filer/reader_cache.go +++ b/weed/filer/reader_cache.go @@ -19,6 +19,7 @@ type ReaderCache struct { type SingleChunkCacher struct { sync.RWMutex + cond *sync.Cond parent *ReaderCache chunkFileId string data []byte @@ -140,6 +141,7 @@ func newSingleChunkCacher(parent *ReaderCache, fileId string, cipherKey []byte, chunkSize: chunkSize, shouldCache: shouldCache, } + t.cond = sync.NewCond(t) return t } @@ -168,6 +170,7 @@ func (s *SingleChunkCacher) startCaching() { if s.shouldCache { s.parent.chunkCache.SetChunk(s.chunkFileId, s.data) } + s.cond.Broadcast() return } @@ -183,6 +186,10 @@ func (s *SingleChunkCacher) readChunkAt(buf []byte, offset int64) (int, error) { s.RLock() defer s.RUnlock() + for s.completedTime.IsZero() { + s.cond.Wait() + } + if s.err != nil { return 0, s.err }