コード例 #1
0
        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)
コード例 #2
0
        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)
コード例 #3
0
    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
コード例 #4
0
 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)
     )
コード例 #5
0
    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
コード例 #6
0
 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))