Example #1
0
// 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
}
Example #2
0
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)
		}
	}
}