func (cmd *cmdSync) PSyncPipeCopy(c net.Conn, br *bufio.Reader, bw *bufio.Writer, offset int64, copyto io.Writer) (int64, error) { defer c.Close() var nread atomic2.Int64 go func() { defer c.Close() for { time.Sleep(time.Second * 5) if err := sendPSyncAck(bw, offset+nread.Get()); err != nil { return } } }() var p = make([]byte, 8192) for { n, err := br.Read(p) if err != nil { return nread.Get(), nil } if _, err := copyto.Write(p[:n]); err != nil { return nread.Get(), err } nread.Add(int64(n)) } }
func (cmd *cmdDump) DumpRDBFile(reader *bufio.Reader, writer *bufio.Writer, nsize int64) { var nread atomic2.Int64 wait := make(chan struct{}) go func() { defer close(wait) p := make([]byte, WriterBufferSize) for nsize != nread.Get() { nstep := int(nsize - nread.Get()) ncopy := int64(iocopy(reader, writer, p, nstep)) nread.Add(ncopy) flushWriter(writer) } }() for done := false; !done; { select { case <-wait: done = true case <-time.After(time.Second): } n := nread.Get() p := 100 * n / nsize log.Infof("total = %d - %12d [%3d%%]\n", nsize, n, p) } log.Info("dump: rdb done") }
func (cmd *cmdDump) DumpCommand(reader *bufio.Reader, writer *bufio.Writer, nsize int64) { var nread atomic2.Int64 go func() { p := make([]byte, ReaderBufferSize) for { ncopy := int64(iocopy(reader, writer, p, len(p))) nread.Add(ncopy) flushWriter(writer) } }() for { time.Sleep(time.Second) log.Infof("dump: total = %d\n", nsize+nread.Get()) } }