func (kvdata *KVData) scatterMutation( m *mc.DcpEvent, ts *protobuf.TsVbuuid) (err error) { vbno := m.VBucket switch m.Opcode { case mcd.DCP_STREAMREQ: if m.Status == mcd.ROLLBACK { fmsg := "%v ##%x StreamRequest ROLLBACK: %v\n" logging.Infof(fmsg, kvdata.logPrefix, m.Opaque, m) } else if m.Status != mcd.SUCCESS { fmsg := "%v ##%x StreamRequest %s: %v\n" logging.Errorf(fmsg, kvdata.logPrefix, m.Opaque, m.Status, m) } else if _, ok := kvdata.vrs[vbno]; ok { fmsg := "%v ##%x duplicate OpStreamRequest: %v\n" logging.Errorf(fmsg, kvdata.logPrefix, m.Opaque, m) } else if m.VBuuid, _, err = m.FailoverLog.Latest(); err != nil { panic(err) } else { fmsg := "%v ##%x StreamRequest: %v\n" logging.Tracef(fmsg, kvdata.logPrefix, m.Opaque, m) topic, bucket := kvdata.topic, kvdata.bucket m.Seqno, _ = ts.SeqnoFor(vbno) cluster, config := kvdata.feed.cluster, kvdata.config vr := NewVbucketRoutine( cluster, topic, bucket, m.Opaque, vbno, m.VBuuid, m.Seqno, config) _, err := vr.AddEngines(0xFFFF, kvdata.engines, kvdata.endpoints) if err != nil { panic(err) } if vr.Event(m) != nil { panic(err) } kvdata.vrs[vbno] = vr } kvdata.feed.PostStreamRequest(kvdata.bucket, m) case mcd.DCP_STREAMEND: if vr, ok := kvdata.vrs[vbno]; !ok { fmsg := "%v ##%x duplicate OpStreamEnd: %v\n" logging.Errorf(fmsg, kvdata.logPrefix, m.Opaque, m) } else if m.Status != mcd.SUCCESS { fmsg := "%v ##%x StreamEnd %s: %v\n" logging.Errorf(fmsg, kvdata.logPrefix, m.Opaque, m) } else { fmsg := "%v ##%x StreamEnd: %v\n" logging.Tracef(fmsg, kvdata.logPrefix, m.Opaque, m) if vr.Event(m) != nil { panic(err) } delete(kvdata.vrs, vbno) } kvdata.feed.PostStreamEnd(kvdata.bucket, m) case mcd.DCP_SNAPSHOT: if vr, ok := kvdata.vrs[vbno]; ok && (vr.Event(m) != nil) { panic(err) } else if !ok { fmsg := "%v ##%x unknown vbucket: %v\n" logging.Fatalf(fmsg, kvdata.logPrefix, m.Opaque, m) } case mcd.DCP_MUTATION, mcd.DCP_DELETION, mcd.DCP_EXPIRATION: if vr, ok := kvdata.vrs[vbno]; ok && (vr.Event(m) != nil) { panic(err) } else if !ok { fmsg := "%v ##%x unknown vbucket: %v\n" logging.Fatalf(fmsg, kvdata.logPrefix, m.Opaque, m) } } return }