func (m *master) sync() error { logIndexStr := strconv.FormatInt(m.info.LogFileIndex, 10) logPosStr := strconv.FormatInt(m.info.LogPos, 10) cmd := ledis.Slice(fmt.Sprintf(syncCmdFormat, len(logIndexStr), logIndexStr, len(logPosStr), logPosStr)) if _, err := m.conn.Write(cmd); err != nil { return err } m.syncBuf.Reset() err := ReadBulkTo(m.rb, &m.syncBuf) if err != nil { return err } var buf []byte buf, err = snappy.Decode(m.compressBuf, m.syncBuf.Bytes()) if err != nil { return err } else if len(buf) > len(m.compressBuf) { m.compressBuf = buf } if len(buf) < 16 { return fmt.Errorf("invalid sync data len %d", len(buf)) } m.info.LogFileIndex = int64(binary.BigEndian.Uint64(buf[0:8])) m.info.LogPos = int64(binary.BigEndian.Uint64(buf[8:16])) if m.info.LogFileIndex == 0 { //master now not support binlog, stop replication m.stopReplication() return nil } else if m.info.LogFileIndex == -1 { //-1 means than binlog index and pos are lost, we must start a full sync instead return m.fullSync() } err = m.app.ldb.ReplicateFromData(buf[16:]) if err != nil { return err } return m.saveInfo() }
func (l *Ledis) LoadDump(r io.Reader) (*MasterInfo, error) { l.Lock() defer l.Unlock() info := new(MasterInfo) rb := bufio.NewReaderSize(r, 4096) err := info.ReadFrom(rb) if err != nil { return nil, err } var keyLen uint16 var valueLen uint32 var keyBuf bytes.Buffer var valueBuf bytes.Buffer deKeyBuf := make([]byte, 4096) deValueBuf := make([]byte, 4096) var key, value []byte for { if err = binary.Read(rb, binary.BigEndian, &keyLen); err != nil && err != io.EOF { return nil, err } else if err == io.EOF { break } if _, err = io.CopyN(&keyBuf, rb, int64(keyLen)); err != nil { return nil, err } if key, err = snappy.Decode(deKeyBuf, keyBuf.Bytes()); err != nil { return nil, err } if err = binary.Read(rb, binary.BigEndian, &valueLen); err != nil { return nil, err } if _, err = io.CopyN(&valueBuf, rb, int64(valueLen)); err != nil { return nil, err } if value, err = snappy.Decode(deValueBuf, valueBuf.Bytes()); err != nil { return nil, err } if err = l.ldb.Put(key, value); err != nil { return nil, err } if l.binlog != nil { err = l.binlog.Log(encodeBinLogPut(key, value)) } keyBuf.Reset() valueBuf.Reset() } deKeyBuf = nil deValueBuf = nil return info, nil }
func (l *Nodb) LoadDump(r io.Reader) (*BinLogAnchor, error) { l.wLock.Lock() defer l.wLock.Unlock() info := new(BinLogAnchor) rb := bufio.NewReaderSize(r, 4096) err := info.ReadFrom(rb) if err != nil { return nil, err } var keyLen uint16 var valueLen uint32 var keyBuf bytes.Buffer var valueBuf bytes.Buffer deKeyBuf := make([]byte, 4096) deValueBuf := make([]byte, 4096) var key, value []byte for { if err = binary.Read(rb, binary.BigEndian, &keyLen); err != nil && err != io.EOF { return nil, err } else if err == io.EOF { break } if _, err = io.CopyN(&keyBuf, rb, int64(keyLen)); err != nil { return nil, err } if key, err = snappy.Decode(deKeyBuf, keyBuf.Bytes()); err != nil { return nil, err } if err = binary.Read(rb, binary.BigEndian, &valueLen); err != nil { return nil, err } if _, err = io.CopyN(&valueBuf, rb, int64(valueLen)); err != nil { return nil, err } if value, err = snappy.Decode(deValueBuf, valueBuf.Bytes()); err != nil { return nil, err } if err = l.ldb.Put(key, value); err != nil { return nil, err } keyBuf.Reset() valueBuf.Reset() } deKeyBuf = nil deValueBuf = nil //if binlog enable, we will delete all binlogs and open a new one for handling simply if l.binlog != nil { l.binlog.PurgeAll() } return info, nil }