本文整理汇总了Golang中github.com/couchbase/gomemcached.MCRequest.Receive方法的典型用法代码示例。如果您正苦于以下问题:Golang MCRequest.Receive方法的具体用法?Golang MCRequest.Receive怎么用?Golang MCRequest.Receive使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/couchbase/gomemcached.MCRequest
的用法示例。
在下文中一共展示了MCRequest.Receive方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: doReceive
func doReceive(
uprconn *uprConnection, host string, msgch chan msgT, killSwitch chan bool) {
var hdr [mcd.HDR_LEN]byte
var msg msgT
var pkt mcd.MCRequest
var err error
mcconn := uprconn.conn.Hijack()
loop:
for {
if _, err = pkt.Receive(mcconn, hdr[:]); err != nil {
msg = msgT{uprconn: uprconn, err: err}
} else {
msg = msgT{uprconn: uprconn, pkt: pkt}
}
select {
case msgch <- msg:
case <-killSwitch:
break loop
}
}
return
}
示例2: runFeed
// Internal goroutine that reads from the socket and writes events to
// the channel
func (mc *Client) runFeed(ch chan TapEvent, feed *TapFeed) {
defer close(ch)
var headerBuf [gomemcached.HDR_LEN]byte
loop:
for {
// Read the next request from the server.
//
// (Can't call mc.Receive() because it reads a
// _response_ not a request.)
var pkt gomemcached.MCRequest
n, err := pkt.Receive(mc.conn, headerBuf[:])
if TapRecvHook != nil {
TapRecvHook(&pkt, n, err)
}
if err != nil {
if err != io.EOF {
feed.Error = err
}
break loop
}
//log.Printf("** TapFeed received %#v : %q", pkt, pkt.Body)
if pkt.Opcode == gomemcached.TAP_CONNECT {
// This is not an event from the server; it's
// an error response to my connect request.
feed.Error = fmt.Errorf("tap connection failed: %s", pkt.Body)
break loop
}
event := makeTapEvent(pkt)
if event != nil {
if event.Opcode == tapEndStream {
break loop
}
select {
case ch <- *event:
case <-feed.closer:
break loop
}
}
if len(pkt.Extras) >= 4 {
reqFlags := binary.BigEndian.Uint16(pkt.Extras[2:])
if reqFlags&gomemcached.TAP_ACK != 0 {
if _, err := mc.sendAck(&pkt); err != nil {
feed.Error = err
break loop
}
}
}
}
if err := mc.Close(); err != nil {
log.Printf("Error closing memcached client: %v", err)
}
}
示例3: worker
//.........这里部分代码省略.........
recvEndCh := make(chan struct{})
cleanup := func(progress int, err error) int {
if err != nil {
d.receiver.OnError(err)
}
go func() {
<-recvEndCh
close(sendCh)
}()
return progress
}
currVBuckets := make(map[uint16]*VBucketState)
currVBucketsMutex := sync.Mutex{} // Protects currVBuckets.
go func() { // Sender goroutine.
defer close(sendEndCh)
atomic.AddUint64(&d.stats.TotWorkerTransmitStart, 1)
for msg := range sendCh {
atomic.AddUint64(&d.stats.TotWorkerTransmit, 1)
err := client.Transmit(msg)
if err != nil {
atomic.AddUint64(&d.stats.TotWorkerTransmitErr, 1)
d.receiver.OnError(fmt.Errorf("client.Transmit, err: %v", err))
return
}
atomic.AddUint64(&d.stats.TotWorkerTransmitOk, 1)
}
atomic.AddUint64(&d.stats.TotWorkerTransmitDone, 1)
}()
go func() { // Receiver goroutine.
defer close(recvEndCh)
atomic.AddUint64(&d.stats.TotWorkerReceiveStart, 1)
var hdr [gomemcached.HDR_LEN]byte
var pkt gomemcached.MCRequest
var res gomemcached.MCResponse
// Track received bytes in case we need to buffer-ack.
recvBytesTotal := uint32(0)
conn := client.Hijack()
for {
// TODO: memory allocation here.
atomic.AddUint64(&d.stats.TotWorkerReceive, 1)
_, err := pkt.Receive(conn, hdr[:])
if err != nil {
atomic.AddUint64(&d.stats.TotWorkerReceiveErr, 1)
d.receiver.OnError(fmt.Errorf("pkt.Receive, err: %v", err))
return
}
atomic.AddUint64(&d.stats.TotWorkerReceiveOk, 1)
if pkt.Opcode == gomemcached.UPR_MUTATION ||
pkt.Opcode == gomemcached.UPR_DELETION ||
pkt.Opcode == gomemcached.UPR_EXPIRATION {
atomic.AddUint64(&d.stats.TotUPRDataChange, 1)
vbucketID := pkt.VBucket
currVBucketsMutex.Lock()
示例4: runFeed
func (feed *UprFeed) runFeed(ch chan *UprEvent) {
defer close(ch)
var headerBuf [gomemcached.HDR_LEN]byte
var pkt gomemcached.MCRequest
var event *UprEvent
mc := feed.conn.Hijack()
uprStats := &feed.stats
loop:
for {
sendAck := false
bytes, err := pkt.Receive(mc, headerBuf[:])
if err != nil {
ul.LogError("", "", "Error in receive %s", err.Error())
feed.Error = err
// send all the stream close messages to the client
feed.doStreamClose(ch)
break loop
} else {
event = nil
res := &gomemcached.MCResponse{
Opcode: pkt.Opcode,
Cas: pkt.Cas,
Opaque: pkt.Opaque,
Status: gomemcached.Status(pkt.VBucket),
Extras: pkt.Extras,
Key: pkt.Key,
Body: pkt.Body,
}
vb := vbOpaque(pkt.Opaque)
uprStats.TotalBytes = uint64(bytes)
feed.mu.RLock()
stream := feed.vbstreams[vb]
feed.mu.RUnlock()
switch pkt.Opcode {
case gomemcached.UPR_STREAMREQ:
if stream == nil {
ul.LogError("", "", "Stream not found for vb %d: %#v", vb, pkt)
break loop
}
status, rb, flog, err := handleStreamRequest(res)
if status == gomemcached.ROLLBACK {
event = makeUprEvent(pkt, stream)
// rollback stream
msg := "UPR_STREAMREQ with rollback %d for vb %d Failed: %v"
ul.LogError("", "", msg, rb, vb, err)
// delete the stream from the vbmap for the feed
feed.mu.Lock()
delete(feed.vbstreams, vb)
feed.mu.Unlock()
} else if status == gomemcached.SUCCESS {
event = makeUprEvent(pkt, stream)
event.Seqno = stream.StartSeq
event.FailoverLog = flog
stream.connected = true
ul.LogInfo("", "", "UPR_STREAMREQ for vb %d successful", vb)
} else if err != nil {
msg := "UPR_STREAMREQ for vbucket %d erro %s"
ul.LogError("", "", msg, vb, err.Error())
event = &UprEvent{
Opcode: gomemcached.UPR_STREAMREQ,
Status: status,
VBucket: vb,
Error: err,
}
}
case gomemcached.UPR_MUTATION,
gomemcached.UPR_DELETION,
gomemcached.UPR_EXPIRATION:
if stream == nil {
ul.LogError("", "", "Stream not found for vb %d: %#v", vb, pkt)
break loop
}
event = makeUprEvent(pkt, stream)
uprStats.TotalMutation++
sendAck = true
case gomemcached.UPR_STREAMEND:
if stream == nil {
ul.LogError("", "", "Stream not found for vb %d: %#v", vb, pkt)
break loop
}
//stream has ended
event = makeUprEvent(pkt, stream)
ul.LogInfo("", "", "Stream Ended for vb %d", vb)
sendAck = true
feed.mu.Lock()
delete(feed.vbstreams, vb)
feed.mu.Unlock()
case gomemcached.UPR_SNAPSHOT:
if stream == nil {
//.........这里部分代码省略.........