func snapshots(socket *zmq.Socket, srv *clonesrv_t) (err error) { msg, err := socket.RecvMessage(0) if err != nil { return } identity := msg[0] // Request is in second frame of message request := msg[1] if request != "ICANHAZ?" { err = errors.New("E: bad request, aborting") return } subtree := msg[2] // Send state socket to client for _, kvmsg := range srv.kvmap { if key, _ := kvmsg.GetKey(); strings.HasPrefix(key, subtree) { socket.Send(identity, zmq.SNDMORE) kvmsg.Send(socket) } } // Now send END message with sequence number log.Println("I: sending shapshot =", srv.sequence) socket.Send(identity, zmq.SNDMORE) kvmsg := kvmsg.NewKvmsg(srv.sequence) kvmsg.SetKey("KTHXBAI") kvmsg.SetBody(subtree) kvmsg.Send(socket) return }
// Echo service func echo(socket *zmq.Socket) (err error) { msg, err := socket.RecvMessage(0) if err != nil { return } _, err = socket.SendMessage(msg) return }
// Application wants to speak to us, see if it's possible func (bstar *Bstar) voter_ready(socket *zmq.Socket) error { // If server can accept input now, call appl handler bstar.event = client_REQUEST err := bstar.execute_fsm() if err == nil { bstar.voter_fn(socket) } else { // Destroy waiting message, no-one to read it socket.RecvMessage(0) } return nil }
// The RecvKvmsg function reads a key-value message from socket, and returns a new // Kvmsg instance. func RecvKvmsg(socket *zmq.Socket) (kvmsg *Kvmsg, err error) { kvmsg = &Kvmsg{ present: make([]bool, kvmsg_FRAMES), frame: make([]string, kvmsg_FRAMES), } msg, err := socket.RecvMessage(0) if err != nil { return } //fmt.Printf("Recv from %s: %q\n", socket, msg) for i := 0; i < kvmsg_FRAMES && i < len(msg); i++ { kvmsg.frame[i] = msg[i] kvmsg.present[i] = true } return }
func ProcessEvents(self string, statebe, statefe *zmq.Socket) { poller := zmq.NewPoller() poller.Add(statefe, zmq.POLLIN) for { // Poll for activity, or 1 second timeout sockets, err := poller.Poll(time.Second) if err != nil { break } // Handle incoming status messages if len(sockets) == 1 { msg, _ := statefe.RecvMessage(0) peerName := msg[0] available := msg[1] fmt.Printf("%s - %s workers free\n", peerName, available) } else { statebe.SendMessage(self, rand.Intn(10)) } } }