博客
关于我
Swift中的Account Server代码解读
阅读量:184 次
发布时间:2019-02-28

本文共 3931 字,大约阅读时间需要 13 分钟。

Swift的Account Server、Container Server和Object Server通过Paste Deploy加载WSGI Application,分别由AccountController、ContainerController和ObjectController处理用户的HTTP请求。这些服务与Proxy Server类似,均通过run_wsgi()函数启动。Account Server的配置文件位于/etc/swift/account-server/目录下。

Paste Deploy的配置文件中,[pipeline:main]管道定义了健康检查和重建功能,接着调用account-server模块。setup.cfg文件定义了entry_points,指定了各个服务的app_factory函数,包括swift.account.server、swift.container.server等。

结合配置文件和setup.cfg,Paste Deploy最终使用swift.account.server模块的app_factory函数加载Account Server的WSGI Application,即swift.account.server.AccountController。该Controller与swift/proxy/controllers目录下的Controller不同,后者负责将HTTP请求转发给Account Server,而AccountController则是对请求的最终处理。

以PUT操作为例,Account PUT请求有两种语义:一种是创建Account,另一种是创建Account中的Container。两者的区别在于路径参数是否包含Container信息。

AccountController的实现如下:

class AccountController(object):    """WSGI controller for the account server."""    def PUT(self, req):        """Handle HTTP PUT request."""        # 从请求参数中获取drive, part, account, container信息        drive, part, account, container = split_and_validate_path(req, 3, 4)        if self.mount_check and not check_mount(self.root, drive):            return HTTPInsufficientStorage(drive=drive, request=req)                if container:            # PUT account container            if 'x-timestamp' not in req.headers:                timestamp = Timestamp(time.time())            else:                timestamp = valid_timestamp(req)                        pending_timeout = None            container_policy_index = req.headers.get('X-Backend-Storage-Policy-Index', 0)            if 'x-trans-id' in req.headers:                pending_timeout = 3                        broker = self._get_account_broker(drive, part, account, pending_timeout=pending_timeout)            if account.startswith(self.auto_create_account_prefix) and not os.path.exists(broker.db_file):                try:                    broker.initialize(timestamp.internal)                except DatabaseAlreadyExists:                    pass            if req.headers.get('x-account-override-deleted', 'no').lower() != 'yes' and broker.is_deleted():                return HTTPNotFound(request=req)                        broker.put_container(container, req.headers['x-put-timestamp'],                                  req.headers['x-delete-timestamp'],                                  req.headers['x-object-count'],                                  req.headers['x-bytes-used'],                                  container_policy_index)            if req.headers['x-delete-timestamp'] > req.headers['x-put-timestamp']:                return HTTPNoContent(request=req)            else:                return HTTPCreated(request=req)        else:            # PUT account            timestamp = valid_timestamp(req)            broker = self._get_account_broker(drive, part, account)            if not os.path.exists(broker.db_file):                try:                    broker.initialize(timestamp.internal)                    created = True                except DatabaseAlreadyExists:                    created = False            elif broker.is_status_deleted():                return self._deleted_response(broker, req, HTTPForbidden, body='Recently deleted')            else:                created = broker.is_deleted()                broker.update_put_timestamp(timestamp.internal)                if broker.is_deleted():                    return HTTPConflict(request=req)                        metadata = {}            metadata.update((key, (value, timestamp.internal)) for key, value in req.headers.iteritems() if is_sys_or_user_meta('account', key))            if metadata:                broker.update_metadata(metadata, validate_metadata=True)                        if created:                return HTTPCreated(request=req)            else:                return HTTPAccepted(request=req)

该Controller通过路径参数分割和验证请求,检查存储位置并调用相应的Broker进行操作。Broker负责处理具体的账户操作,包括创建账户和账户中的容器。

转载地址:http://flej.baihongyu.com/

你可能感兴趣的文章
python制作甘特图的基本知识(附Demo)
查看>>
python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
查看>>
Python到底能做什么?它的优点在哪?
查看>>
python利用pytorch库导出图像分割算子
查看>>
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>
python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
查看>>
python列表前几个_python之列表
查看>>
python列表元组
查看>>
Python列表/元组/字典和集合使用
查看>>
python列表 行列选择_python_pandas_dataframe_行列选择_切片操作
查看>>