本文共 3215 字,大约阅读时间需要 10 分钟。
# /swift/proxy/server.pyclass Application(object): def __call__(self, env, start_response): """ WSGI entry point. Wraps env in swob.Request object and passes it down. :param env: WSGI environment dictionary :param start_response: WSGI callable """ try: if self.memcache is None: self.memcache = cache_from_env(env, True) req = self.update_request(Request(env)) #处理消息入口 return self.handle_request(req)(env, start_response) def handle_request(self, req): try: #根据请求中的信息得到相应Controller中的函数 handler = getattr(controller, req.method) getattr(handler, 'publicly_accessible') except AttributeError: allowed_methods = getattr(controller, 'allowed_methods', set()) return HTTPMethodNotAllowed( request=req, headers={'Allow': ', '.join(allowed_methods)}) if 'swift.authorize' in req.environ: resp = req.environ['swift.authorize'](req) if not resp and not req.headers.get('X-Copy-From-Account') \ and not req.headers.get('Destination-Account'): del req.environ['swift.authorize'] else: if not getattr(handler, 'delay_denial', None): return resp req.environ['swift.orig_req_method'] = req.method 调用相应Controller中的函数进行处理 return handler(req)
#swift/proxy/controllers/account.pyclass AccountController(Controller): def PUT(self, req): """HTTP PUT request handler.""" if not self.app.allow_account_management: return HTTPMethodNotAllowed( request=req, headers={'Allow': ', '.join(self.allowed_methods)}) error_response = check_metadata(req, 'account') if error_response: return error_response if len(self.account_name) > constraints.MAX_ACCOUNT_NAME_LENGTH: resp = HTTPBadRequest(request=req) resp.body = 'Account name length of %d longer than %d' % \ (len(self.account_name), constraints.MAX_ACCOUNT_NAME_LENGTH) return resp #account_ring即为Proxy Server在初始化时为Account创建的Ring #get_nodes()返回包含该Account内容的Partition account_partition, accounts = \ self.app.account_ring.get_nodes(self.account_name) headers = self.generate_request_headers(req, transfer=True) clear_info_cache(self.app, req.environ, self.account_name) #make_requests()会首先获得包含该parttion及其副本的所有节点,然后依次将请求发送到每个节点,直到其中一个节点返回正确的结果为止 resp = self.make_requests( req, self.app.account_ring, account_partition, 'PUT', req.swift_entity_path, [headers] * len(accounts)) self.add_acls_from_sys_metadata(resp) return resp
转载地址:http://ylej.baihongyu.com/