一直在努力
分类: 服务器与存储
2012-08-21 15:49:32
研究proxy/server.py中对于http请求的处理。proxy-server的作用是捕获所有对swift的HTTP请求,然后将处理的请求发送至storagenode进行处理。proxy/server.py中定义了proxy-server的Application类,和处理请求的*Controller类,类图如下:
图 1 proxy.server定义的Controller类
proxy/server.py的app_factory方法返回的是Application的实例,相比其父类BaseApplication,Application在handle_request()方法中来处理发送来的HTTP请求。过程如下所示:
1. Application类继承了父类BaseApplication,当用户请求发送时,__call__函数接受用户请求,获取env, start_response两个参数。
2. HTTP请求解析使用的webob模块提供的Request类解析,得到解析后的请求对象req。
3. 调用Application类定义的hand_request函数,该函数返回请求处理的响应结构体,而实际上该handle_request函数反调用BaseApplication类的handle_request函数进行请求处理。
4. handle_request函数,首先处理HTTP请求异常情况,异常请求返回使用的webob模块提供的现有函数。
5. 真正的处理过程在于:解析请求的uri即req.path,得到需要处理的请求是account、object还是container,然后生成对应的controller实例,处理请求。
6. 具体的controller类如类图所示,proxy server分析请求的方法req.method,对应的controller实例调用对象的method处理方法。分别提供不同的http请求方法的处理方式PUT/GET/DELETE/HEAD。
7. controller类主要是根据用户请求,计算出请求所在的ring对应的partition和node、dev等信息,然后与对应的node节点建立http连接,发送http请求,等待请求处理的结果,将处理结果返回给用户。
class controller有3个派生类ObjectController、ContainerController、AccountController