def Subscribe(self, request, context): """BlockGenerator 가 broadcast(unconfirmed or confirmed block) 하는 채널에 Peer 를 등록한다. :param request: :param context: :return: """ channel_name = conf.LOOPCHAIN_DEFAULT_CHANNEL if request.channel == '' else request.channel if not request.peer_id or not request.peer_target: return loopchain_pb2.CommonReply( response_code=message_code.get_response_code(message_code.Response.fail_wrong_subscribe_info), message=message_code.get_response_msg(message_code.Response.fail_wrong_subscribe_info) ) channel_stub = StubCollection().channel_stubs[channel_name] peer_list = [target['peer_target'] for target in self.peer_service.channel_infos[channel_name]["peers"]] if (request.peer_target in peer_list and conf.ENABLE_CHANNEL_AUTH) or \ (request.node_type == loopchain_pb2.CommunityNode and not conf.ENABLE_CHANNEL_AUTH): channel_stub.sync_task().add_audience(peer_target=request.peer_target) util.logger.spam(f"peer_outer_service::Subscribe add_audience " f"target({request.peer_target}) in channel({request.channel})") else: logging.error(f"This target({request.peer_target}, {request.node_type}) failed to subscribe.") return loopchain_pb2.CommonReply(response_code=message_code.get_response_code(message_code.Response.fail), message=message_code.get_response_msg("Unknown type peer")) return loopchain_pb2.CommonReply(response_code=message_code.get_response_code(message_code.Response.success), message=message_code.get_response_msg(message_code.Response.success))
def Subscribe(self, request, context): """RadioStation 이 broadcast 하는 채널에 Peer 를 등록한다. :param request: SubscribeRequest :param context: :return: CommonReply """ channel = conf.LOOPCHAIN_DEFAULT_CHANNEL if request.channel == '' else request.channel logging.debug("Radio Station Subscription peer_id: " + str(request)) ObjectManager().rs_service.channel_manager.add_audience(channel, request.peer_target) peer: PeerInfo = ObjectManager().rs_service.channel_manager.get_peer_manager(channel).update_peer_status( peer_id=request.peer_id, peer_status=PeerStatus.connected) try: peer_dumped = peer.dump() request.peer_order = peer.order request.peer_object = peer_dumped ObjectManager().rs_service.channel_manager.get_peer_manager(channel).announce_new_peer(request) return loopchain_pb2.CommonReply( response_code=message_code.get_response_code(message_code.Response.success), message=message_code.get_response_msg(message_code.Response.success)) except Exception as e: logging.warning("Fail Peer Dump: " + str(e)) return loopchain_pb2.CommonReply(response_code=message_code.get_response_code(message_code.Response.fail), message=message_code.get_response_msg(message_code.Response.fail))
def UnSubscribe(self, request, context): """BlockGenerator 의 broadcast 채널에서 Peer 를 제외한다. :param request: :param context: :return: """ channel_name = conf.LOOPCHAIN_DEFAULT_CHANNEL if request.channel == '' else request.channel channel_stub = StubCollection().channel_stubs[channel_name] peer_list = [target['peer_target'] for target in self.peer_service.channel_infos[channel_name]["peers"]] if (request.peer_target in peer_list and conf.ENABLE_CHANNEL_AUTH) or \ (request.node_type == loopchain_pb2.CommunityNode and not conf.ENABLE_CHANNEL_AUTH): asyncio.run_coroutine_threadsafe( channel_stub.async_task().remove_audience(peer_target=request.peer_target), self.peer_service.inner_service.loop ) util.logger.spam(f"peer_outer_service::Unsubscribe remove_audience target({request.peer_target}) " f"in channel({request.channel})") else: logging.error(f"This target({request.peer_target}), {request.node_type} failed to unsubscribe.") return loopchain_pb2.CommonReply(response_code=message_code.get_response_code(message_code.Response.fail), message=message_code.get_response_msg("Unknown type peer")) return loopchain_pb2.CommonReply(response_code=message_code.get_response_code(message_code.Response.success), message=message_code.get_response_msg(message_code.Response.success))
def Subscribe(self, request, context): """RadioStation 이 broadcast 하는 채널에 Peer 를 등록한다. :param request: SubscribeRequest :param context: :return: CommonReply """ channel = conf.LOOPCHAIN_DEFAULT_CHANNEL if request.channel == '' else request.channel logging.debug("Radio Station Subscription peer_id: " + str(request)) ObjectManager().rs_service.common_service.add_audience(request) peer = ObjectManager().rs_service.channel_manager.get_peer_manager( channel).update_peer_status(peer_id=request.peer_id, peer_status=PeerStatus.connected) try: peer_dump = pickle.dumps(peer) request.peer_order = peer.order request.peer_object = peer_dump # self.__broadcast_new_peer(request) # TODO RS subsribe 를 이용하는 경우, RS 가 재시작시 peer broadcast 가 전체로 되지 않는 문제가 있다. # peer_list 를 이용하여 broadcast 하는 구조가되면 RS 혹은 Leader 에 대한 Subscribe 구조는 유효하지 않다. # 하지만 broadcast process 는 peer_list broadcast 인 경우 사용되어지지 않는다. peer_list 에서 broadcast 하는 동안 # block 되는 구조. broadcast Process 를 peer_list 를 이용한 broadcast 에서도 활용할 수 있게 하거나. # RS 혹은 Leader 가 재시작 후에 Subscribe 정보를 복원하게 하거나. # 혹은 peer_list 가 broadcast 하여도 성능상(동시성에 있어) 문제가 없는지 보증하여야 한다. TODO TODO TODO ObjectManager().rs_service.channel_manager.get_peer_manager( channel).announce_new_peer(request) # logging.debug("get_IP_of_peers_in_group: " + str(self.__peer_manager.get_IP_of_peers_in_group())) return loopchain_pb2.CommonReply( response_code=message_code.get_response_code( message_code.Response.success), message=message_code.get_response_msg( message_code.Response.success)) except pickle.PicklingError as e: logging.warning("Fail Peer Dump: " + str(e)) return loopchain_pb2.CommonReply( response_code=message_code.get_response_code( message_code.Response.fail), message=message_code.get_response_msg( message_code.Response.fail))
def Subscribe(self, request, context): """BlockGenerator 가 broadcast(unconfirmed or confirmed block) 하는 채널에 Peer 를 등록한다. :param request: :param context: :return: """ self.peer_service.common_service.add_audience(request) return loopchain_pb2.CommonReply(response_code=message_code.get_response_code(message_code.Response.success), message=message_code.get_response_msg(message_code.Response.success))
def Subscribe(self, request, context): """RadioStation 이 broadcast 하는 채널에 Peer 를 등록한다. :param request: SubscribeRequest :param context: :return: CommonReply """ logging.debug("Radio Station Subscription peer_id: " + str(request)) self.__common_service.add_audience(request) return loopchain_pb2.CommonReply( response_code=message_code.get_response_code( message_code.Response.success), message=message_code.get_response_msg( message_code.Response.success))