def _call(): result = self._route_call( None, self._link, async.get_retid(), Auth.get_current_idendesc(), dst, func_name, timeout, list(args) ) if callback != None: callback(result)
def _call(): result = self._route_call(None, self._link, async .get_retid(), Auth.get_current_idendesc(), dst, func_name, timeout, list(args)) if callback != None: callback(result)
def _route_call(self, in_conn, caller_link, caller_retid, idendesc, dst, func_name, timeout, param): def __add_wait_caller(conn_link): self._conn_retidmap[conn_link][caller_retid] = { "timer": self._ioloop.add_timeout( datetime.timedelta(milliseconds=timeout), lambda: self._ret_call(caller_link, caller_retid, (False, "Etimeout")), ), "caller_link": caller_link, "caller_retid": caller_retid, } def __del_wait_caller(conn_link): wait = self._conn_retidmap[conn_link].pop(caller_retid) self._ioloop.remove_timeout(wait["timer"]) def __ret(result): if caller_link == self._link: return result else: conn = self._request_conn(caller_link) if conn != None: self._send_msg_ret(conn, caller_link, caller_retid, result) if in_conn != None: in_link = in_conn.link else: in_link = self._link iden = self._auth.verify_iden(in_link, idendesc) if iden == None: return __ret((False, "Eilliden")) try: dst_part = dst.split("/") dst_link = "".join(["/", dst_part[1], "/", dst_part[2], "/"]) dst_path = dst_part[3:-1] except Exception: return __ret((False, "Enoexist")) if dst_link == self._link: __add_wait_caller(self._link) try: with Auth.change_current_iden(None, self._auth): dpart = deque(dst_path) child, name, filt = self._callpath_root for func in filt: func(dpart, func_name) for part in dst_path: child, name, filt = child[part] dpart.popleft() for func in filt: func(dpart, func_name) func = name[func_name] except KeyError: return __ret((False, "Enoexist")) except Exception: return __ret((False, "Einternal")) if Auth.get_current_idendesc() == idendesc: result = func(*param) else: with Auth.change_current_iden(idendesc, self._auth): result = func(*param) __del_wait_caller(self._link) return __ret(result) else: conn = self._request_conn(dst_link) if conn == None: return __ret((False, "Enoexist")) else: if caller_link == self._link: __add_wait_caller(conn.link) self._send_msg_call(conn, caller_link, caller_retid, idendesc, dst, func_name, timeout, param) result = async.switch_top() __del_wait_caller(conn.link) return __ret(result) else: self._send_msg_call(conn, caller_link, caller_retid, idendesc, dst, func_name, timeout, param) return
def call(self, dst, func_name, timeout, *args): return self._route_call( None, self._link, async.get_retid(), Auth.get_current_idendesc(), dst, func_name, timeout, list(args) )
def _route_call(self, in_conn, caller_link, caller_retid, idendesc, dst, func_name, timeout, param): def __add_wait_caller(conn_link): self._conn_retidmap[conn_link][caller_retid] = { 'timer': self._ioloop.add_timeout( datetime.timedelta(milliseconds=timeout), lambda: self._ret_call(caller_link, caller_retid, (False, 'Etimeout'))), 'caller_link': caller_link, 'caller_retid': caller_retid } def __del_wait_caller(conn_link): wait = self._conn_retidmap[conn_link].pop(caller_retid) self._ioloop.remove_timeout(wait['timer']) def __ret(result): if caller_link == self._link: return result else: conn = self._request_conn(caller_link) if conn != None: self._send_msg_ret(conn, caller_link, caller_retid, result) if in_conn != None: in_link = in_conn.link else: in_link = self._link iden = self._auth.verify_iden(in_link, idendesc) if iden == None: return __ret((False, 'Eilliden')) try: dst_part = dst.split('/') dst_link = ''.join(['/', dst_part[1], '/', dst_part[2], '/']) dst_path = dst_part[3:-1] except Exception: return __ret((False, 'Enoexist')) if dst_link == self._link: __add_wait_caller(self._link) try: with Auth.change_current_iden(None, self._auth): dpart = deque(dst_path) child, name, filt = self._callpath_root for func in filt: func(dpart, func_name) for part in dst_path: child, name, filt = child[part] dpart.popleft() for func in filt: func(dpart, func_name) func = name[func_name] except KeyError: return __ret((False, 'Enoexist')) except Exception: return __ret((False, 'Einternal')) if Auth.get_current_idendesc() == idendesc: result = func(*param) else: with Auth.change_current_iden(idendesc, self._auth): result = func(*param) __del_wait_caller(self._link) return __ret(result) else: conn = self._request_conn(dst_link) if conn == None: return __ret((False, 'Enoexist')) else: if caller_link == self._link: __add_wait_caller(conn.link) self._send_msg_call(conn, caller_link, caller_retid, idendesc, dst, func_name, timeout, param) result = async .switch_top() __del_wait_caller(conn.link) return __ret(result) else: self._send_msg_call(conn, caller_link, caller_retid, idendesc, dst, func_name, timeout, param) return
def call(self, dst, func_name, timeout, *args): return self._route_call(None, self._link, async .get_retid(), Auth.get_current_idendesc(), dst, func_name, timeout, list(args))