Swift中的Container Server代码解读

类似于Account Server,Paste Deploy最终将使用swift.container.server模块的app_factory()函数加载Container Server的WSGI Application,即swift.account.server.ContainerController。
以Container Get操作为例:
Container Get的API参见官网: https://developer.openstack.org/api-ref/object-store/
Container Get操作代码分析
# swift/container/server.py
class ContainerController(object):
   def GET(self, req):
        """Handle HTTP GET request."""
        #从请求参数req中获取drive, part, account, container, object信息
        drive, part, account, container, obj = split_and_validate_path(
            req, 4, 5, True)
        #prefix、delimiter、marker、end_marker可以做为查询object的条件
        #比如可以利用prefix参数查询前缀为某个字符串的object
        path = get_param(req, 'path')
        prefix = get_param(req, 'prefix')
        delimiter = get_param(req, 'delimiter')
        if delimiter and (len(delimiter) > 1 or ord(delimiter) > 254):
            # delimiters can be made more flexible later
            return HTTPPreconditionFailed(body='Bad delimiter')
        marker = get_param(req, 'marker', '')
        end_marker = get_param(req, 'end_marker')
        limit = constraints.CONTAINER_LISTING_LIMIT
        given_limit = get_param(req, 'limit')
        if given_limit and given_limit.isdigit():
            limit = int(given_limit)
            if limit > constraints.CONTAINER_LISTING_LIMIT:
                return HTTPPreconditionFailed(
                    request=req,
                    body='Maximum limit is %d'
                    % constraints.CONTAINER_LISTING_LIMIT)
        out_content_type = get_listing_content_type(req)
        if self.mount_check and not check_mount(self.root, drive):
            return HTTPInsufficientStorage(drive=drive, request=req)
        #获取一个ControllerBroker类的实例,与Account Server类似,
        #Container的相关信息也是作为一个sqlite数据库文件存放在相应partition的
        #目录下。ControllerBroker类封装了对数据库文件进行访问的方法。
        broker = self._get_container_broker(drive, part, account, container,
                                            pending_timeout=0.1,
                                            stale_reads_ok=True)
        info, is_deleted = broker.get_info_is_deleted()
        resp_headers = gen_resp_headers(info, is_deleted=is_deleted)
        #判断是否被删除
        if is_deleted:
            return HTTPNotFound(request=req, headers=resp_headers)
        #调用ContainerBroker类的list_objects_iter()函数读取container数据库文件,返回object信息的列表
        container_list = broker.list_objects_iter(
            limit, marker, end_marker, prefix, delimiter, path,
            storage_policy_index=info['storage_policy_index'])
        return self.create_listing(req, out_content_type, info, resp_headers,
                                   broker.metadata, container_list, container)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值