func (m *fileMonitor) copyRemoteBlocks(cc <-chan content, outFile *os.File, writeWg *sync.WaitGroup) { defer writeWg.Done() for content := range cc { _, err := outFile.WriteAt(content.data, content.offset) buffers.Put(content.data) if err != nil { m.writeError = err return } } }
func (d *Discoverer) externalLookup(node string) (string, bool) { extIP, err := net.ResolveUDPAddr("udp", d.extServer+":22025") if err != nil { log.Printf("discover/external: %v; no external lookup", err) return "", false } conn, err := net.DialUDP("udp", nil, extIP) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return "", false } defer conn.Close() err = conn.SetDeadline(time.Now().Add(5 * time.Second)) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return "", false } _, err = conn.Write(EncodePacket(Packet{QueryMagic, 0, node, nil})) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return "", false } var buf = buffers.Get(256) defer buffers.Put(buf) n, err := conn.Read(buf) if err != nil { if err, ok := err.(net.Error); ok && err.Timeout() { // Expected if the server doesn't know about requested node ID return "", false } log.Printf("discover/external/read: %v; no external lookup", err) return "", false } pkt, err := DecodePacket(buf[:n]) if err != nil { log.Printf("discover/external/read: %v; no external lookup", err) return "", false } if pkt.Magic != AnnouncementMagic { log.Printf("discover/external/read: bad magic; no external lookup", err) return "", false } return fmt.Sprintf("%s:%d", ipStr(pkt.IP), pkt.Port), true }
func applyContent(cc <-chan content, dst io.WriterAt) error { var err error for c := range cc { _, err = dst.WriteAt(c.data, c.offset) buffers.Put(c.data) if err != nil { return err } } return nil }
func (c *rawConnection) processRequest(msgID int, req RequestMessage) { data, _ := c.receiver.Request(c.id, req.Repository, req.Name, int64(req.Offset), int(req.Size)) c.wmut.Lock() header{0, msgID, messageTypeResponse}.encodeXDR(c.xw) c.xw.WriteBytes(data) err := c.flush() c.wmut.Unlock() buffers.Put(data) if err != nil { c.close <- err } }
func (c *Connection) processRequest(msgID int, req request) { data, _ := c.receiver.Request(c.ID, req.name, req.offset, req.size, req.hash) c.Lock() c.mwriter.writeUint32(encodeHeader(header{0, msgID, messageTypeResponse})) c.mwriter.writeResponse(data) err := c.flush() c.Unlock() buffers.Put(data) if err != nil { c.Close(err) } else if c.mwriter.err != nil { c.Close(c.mwriter.err) } }
func (p *puller) handleCopyBlock(b bqBlock) { // We have blocks to copy from the existing file f := b.file of := p.openFiles[f.Name] if debug { l.Debugf("pull: copying %d blocks for %q / %q", len(b.copy), p.repo, f.Name) } var exfd *os.File exfd, of.err = os.Open(of.filepath) if of.err != nil { if debug { l.Debugf("pull: error: %q / %q: %v", p.repo, f.Name, of.err) } of.file.Close() of.file = nil p.openFiles[f.Name] = of return } defer exfd.Close() for _, b := range b.copy { bs := buffers.Get(int(b.Size)) _, of.err = exfd.ReadAt(bs, b.Offset) if of.err == nil { _, of.err = of.file.WriteAt(bs, b.Offset) } buffers.Put(bs) if of.err != nil { if debug { l.Debugf("pull: error: %q / %q: %v", p.repo, f.Name, of.err) } exfd.Close() of.file.Close() of.file = nil p.openFiles[f.Name] = of return } } }
func (m *fileMonitor) copyLocalBlocks(inFile, outFile *os.File, writeWg *sync.WaitGroup) { defer inFile.Close() defer writeWg.Done() var buf = buffers.Get(BlockSize) defer buffers.Put(buf) for _, lb := range m.localBlocks { buf = buf[:lb.Size] _, err := inFile.ReadAt(buf, lb.Offset) if err != nil { m.copyError = err return } _, err = outFile.WriteAt(buf, lb.Offset) if err != nil { m.copyError = err return } } }
func (p *puller) handleRequestResult(res requestResult) { p.oustandingPerNode.decrease(res.node) f := res.file of, ok := p.openFiles[f.Name] if !ok || of.err != nil { // no entry in openFiles means there was an error and we've cancelled the operation return } _, of.err = of.file.WriteAt(res.data, res.offset) buffers.Put(res.data) of.outstanding-- p.openFiles[f.Name] = of if debug { l.Debugf("pull: wrote %q / %q offset %d outstanding %d done %v", p.repo, f.Name, res.offset, of.outstanding, of.done) } if of.done && of.outstanding == 0 { p.closeFile(f) } }
func (r *marshalReader) readString() string { bs := r.readBytes() defer buffers.Put(bs) return string(bs) }
func (d *Discoverer) externalLookup(node string) []string { extIP, err := net.ResolveUDPAddr("udp", d.extServer) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return nil } conn, err := net.DialUDP("udp", nil, extIP) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return nil } defer conn.Close() err = conn.SetDeadline(time.Now().Add(5 * time.Second)) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return nil } buf := QueryV2{QueryMagicV2, node}.MarshalXDR() _, err = conn.Write(buf) if err != nil { log.Printf("discover/external: %v; no external lookup", err) return nil } buffers.Put(buf) buf = buffers.Get(2048) defer buffers.Put(buf) n, err := conn.Read(buf) if err != nil { if err, ok := err.(net.Error); ok && err.Timeout() { // Expected if the server doesn't know about requested node ID return nil } log.Printf("discover/external/read: %v; no external lookup", err) return nil } if debug { dlog.Printf("read external:\n%s", hex.Dump(buf[:n])) } var pkt AnnounceV2 err = pkt.UnmarshalXDR(buf[:n]) if err != nil && err != io.EOF { log.Println("discover/external/decode:", err) return nil } if debug { dlog.Printf("parsed external: %#v", pkt) } var addrs []string for _, a := range pkt.This.Addresses { nodeAddr := fmt.Sprintf("%s:%d", net.IP(a.IP), a.Port) addrs = append(addrs, nodeAddr) } return addrs }