// Get the next splice, read it into the response. func (s *spliceServer) serveChunk(req *Request, rep *Response) (err error) { if s.store.TryServeChunkFromMemory(req, rep) { return nil } if req.Start == 0 { err := s.prepareServe(req.Hash) if err != nil { rep.Have = false return nil } } rep.Have = true spl := s.serve(req.Hash, int64(req.Start)) if spl == nil { return s.store.ServeChunk(req, rep) } defer splice.Done(spl.pair) data := make([]byte, spl.size) n, err := spl.pair.Read(data) if err != nil { return s.store.ServeChunk(req, rep) } rep.Chunk = data[:n] rep.Size = n rep.Last = spl.last return nil }
func (s *spliceServer) Close() { chans := []chan ServeSplice{} s.mu.Lock() for _, p := range s.pending { chans = append(chans, p...) } s.pending = map[serverKey][]chan ServeSplice{} s.mu.Unlock() for _, c := range chans { for r := range c { splice.Done(r.pair) } } }