diff --git a/bzz/dpa.go b/bzz/dpa.go index 46d2b0b71b..53f0be1fb3 100644 --- a/bzz/dpa.go +++ b/bzz/dpa.go @@ -47,11 +47,12 @@ type DPA struct { // but the size of the subtree encoded in the chunk // 0 if request, to be supplied by the dpa type Chunk struct { - Reader SectionReader // nil if request, to be supplied by dpa - Data []byte // nil if request, to be supplied by dpa - Size int64 // size of the data covered by the subtree encoded in this chunk - Key Key // always - C chan bool // to signal data delivery by the dpa + Reader SectionReader // nil if request, to be supplied by dpa + Data []byte // nil if request, to be supplied by dpa + Size int64 // size of the data covered by the subtree encoded in this chunk + Key Key // always + C chan bool // to signal data delivery by the dpa + req *requestStatus // } type ChunkStore interface { @@ -111,13 +112,15 @@ func (self *DPA) Store(data SectionReader) (key Key, err error) { // DPA is itself a chunk store , to stores a chunk only // its integrity is checked ? -func (self *DPA) Put(*Chunk) (err error) { +func (self *DPA) Put(chunk *Chunk) { + // rely on storeC return } // Get(chunk *Chunk) looks up a chunk in the local stores // This method is blocking until the chunk is retrieved so additional timeout is needed to wrap this call -func (self *DPA) Get(*Chunk) (err error) { +func (self *DPA) Get(key Key) (chunk *Chunk, err error) { + // rely on retrieveC return } @@ -150,9 +153,22 @@ func (self *DPA) retrieveLoop() { LOOP: for chunk := range self.retrieveC { go func() { - for _, store := range self.Stores { - if _, err := store.Get(chunk.Key); err != nil { // no waiting/blocking here + for i, store := range self.Stores { + storedChunk, err := store.Get(chunk.Key) + if err == notFound { + dpaLogger.DebugDetailf("%v retrieving chunk %x: NOT FOUND", store, chunk.Key) + return + } + if err != nil { dpaLogger.DebugDetailf("%v retrieving chunk %x: %v", store, chunk.Key, err) + return + } + chunk.Reader = NewChunkReaderFromBytes(storedChunk.Data) + chunk.Size = storedChunk.Size + close(chunk.C) + // if not in cache, cache it in memstore + if i > 0 { + self.Stores[0].Put(chunk) } } }()