Exemple #1
0
 async def _list_members(self, request):
     timeout_seconds = request.timeout_seconds
     if 0 == timeout_seconds:
         return notification_service_pb2.ListMembersResponse(
             return_code=notification_service_pb2.ReturnStatus.SUCCESS,
             return_msg='',
             members=[
                 member_to_proto(member)
                 for member in self.ha_manager.get_living_members()
             ])
     else:
         start = time.time()
         members = self.ha_manager.get_living_members()
         async with self.member_updated_condition:
             while time.time() - start < timeout_seconds:
                 try:
                     await asyncio.wait_for(
                         self.member_updated_condition.wait(),
                         timeout_seconds - time.time() + start)
                     members = self.ha_manager.get_living_members()
                     break
                 except asyncio.TimeoutError:
                     pass
         return notification_service_pb2.ListMembersResponse(
             return_code=notification_service_pb2.ReturnStatus.SUCCESS,
             return_msg='',
             members=[member_to_proto(member) for member in members])
 def start_heartbeat(self):
     while self.running:
         try:
             # do heartbeat
             self.storage.clear_dead_members(self.ttl_ms)
             self.storage.update_member(self.server_uri, self.uuid)
             self.living_members = self.storage.list_living_members(
                 self.ttl_ms)
             if not self.notified_others_after_start:
                 for member in self.living_members:
                     if member.server_uri == self.server_uri:
                         continue
                     channel = grpc.insecure_channel(member.server_uri)
                     self.member_connections[member.server_uri] = \
                         notification_service_pb2_grpc.NotificationServiceStub(channel)
                     try:
                         self.member_connections[
                             member.server_uri].notifyNewMember(
                                 NotifyNewMemberRequest(
                                     member=member_to_proto(
                                         Member(
                                             1, self.server_uri,
                                             int(time.time_ns() /
                                                 1000000)))))
                     except grpc.RpcError:
                         logging.error("Notify new member to '%s' failed." %
                                       member.server_uri,
                                       exc_info=True)
                 self.notified_others_after_start = True
         except Exception as e:
             logging.error(
                 "Exception thrown when send heartbeat to the HA storage.",
                 exc_info=True)
         sleep_and_detecting_running(self.ttl_ms / 2, lambda: self.running)