// NewSocket allocates a new Socket. The Socket is the handle used to // access the underlying library. func NewSocket(d Domain, p Protocol) (*Socket, error) { var s Socket var err error s.proto = p s.dom = d switch p { case PUB: s.sock, err = pub.NewSocket() case SUB: s.sock, err = sub.NewSocket() case PUSH: s.sock, err = push.NewSocket() case PULL: s.sock, err = pull.NewSocket() case REQ: s.sock, err = req.NewSocket() case REP: s.sock, err = rep.NewSocket() case SURVEYOR: s.sock, err = surveyor.NewSocket() case RESPONDENT: s.sock, err = respondent.NewSocket() case PAIR: s.sock, err = pair.NewSocket() case BUS: s.sock, err = bus.NewSocket() default: err = mangos.ErrBadProto } if err != nil { return nil, err } switch d { case AF_SP: case AF_SP_RAW: err = s.sock.SetOption(mangos.OptionRaw, true) default: err = errBadDomain } if err != nil { s.sock.Close() return nil, err } // Compat mode sockets should timeout on send if we don't have any pipes if err = s.sock.SetOption(mangos.OptionWriteQLen, 0); err != nil { s.sock.Close() return nil, err } s.rto = -1 s.sto = -1 all.AddTransports(s.sock) return &s, nil }
func server(url string) { var sock mangos.Socket var err error var msg []byte if sock, err = surveyor.NewSocket(); err != nil { die("can't get new surveyor socket: %s", err) } sock.AddTransport(ipc.NewTransport()) sock.AddTransport(tcp.NewTransport()) if err = sock.Listen(url); err != nil { die("can't listen on surveyor socket: %s", err.Error()) } err = sock.SetOption(mangos.OptionSurveyTime, time.Second*2) if err != nil { die("SetOption(): %s", err.Error()) } for { fmt.Println("SERVER: SENDING DATE SURVEY REQUEST") if err = sock.Send([]byte("DATE")); err != nil { die("Failed sending survey: %s", err.Error()) } for { if msg, err = sock.Recv(); err != nil { break } fmt.Printf("SERVER: RECEIVED \"%s\" SURVEY RESPONSE\n", string(msg)) } } }
func (st *surveyTest) Init(t *testing.T, addr string) bool { var err error st.resp = make(map[uint32]bool) if st.Sock, err = surveyor.NewSocket(); err != nil { st.Errorf("NewSocket(): %v", err) return false } return st.T.Init(t, addr) }
func Server(urlServer string, urlPubSub string, opt Options) (*DiscoveryServer, error) { var sock mangos.Socket var err error var publisher *Publisher ctx, cancel := context.WithCancel(context.Background()) sock, err = surveyor.NewSocket() if err != nil { return nil, err } sock.AddTransport(ipc.NewTransport()) sock.AddTransport(tcp.NewTransport()) err = sock.Listen(urlServer) if err != nil { return nil, err } err = sock.SetOption(mangos.OptionSurveyTime, opt.SurveyTime) if err != nil { return nil, err } err = sock.SetOption(mangos.OptionRecvDeadline, opt.RecvDeadline) if err != nil { return nil, err } pubCtx, pubCancel := context.WithCancel(ctx) publisher, err = NewPublisher(pubCtx, urlPubSub) if err != nil { pubCancel() return nil, err } services := NewServices(publisher) server := &DiscoveryServer{ services: services, urlServer: urlServer, urlPubSub: urlPubSub, opt: opt, ctx: ctx, cancel: cancel, sock: sock, } go server.run() return server, nil }
func (m *Master) queryWorkers(c chan<- float64) { var ( err error sock mangos.Socket ) // Try to get new "surveyor" socket if sock, err = surveyor.NewSocket(); err != nil { utils.Die("Can't get new surveyor socket: %s", err) } defer sock.Close() sock.AddTransport(tcp.NewTransport()) // Begin listening on the URL if err = sock.Listen(m.url.String()); err != nil { utils.Die("Can't listen on surveyor socket: %s", err.Error()) } // Set "deadline" for the survey and a timeout for receiving responses if err = sock.SetOption(mangos.OptionSurveyTime, m.surveyDeadline); err != nil { utils.Die("SetOption(mangos.OptionSurveyTime): %s", err.Error()) } if err = sock.SetOption(mangos.OptionRecvDeadline, m.surveyDeadline+(1*time.Second)); err != nil { utils.Die("SetOption(mangos.OptionRecvDeadline): %s", err.Error()) } for { fmt.Println("Sending master request") if err = sock.Send([]byte("CPU")); err != nil { utils.Die("Failed sending survey: %s", err.Error()) } loadAvgs := []float64{} for { var msg []byte if msg, err = sock.Recv(); err != nil { break } parts := strings.Split(string(msg), ",") if len(parts) != 2 { continue } ip := parts[0] loadAvgString := parts[1] // Find the corresponding droplet var worker *Worker for _, w := range m.workers { if w.privateAddr == ip { worker = w break } } if worker == nil { fmt.Printf("Message received from unknown worker '%s'. Skipping...\n", ip) continue } var loadAvg float64 if loadAvg, err = strconv.ParseFloat(string(loadAvgString), 64); err != nil { utils.Die("ParseFloat(): %s", err.Error()) } // Set their load average and append this worker's load average to the list worker.loadAvg = loadAvg loadAvgs = append(loadAvgs, loadAvg) } // Compute the average loadAvg var loadAvg float64 for _, avg := range loadAvgs { loadAvg += avg } loadAvg /= float64(len(loadAvgs)) // Send the load averages if !math.IsNaN(loadAvg) { c <- loadAvg } // Wait time.Sleep(m.queryInterval) } }