/* ServiceClient.NewRequestInfo() create a new RequestInfo object specific to this service */ func (c *ServiceClient) NewRequestInfo() (ri *skynet.RequestInfo) { // TODO: Set ri = &skynet.RequestInfo{ RequestID: config.NewUUID(), } return }
// this function is the goroutine that owns this service - all thread-sensitive data needs to // be manipulated only through here. func (s *Service) mux() { loop: for { select { case conn := <-s.connectionChan: clientID := config.NewUUID() s.clientMutex.Lock() s.ClientInfo[clientID] = ClientInfo{ Address: conn.RemoteAddr(), } s.clientMutex.Unlock() // send the server handshake sh := skynet.ServiceHandshake{ Registered: s.Registered, ClientID: clientID, Name: s.Name, } encoder := bsonrpc.NewEncoder(conn) err := encoder.Encode(sh) if err != nil { log.Println(log.ERROR, "Failed to encode server handshake", err.Error()) continue } if !s.Registered { log.Println(log.ERROR, "Connection attempted while unregistered. Closing connection") conn.Close() continue } // read the client handshake var ch skynet.ClientHandshake decoder := bsonrpc.NewDecoder(conn) err = decoder.Decode(&ch) if err != nil { log.Println(log.ERROR, "Error calling bsonrpc.NewDecoder: "+err.Error()) continue } // here do stuff with the client handshake go func() { s.RPCServ.ServeCodec(bsonrpc.NewServerCodec(conn)) }() case register := <-s.registeredChan: if register { s.register() } else { s.unregister() } case <-s.shutdownChan: s.shutdown() case _ = <-s.doneChan: break loop } } }
func (s *SkynetDaemon) StartSubService(requestInfo *skynet.RequestInfo, in daemon.StartSubServiceRequest, out *daemon.StartSubServiceResponse) (err error) { out.UUID = config.NewUUID() log.Printf(log.TRACE, "%+v", SubserviceStart{ BinaryName: in.BinaryName, Args: in.Args, }) ss, err := NewSubService(in.BinaryName, in.Args, out.UUID, in.Registered) if err != nil { return } s.serviceLock.Lock() s.Services[out.UUID] = ss s.serviceLock.Unlock() start, startErr := ss.Start() if startErr != nil { return errors.New("Service failed to start: " + startErr.Error()) } else if !start { return errors.New("Service failed to start") } tc := time.Tick(RerunWait * 2) go func() { // Wait for startup timer to see if we're still running // We want to avoid keeping a state of a large list of services that failed to start <-tc if ss.IsRunning() { s.saveState() } }() return }