func (cmd *cmdSync) Main() { from, target := args.from, args.target if len(from) == 0 { log.Panic("invalid argument: from") } if len(target) == 0 { log.Panic("invalid argument: target") } log.Infof("sync from '%s' to '%s'\n", from, target) var sockfile *os.File if len(args.sockfile) != 0 { f, err := pipe.OpenFile(args.sockfile, false) if err != nil { log.PanicError(err, "open sockbuff file failed") } sockfile = f } master, nsize := cmd.SendCmd(from) defer master.Close() log.Infof("rdb file = %d\n", nsize) var input io.Reader if sockfile != nil { r, w := pipe.PipeFile(ReaderBufferSize, int(args.filesize), sockfile) defer r.Close() go func() { defer w.Close() p := make([]byte, ReaderBufferSize) for { iocopy(master, w, p, len(p)) } }() input = r } else { input = master } reader := bufio.NewReaderSize(ioutils.NewCountReader(input, &cmd.nread), ReaderBufferSize) cmd.SyncRDBFile(reader, target, nsize) cmd.SyncCommand(reader, target) }
func (h *Handler) openSyncPipe() (pipe.Reader, pipe.Writer) { filePath := h.config.SyncFilePath fileSize := h.config.SyncFileSize buffSize := h.config.SyncBuffSize var file *os.File if filePath != "" { f, err := pipe.OpenFile(filePath, false) if err != nil { log.Errorf("open pipe file '%s' failed - %s", filePath, err) } else { file = f } } pr, pw := pipe.PipeFile(buffSize, fileSize, file) return pr, pw }