()
| 127 | } |
| 128 | |
| 129 | func (n *Node) initNode() error { |
| 130 | // Current node is not master server and does not contains master |
| 131 | // address, so running in singleton mode |
| 132 | if !n.IsMaster && n.AdvertiseAddr == "" { |
| 133 | return nil |
| 134 | } |
| 135 | |
| 136 | listener, err := net.Listen("tcp", n.ServiceAddr) |
| 137 | if err != nil { |
| 138 | return err |
| 139 | } |
| 140 | |
| 141 | // Initialize the gRPC server and register service |
| 142 | n.server = grpc.NewServer() |
| 143 | n.rpcClient = newRPCClient() |
| 144 | clusterpb.RegisterMemberServer(n.server, n) |
| 145 | |
| 146 | go func() { |
| 147 | err := n.server.Serve(listener) |
| 148 | if err != nil { |
| 149 | log.Fatalf("Start current node failed: %v", err) |
| 150 | } |
| 151 | }() |
| 152 | |
| 153 | if n.IsMaster { |
| 154 | clusterpb.RegisterMasterServer(n.server, n.cluster) |
| 155 | member := &Member{ |
| 156 | isMaster: true, |
| 157 | memberInfo: &clusterpb.MemberInfo{ |
| 158 | Label: n.Label, |
| 159 | ServiceAddr: n.ServiceAddr, |
| 160 | Services: n.handler.LocalService(), |
| 161 | }, |
| 162 | } |
| 163 | n.cluster.members = append(n.cluster.members, member) |
| 164 | n.cluster.setRpcClient(n.rpcClient) |
| 165 | } else { |
| 166 | pool, err := n.rpcClient.getConnPool(n.AdvertiseAddr) |
| 167 | if err != nil { |
| 168 | return err |
| 169 | } |
| 170 | client := clusterpb.NewMasterClient(pool.Get()) |
| 171 | request := &clusterpb.RegisterRequest{ |
| 172 | MemberInfo: &clusterpb.MemberInfo{ |
| 173 | Label: n.Label, |
| 174 | ServiceAddr: n.ServiceAddr, |
| 175 | Services: n.handler.LocalService(), |
| 176 | }, |
| 177 | } |
| 178 | for { |
| 179 | resp, err := client.Register(context.Background(), request) |
| 180 | if err == nil { |
| 181 | n.handler.initRemoteService(resp.Members) |
| 182 | n.cluster.initMembers(resp.Members) |
| 183 | break |
| 184 | } |
| 185 | log.Println("Register current node to cluster failed", err, "and will retry in", n.RetryInterval.String()) |
| 186 | time.Sleep(n.RetryInterval) |
no test coverage detected