代理

代理控制器

基础

class swift.proxy.controllers.base.ByteCountEnforcer(file_like, nbytes)

基类: object

强制后续对 file_like.read() 的调用在耗尽之前至少提供 字节。

如果 file_like 未能做到,则会引发 ShortReadError。

如果读取超过 字节,我们不关心。

read(amt=None)
class swift.proxy.controllers.base.Controller(app)

基类: object

代理的基本 WSGI 控制器类

GET(req)

HTTP GET 请求的处理程序。

参数:

req – 客户端请求

返回值:

对客户端的响应

GETorHEAD_base(req, server_type, node_iter, partition, path, concurrency=1, policy=None)

HTTP GET 或 HEAD 请求的基本处理程序。

参数:
  • req – swob.Request 对象

  • server_type – 日志中使用的服务器类型

  • node_iter – 从中获取节点的迭代器

  • partition – 分区

  • path – 请求路径

  • concurrency – 并发运行的请求数

  • policy – 策略实例,如果为 Account 或 Container 则为 None

返回值:

swob.Response 对象

HEAD(req)

HTTP HEAD 请求的处理程序。

参数:

req – 客户端请求

返回值:

对客户端的响应

OPTIONS(req)

OPTIONS 请求的基本处理程序

参数:

req – swob.Request 对象

返回值:

swob.Response 对象

account_info(account, req)

获取账户信息,并验证账户是否存在。

参数:
  • account – 要获取信息的账户的本地字符串名称

  • req – 调用者的 HTTP 请求上下文对象

返回值:

(账户分区,账户节点,容器计数)的元组,如果不存在则为(None, None, None)

property allowed_methods
autocreate_account(req, account)

自动创建账户

参数:
  • req – 导致此自动创建的请求

  • account – 未加引号的账户名称

best_response(req, statuses, reasons, bodies, server_type, etag=None, headers=None, overrides=None, quorum_size=None)

给定来自多个服务器的响应列表,选择最佳响应返回给 API。

参数:
  • req – swob.Request 对象

  • statuses – 返回的状态列表

  • reasons – 每个状态的原因列表

  • bodies – 每个响应的主体

  • server_type – 响应来源的服务器类型

  • etag – etag

  • headers – 每个响应的头部

  • overrides – 缺乏法定人数时应用的覆盖

  • quorum_size – 要使用的法定人数大小

返回值:

设置了正确状态、主体等的 swob.Response 对象

container_info(account, container, req)

获取容器信息,从而验证容器是否存在。这也将验证账户是否存在。

参数:
  • account – 容器的本地字符串账户名称

  • container – 要查找的本地字符串容器名称

  • req – 调用者的 HTTP 请求上下文对象

返回值:

包含至少容器分区 ('partition')、容器节点 ('containers')、容器读取 acl ('read_acl')、容器写入 acl ('write_acl') 和容器同步密钥 ('sync_key') 的字典。如果容器不存在,则值设置为 None。

generate_request_headers(orig_req=None, additional=None, transfer=False)

创建一个将在后端请求中使用的头部字典

参数:
  • orig_req – 客户端发送给代理的原始请求

  • additional – 要发送给后端的附加头部

  • transfer – 如果为 True,则从原始客户端请求中传输头部

返回值:

头部字典

get_name_length_limit()
have_quorum(statuses, node_count, quorum=None)

给定来自多个请求的状态列表,判断是否已经可以确定法定人数响应。

参数:
  • statuses – 返回的状态列表

  • node_count – 查询的节点数(基本上是环计数)

  • quorum – 法定人数所需的状态数

返回值:

True 或 False,取决于法定人数是否建立

is_origin_allowed(cors_info, origin)

给定的 Origin 是否允许向此资源发出请求

参数:
  • cors_info – 资源的 CORS 相关元数据头部

  • origin – 发出请求的 Origin

返回值:

True 或 False

property logger
make_requests(req, ring, part, method, path, headers, query_string='', overrides=None, node_count=None, node_iterator=None, body=None)

向多个节点发送 HTTP 请求并聚合结果。它并发地尝试主节点,然后根据需要迭代切换节点。

参数:
  • req – 客户端发送的请求

  • ring – 用于查找后端服务器的环

  • part – 分区号

  • method – 发送给后端的方法

  • path – 发送给后端的路径(完整路径最终为 /<$device>/<$part>/<$path>)

  • headers – 字典列表,每个字典代表一个应进行的后端请求。

  • query_string – 可选的查询字符串发送给后端

  • overrides – 可选的返回状态覆盖映射,用于覆盖请求的返回状态。

  • node_count – 可选的发送请求的节点数。

  • node_iterator – 可选的节点迭代器。

  • body – 用作请求主体的字节字符串。尽量保持小。

返回值:

swob.Response 对象

pass_through_headers = []
property private_methods
server_type = 'Base'
transfer_headers(src_headers, dst_headers)

将合法头部从原始客户端请求传输到将用作后端请求头部的字典

参数:
  • src_headers – 原始客户端请求头部的字典

  • dst_headers – 后端请求头部的字典

class swift.proxy.controllers.base.GetOrHeadHandler(app, req, server_type, node_iter, partition, path, backend_headers, concurrency=1, policy=None, logger=None)

基类:GetterBase

处理对后端服务器的 GET 请求。

参数:
  • app – 代理应用。

  • reqswob.Request 的实例。

  • server_type – 日志中使用的服务器类型

  • node_iter – 生成节点的迭代器。

  • partition – 分区。

  • path – 请求路径。

  • backend_headers – 将随后端请求发送的头部字典。

  • concurrency – 并发运行的请求数。

  • policy – 策略实例,如果为 Account 或 Container 则为 None。

  • logger – 日志记录器实例。

get_working_response()
property last_headers
property last_status
class swift.proxy.controllers.base.GetterBase(app, req, node_iter, partition, policy, path, backend_headers, node_timeout, resource_type, logger=None)

基类: object

此基类提供处理对后端服务器的 GET 请求的辅助方法。

参数:
  • app – 代理应用。

  • reqswob.Request 的实例。

  • node_iter – 生成节点的迭代器。

  • partition – 分区。

  • policy – 策略实例,如果为 Account 或 Container 则为 None。

  • path – 请求路径。

  • backend_headers – 将随后端请求发送的头部字典。

  • node_timeout – 后端请求的超时值。

  • resource_type – 所访问资源类型的字符串描述;resource type 用于日志中,不一定是服务器类型。

  • logger – 日志记录器实例。

fast_forward(num_bytes)

将跳过当前范围内的 num_bytes。

参数 num_bytes:

此请求已读取的字节数。这将更改 Range 头部,以便下一个请求从上次停止的位置开始。

引发:
  • HTTPRequestedRangeNotSatisfiable – 如果 begin + num_bytes > end of range + 1

  • RangeAlreadyComplete – 如果 begin + num_bytes == end of range + 1

learn_size_from_content_range(start, end, length)

将我们 Range 头部中的第一个字节范围设置为从响应的 Content-Range 头部学到的值;如果给定了一个完全指定的范围(例如“bytes=123-456”),则此操作为空。

如果给定了一个半指定的范围(例如“bytes=123-”或“bytes=-456”),则这会将 Range 头部更改为语义等效的头部,并且它允许我们在适当的边界上恢复,而不是仅仅在某处片段的中间。

pop_range()

从我们的 Range 头部中移除第一个字节范围。

这在字节范围完全发送给客户端后使用;这样,如果我们需要从另一个对象服务器恢复下载,我们就不会重新获取客户端已有的字节范围。

如果我么没有 Range 头部,则此操作为空。

class swift.proxy.controllers.base.GetterSource(app, resp, node)

基类: object

封装从中读取 GET 响应的源的属性。

参数:
  • app – 代理应用。

  • respHTTPResponse 的实例。

  • node – 描述返回响应的节点的字典。

app
close()
node
property parts_iter
resp
property timestamp

将 swift http 响应的时间戳提供为浮点值。用作排序键。

返回值:

utils.Timestamp 的实例

class swift.proxy.controllers.base.NodeIter(server_type, app, ring, partition, logger, request, node_iter=None, policy=None)

基类: object

生成环分区节点,跳过错误受限节点并停止在可配置的节点数。如果后续生成的节点错误受限,将生成一个额外的节点来代替它。

请注意,如果您将从多个 greenlet 并发迭代此对象,您将需要使用 swift.common.utils.GreenthreadSafeIterator 来序列化访问。否则,您可能会从并发访问中获得 ValueError。(您也可能不会,这取决于日志的配置方式、socket IO 和 eventlet 的变化以及月相。)

参数:
  • server_type – ‘account’、‘container’ 或 ‘object’ 之一

  • app – 代理应用

  • ring – 从中获取节点的环

  • partition – 为其生成节点的环分区

  • logger – 一个 logger 实例

  • request – 生成的节点将根据 request 头部使用 use_replication 进行注释。

  • node_iter – 要尝试的可选节点迭代器。如果您想过滤或重新排序节点,这很有用。

  • policyBaseStoragePolicy 的实例。对于账户或容器环,这应该为 None。

log_handoffs(handoffs)

如果启用了切换日志记录且切换并非预期,则记录切换请求。

我们仅在切换计数超出正常情况下的预期值(即 (request_node_count - num_primaries))时记录切换,当切换计数高于此值时,意味着其中一个主节点由于错误限制而被跳过,而我们尚未消耗完所有 nodes_left。

property primaries_left
set_node_provider(callback)

安装一个回调函数,该函数将在调用 next() 期间使用以获取备用节点,而不是从迭代器返回下一个节点。

参数:

callback – 一个无参数函数,应返回节点字典或 None。

swift.proxy.controllers.base.bytes_to_skip(record_size, range_start)

假设一个对象由 N 条记录组成,其中前 N-1 条记录大小相同,最后一条记录最多与前 N-1 条记录大小相同,但可能更小。

当发出范围请求时,它可能从部分记录开始。这必须被丢弃,以免消费者获得错误数据。对于后缀字节范围请求尤其如此,例如“Range: bytes=-12345”,其中在发出请求时对象的大小未知。

此函数计算必须丢弃的字节数,以确保仅生成完整记录。纠删码解码需要此功能。

此函数可以内联,但由于多次尝试才正确,因此需要一些有针对性的单元测试,因此将其提取出来。

swift.proxy.controllers.base.clear_info_cache(env, account, container=None, shard=None)

清除 memcache 和 env 中的缓存信息

参数:
  • env – WSGI 请求环境

  • account – 账户名称

  • container – 如果清除容器信息,则为容器名称,否则为 None

  • shard – 如果清除容器分片范围信息,则为分片状态,否则为 None

swift.proxy.controllers.base.close_swift_conn(src)

强制关闭到后端的 http 连接。

参数:

src – 后端响应

swift.proxy.controllers.base.cors_validation(func)

装饰器,用于检查请求是否为 CORS 请求,如果是,则检查其是否有效。

参数:

func – 要检查的函数

swift.proxy.controllers.base.delay_denial(func)

装饰器,用于声明哪些方法应延迟 swift.authorize 调用。这样,该方法就可以用授权系统可能需要的额外信息填充 Request 对象。

参数:

func – 授权将延迟的函数

swift.proxy.controllers.base.get_account_info(env, app, swift_source=None)

根据 env 和 app 获取账户的信息结构。这对于中间件很有用。

注意

此调用绕过身份验证。成功不意味着请求具有对账户的授权。

引发:

ValueError – 当路径不包含账户时

swift.proxy.controllers.base.get_cache_key(account, container=None, obj=None, shard=None)

获取 memcache 和 env['swift.infocache'](cache_key)的键,其中缓存了账户、容器和对象的信息。

参数:
  • account – 账户名称

  • container – 容器名称(如果为账户则为 None)

  • obj – 对象名称(如果为账户或容器则为 None)

  • shard – 容器查询的分片状态;通常为 'updating' 或 'listing'(需要账户和容器;不能与 obj 一起使用)

返回值:

(本地)字符串 cache_key

swift.proxy.controllers.base.get_container_info(env, app, swift_source=None, cache_only=False)

根据 env 和 app 获取容器的信息结构。这对于中间件很有用。

参数:
  • env – 当前请求使用的环境

  • app – 应用程序对象

  • swift_source – 用于将请求标记为源自中间件。将记录在代理日志中。

  • cache_only – 如果为 true,表示调用者在缓存未命中时不想 HEAD 后端容器。

返回值:

对象信息

注意

此调用绕过身份验证。成功不意味着请求具有对容器的授权。

swift.proxy.controllers.base.get_info(app, env, account, container=None, swift_source=None)

获取账户或容器信息

注意:此调用绕过身份验证。成功不意味着请求具有对信息的授权。

请求具有对信息的授权。

参数:
  • app – 应用程序对象

  • env – 当前请求使用的环境

  • account – 账户的未加引号的名称

  • container – 容器的未加引号的名称(如果为账户则为 None)

  • swift_source – 在检索账户或容器信息时进行的任何子请求的 swift 源日志

返回值:

字典中指定实体的信息。有关字典内容的详细信息,请参阅 get_account_info 和 get_container_info。

swift.proxy.controllers.base.get_namespaces_from_cache(req, cache_key, skip_chance)

从 infocache 或 memcache 获取缓存的命名空间。

参数:
  • reqswift.common.swob.Request 对象。

  • cache_key – infocache 和 memcache 的缓存键。

  • skip_chance – 跳过 memcache 查找的概率。

返回值:

一个元组 (value, cache state)。如果 memcache 中找到非空列表,value 是 swift.common.utils.NamespaceBoundList 的实例。否则,value 是 None,例如如果跳过了 memcache 查找,或者没有找到值,或者找到了空列表。

swift.proxy.controllers.base.get_object_info(env, app, path=None, swift_source=None)

根据 env 和 app 获取对象的信息结构。这对于中间件很有用。

注意

此调用绕过身份验证。成功不意味着请求具有对对象的授权。

swift.proxy.controllers.base.headers_from_container_info(info)

从容器信息字典构造 HeaderKeyDict。

参数:

info – 容器元数据的字典

返回值:

HeaderKeyDict 或 None,如果 info 为 None 或无法构造任何必需的头部

swift.proxy.controllers.base.headers_to_account_info(headers, status_int=200)

根据响应头部构造可缓存的账户信息字典。

swift.proxy.controllers.base.headers_to_container_info(headers, status_int=200)

根据响应头部构造可缓存的容器信息字典。

swift.proxy.controllers.base.headers_to_object_info(headers, status_int=200)

根据响应头部构造可缓存的对象信息字典。

swift.proxy.controllers.base.is_good_source(status, server_type)

指示对后端发出的请求是否找到了它正在寻找的内容。

参数:
  • resp – 后端响应。

  • server_type – 服务器类型:“Account”、“Container”或“Object”。

返回值:

如果响应状态码可接受则为 True,否则为 False。

swift.proxy.controllers.base.is_useful_response(resp, node)
swift.proxy.controllers.base.record_cache_op_metrics(logger, server_type, op_type, cache_state, resp=None)

将单个缓存操作记录到其相应的指标中。

参数:
  • logger – 指标记录器

  • server_type – “account” 或 “container”

  • op_type – 操作类型的名称,包括“shard_listing”、“shard_updating”等。

  • cache_state – 此缓存操作的状态。当它是“infocache_hit”或 memcache“hit”时,表示它已成功,并且“resp”将为 None;对于所有其他情况,如 memcache“miss”或“skip”(这将导致后端访问),则预期有一个有效的“resp”。

  • resp – 除缓存命中外所有情况的后端响应。

swift.proxy.controllers.base.set_info_cache(env, account, container, resp)

在 memcache 和 env 中缓存信息。

参数:
  • env – WSGI 请求环境

  • account – 未加引号的账户名称

  • container – 未加引号的容器名称或 None

  • resp – 收到的响应或 None,如果应清除信息缓存

返回值:

放入缓存的信息,如果请求状态不在 (404, 410, 2xx) 中,则为 None。

swift.proxy.controllers.base.set_namespaces_in_cache(req, cache_key, ns_bound_list, time)

在 infocache 和 memcache 中设置命名空间边界列表。

参数:
  • reqswift.common.swob.Request 对象。

  • cache_key – infocache 和 memcache 的缓存键。

  • ns_bound_listswift.common.utils.NamespaceBoundList

  • time – 命名空间在 memcache 中保留的时间。

返回值:

缓存状态。

swift.proxy.controllers.base.set_object_info_cache(app, env, account, container, obj, resp)

在 WSGI 环境中缓存对象信息,但不在 memcache 中缓存。在 memcache 中缓存会导致缓存压力和大量驱逐,因为典型的 Swift 集群中有大量对象。这只是一个每个请求的缓存。

参数:
  • app – 应用程序对象

  • env – 当前请求使用的环境

  • account – 未加引号的账户名称

  • container – 未加引号的容器名称

  • obj – 未加引号的对象名称

  • resp – 从对象服务器收到的 GET 或 HEAD 响应,如果应清除信息缓存,则为 None

返回值:

对象信息

swift.proxy.controllers.base.update_headers(response, headers)

更新响应中头部的辅助函数。

参数:
  • response – swob.Response 对象

  • headers – 字典头部

账户

class swift.proxy.controllers.account.AccountController(app, account_name, **kwargs)

基类:Controller

账户请求的 WSGI 控制器

DELETE(req)

HTTP DELETE 请求处理程序。

GETorHEAD(req)

HTTP GET/HEAD 请求的处理程序。

POST(req)

HTTP POST 请求处理程序。

PUT(req)

HTTP PUT 请求处理程序。

add_acls_from_sys_metadata(resp)
server_type = 'Account'

容器

class swift.proxy.controllers.container.ContainerController(app, account_name, container_name, **kwargs)

基类:Controller

容器请求的 WSGI 控制器

DELETE(req)

HTTP DELETE 请求处理程序。

GET(req)

HTTP GET 请求的处理程序。

HEAD(req)

HTTP HEAD 请求的处理程序。

POST(req)

HTTP POST 请求处理程序。

PUT(req)

HTTP PUT 请求处理程序。

UPDATE(req)

HTTP UPDATE 请求处理程序。

对容器 DB 执行批量操作的方法,类似于 merge_items REPLICATE 请求。

不面向客户端;内部客户端或中间件必须包含 X-Backend-Allow-Private-Methods: true 头部才能访问。

clean_acls(req)
pass_through_headers = ['x-container-read', 'x-container-write', 'x-container-sync-key', 'x-container-sync-to', 'x-versions-location']
server_type = 'Container'

对象

class swift.proxy.controllers.obj.BaseObjectController(app, account_name, container_name, object_name, **kwargs)

基类:Controller

对象请求的基本 WSGI 控制器。

DELETE(req)

HTTP DELETE 请求处理程序。

GET(req)

HTTP GET 请求的处理程序。

GETorHEAD(req)

处理 HTTP GET 或 HEAD 请求。

HEAD(req)

HTTP HEAD 请求的处理程序。

POST(req)

HTTP POST 请求处理程序。

PUT(req)

HTTP PUT 请求处理程序。

iter_nodes_local_first(ring, partition, request, policy=None, local_handoffs_first=False)

生成环分区节点。

如果 'write_affinity' 设置非空,则首先生成 N 个本地节点(由 write_affinity 设置定义),然后像往常一样生成其余节点。这是对节点进行重新排序,使本地节点优先;没有节点被省略。效果是请求将首先由本地对象服务器处理,但如果没有足够的本地服务器可用,则将使用非本地服务器。

参数:
  • ring – 从中获取节点的环

  • partition – 为其生成节点的环分区

  • request – 节点将根据 request 头部使用 use_replication 进行注释

  • policy – 可选,BaseStoragePolicy 的实例

  • local_handoffs_first – 可选,如果为 True,则优先选择主节点和本地切换节点,然后再查找其他地方。

server_type = 'Object'
class swift.proxy.controllers.obj.ECAppIter(path, policy, internal_parts_iters, range_specs, fa_length, obj_length, logger)

基类: object

WSGI 可迭代对象,将 EC 片段归档(或其部分)解码为原始对象(或其部分)。

参数:
  • path – 对象的路径,不带 v1(例如 /a/c/o)

  • policy – 此对象的存储策略

  • internal_parts_iters – 后端 GET 响应的响应文档部分迭代器列表。对于 M+K 纠删码,调用方必须提供 M 个这样的可迭代对象。

  • range_specs – 描述客户端请求的范围的字典列表。每个字典包含客户端请求的字节范围的起始和结束,以及包含该字节范围的 EC 段的起始和结束。

  • fa_length – 片段归档的长度(以字节为单位),如果响应为 200。如果为 206,则忽略此项。

  • obj_length – 对象的长度(以字节为单位)。从对象服务器的 GET 响应头部中获取。

  • logger – 一个 logger

app_iter_range(start, end)
app_iter_ranges(ranges, content_type, boundary, content_size)
close()
kickoff(req, resp)

开始从后端拉取数据,以便我们可以了解真实 Content-Type 等信息,这些信息可能只存在于 multipart/byteranges 响应主体中。相应地更新我们的响应。

此外,这是我们能够了解响应头部中 MIME 边界的第一个时机。我们获取它以便在主体中也能使用它。

返回值:

引发:

HTTPException – 出错时

class swift.proxy.controllers.obj.ECFragGetter(app, req, node_iter, partition, policy, path, backend_headers, header_provider, logger_thread_locals, logger)

基类:GetterBase

property last_headers
property last_status
response_parts_iter()

创建一个迭代器,用于迭代单个片段响应主体。

返回值:

一个迭代器,从片段响应主体中生成字节块。

property source_iter

对后端片段 GET 响应的迭代器。如果响应良好,则生成 GetterSource 实例,否则生成 None

class swift.proxy.controllers.obj.ECGetResponseBucket(policy, timestamp)

基类: object

一个辅助类,封装了收集片段获取器和备用节点的桶的属性。

add_alternate_nodes(node, frag_indexes)
add_response(getter, parts_iter)

向此桶添加另一个响应。响应桶可以用于具有相同时间戳的片段,或用于具有相同状态的错误。

close_conns()

关闭桶的响应;它们将不用于客户端响应。

property durable
get_responses()

返回所有有用源的列表。如果有多个源与同一个 frag_index 相关联,则只包含一个。

返回值:

源列表,每个源都是 (ECFragGetter, iter) 形式的元组

set_durable()
property shortfall

完成此桶所需的额外响应数;通常为 (ndata - resp_count)。

如果桶没有持久响应,则不足量将扩展到副本计数,以确保代理发出额外的主要请求。

property shortfall_with_alts
class swift.proxy.controllers.obj.ECGetResponseCollection(policy)

基类: object

管理 ECFragGetters 收集的所有成功的 EC GET 响应。

响应包含一个元组(<获取器实例>,<部分迭代器>)。所有具有相同数据时间戳的响应都放置在相应时间戳的 ECGetResponseBucket 中。桶存储在“buckets”字典中,该字典将时间戳映射到桶。

此类别封装了从集合中选择最佳桶以及选择备用节点的逻辑。

add_bad_resp(get, parts_iter)
add_good_response(get, parts_iter)
add_response(get, parts_iter)

向集合添加响应。

参数:
  • getECFragGetter 的实例

  • parts_iter – 响应体部分的迭代器

引发:

ValueError – 如果响应 etag 或状态码值与同一时间戳之前收到的任何值不匹配

property best_bucket

返回集合中“最佳”的存储桶。

“最佳”存储桶是具有足够 Getter 的最新时间戳,或者最接近具有足够 Getter 的时间戳,除非它被具有潜在备用节点的存储桶超越。

如果没有好的存储桶,我们返回“最不坏”的存储桶。

返回值:

ECGetResponseBucket 的实例,如果集合中没有存储桶则为 None。

choose_best_bucket()
property durable
get_extra_headers()
has_alternate_node()
property least_bad_bucket

返回短缺最小的 bad_bucket

provide_alternate_node()

安装在 NodeIter 中的回调函数。在每次调用 NodeIter.next() 时调用,这意味着我们可以跟踪已发出 GET 请求的节点数量,并有选择地注入备用节点(如果有)。

返回值:

描述下一个 GET 请求应发往的节点的字典。

property shortfall
class swift.proxy.controllers.obj.ECObjectController(app, account_name, container_name, object_name, **kwargs)

基类:BaseObjectController

feed_remaining_primaries(safe_iter, pile, req, partition, policy, buckets, feeder_q, logger_thread_locals)
policy_type = 'erasure_coding'
class swift.proxy.controllers.obj.MIMEPutter(conn, node, resp, path, connect_duration, watchdog, write_timeout, send_exception_handler, logger, mime_boundary, multiphase=False)

基类:Putter

用于使用 MIME 的后端 PUT 请求的 Putter。

这主要是为了封装所有多部分 PUT 都被分块的事实,因为有 MIME 边界页脚技巧和两阶段 PUT 会话处理的第一部分。

支持流式传输的 HTTP PUT 请求。

classmethod connect(node, part, path, headers, watchdog, conn_timeout, node_timeout, write_timeout, send_exception_handler, logger=None, need_multiphase=True, **kwargs)

连接到后端节点并发送头。

覆盖超类方法以通知对象需要支持带页脚的多部分正文和可选的多阶段提交,并验证对象服务器的功能。

参数:

need_multiphase – 如果为 True,则对象服务器需要多阶段支持

引发:
end_of_object_data(footer_metadata=None)

当没有更多数据要发送时调用。

覆盖超类实现以在对象数据后发送任何页脚元数据。

参数:

footer_metadata – 要作为页脚发送的元数据项字典。

send_commit_confirmation()

当收到 > 仲裁 2XX 响应时调用。向所有对象节点发送提交确认以完成 PUT。

class swift.proxy.controllers.obj.ObjectControllerRouter

基类: object

policy_type_to_controller_map = {'erasure_coding': <class 'swift.proxy.controllers.obj.ECObjectController'>, 'replication': <class 'swift.proxy.controllers.obj.ReplicatedObjectController'>}
classmethod register(policy_type)

存储策略实现的装饰器,用于注册其 ObjectController 实现。

这也会在类上填充 policy_type 属性。

class swift.proxy.controllers.obj.Putter(conn, node, resp, path, connect_duration, watchdog, write_timeout, send_exception_handler, logger, chunked=False)

基类: object

用于后端 PUT 请求的 Putter。

封装了与存储节点建立连接并将数据流式传输到该节点所需的所有操作。

参数:
  • conn – HTTPConnection 实例

  • node – 描述存储节点的字典

  • resp – 如果 connect() 收到最终响应,则为 HTTPResponse 实例

  • path – 要发送到存储节点的对象路径

  • connect_duration – 启动 HTTPConnection 所花费的时间

  • watchdog – 一个派生的 Watchdog 实例,将强制执行超时

  • write_timeout – 将块写入连接套接字的时间限制

  • send_exception_handler – 写入连接套接字时发生异常时调用的回调

  • logger – Logger 实例

  • chunked – 布尔值,指示请求编码是否分块

await_response(timeout, informational=False)

获取 100-continue 响应,指示两阶段提交的第一阶段结束或最终响应,即状态 >= 200 的响应。

可能实际等待也可能不等待。如果我们说 Expect: 100-continue 但返回了非 100 响应,那么将返回该响应,并且我们不会进行任何网络 IO 来获取它。另一方面,如果我们收到 100 Continue 响应并发送了 PUT 请求的正文,那么我们实际上将在此处从网络读取 2xx-5xx 响应。

参数:
  • timeout – 等待响应的时间

  • informational – 如果为 True,则尝试获取 100-continue 响应,否则尝试获取最终响应。

返回值:

HTTP响应

引发:

Timeout – 如果响应时间过长

close()
classmethod connect(node, part, path, headers, watchdog, conn_timeout, node_timeout, write_timeout, send_exception_handler, logger=None, chunked=False, **kwargs)

连接到后端节点并发送头。

返回值:

Putter 实例

引发:
end_of_object_data(**kwargs)

当没有更多数据要发送时调用。

send_chunk(chunk, timeout_at=None)
class swift.proxy.controllers.obj.ReplicatedObjectController(app, account_name, container_name, object_name, **kwargs)

基类:BaseObjectController

policy_type = 'replication'
swift.proxy.controllers.obj.check_content_type(req)
swift.proxy.controllers.obj.chunk_transformer(policy)

一个生成器,用于在每次 send 调用时将源块转换为每个 policy.ec_n_unique_fragments 的纠删码块。

swift.proxy.controllers.obj.client_range_to_segment_range(client_start, client_end, segment_size)

获取客户端的字节范围并将其转换为跨越必要分段的字节范围。

处理前缀、后缀和完全指定的字节范围。

示例

client_range_to_segment_range(100, 700, 512) = (0, 1023) client_range_to_segment_range(100, 700, 256) = (0, 767) client_range_to_segment_range(300, None, 256) = (256, None)

参数:
  • client_start – 客户端请求范围的第一个字节

  • client_end – 客户端请求范围的最后一个字节

  • segment_size – EC 分段的大小,以字节为单位

返回值:

一个 2 元组 (seg_start, seg_end),其中

  • seg_start 是第一个分段的第一个字节,如果这是后缀字节范围,则为 None

  • seg_end 是最后一个分段的最后一个字节,如果这是前缀字节范围,则为 None

swift.proxy.controllers.obj.num_container_updates(container_replicas, container_quorum, object_replicas, object_quorum)

我们需要通过足够的对象服务器发送容器更新,以便如果对象 PUT 成功,则容器更新是持久的(无论是同步更新还是写入异步待处理)。

定义

Qc = 容器环的仲裁大小 Qo = 对象环的仲裁大小 Rc = 容器环的副本计数 Ro = 对象环的副本计数(或 EC N+K)

持久的容器更新是指至少已到达 Qc 个节点的更新。为了始终持久,我们必须发送足够的容器更新,以便如果只有 Qo 个对象 PUT 成功,并且所有失败的对象 PUT 都有容器更新,则至少有 Qc 个更新保留。由于 (Ro - Qo) 个对象 PUT 可能会失败,我们必须至少有 Qc + Ro - Qo 个容器更新,以确保其中 Qc 个保留。

此外,每个容器副本在至少一个对象 PUT 请求中命名,以便当所有请求成功时,不会为容器复制器生成任何工作。因此,至少需要 Rc 个更新。

参数:
  • container_replicas – 容器环的副本计数 (Rc)

  • container_quorum – 容器环的仲裁大小 (Qc)

  • object_replicas – 对象环的副本计数 (Ro)

  • object_quorum – 对象环的仲裁大小 (Qo)

swift.proxy.controllers.obj.segment_range_to_fragment_range(segment_start, segment_end, segment_size, fragment_size)

获取跨越某些段的字节范围,并将其转换为跨越其片段存档中相应片段的字节范围。

处理前缀、后缀和完全指定的字节范围。

参数:
  • segment_start – 第一个分段的第一个字节

  • segment_end – 最后一个分段的最后一个字节

  • segment_size – EC 分段的大小,以字节为单位

  • fragment_size – EC 片段的大小,以字节为单位

返回值:

一个 2 元组 (frag_start, frag_end),其中

  • frag_start 是第一个片段的第一个字节,如果这是后缀字节范围,则为 None

  • frag_end 是最后一个片段的最后一个字节,如果这是前缀字节范围,则为 None

swift.proxy.controllers.obj.trailing_metadata(policy, client_obj_hasher, bytes_transferred_from_client, fragment_archive_index)

代理服务器

class swift.proxy.server.Application(conf, logger=None, account_ring=None, container_ring=None)

基类: object

代理服务器的 WSGI 应用程序。

check_config()

检查配置是否存在可能的错误

check_response(node, server_type, response, method, path, body=None)

检查响应是否存在错误状态码,并根据需要更新错误限制器。

参数:
  • node – 描述节点的字典

  • server_type – 收到响应的服务器类型(例如,“Object”)。

  • response – HTTPResponse 实例。

  • method – 请求方法。

  • path – 请求路径。

  • body – 可选的响应体。如果给定,响应体开头最多 1024 字节将包含在任何日志消息中。

返回 True:

如果响应状态码小于 500,否则为 False。

error_limit(node, msg)

将节点标记为错误受限。这会立即假装节点收到足够的错误以触发错误抑制。将其用于“存储不足”等错误。对于其他错误,请使用 increment()

参数:
  • node – 要进行错误限制的节点字典

  • msg – 错误消息

error_limited(node)

检查节点当前是否错误受限。

参数:

node – 要检查的节点字典

返回值:

如果错误受限则为 True,否则为 False

error_occurred(node, msg)

处理错误日志和处理。

参数:
  • node – 要处理错误的节点字典

  • msg – 错误消息

exception_occurred(node, typ, additional_info, **kwargs)

处理通用异常的日志记录。

参数:
  • node – 要记录错误的节点字典

  • typ – 服务器类型

  • additional_info – 要记录的附加信息

get_controller(req)

获取处理请求的控制器。

参数:

req – 请求

返回值:

(控制器类,路径字典)的元组

引发:

ValueError – (由 split_path 抛出) 如果给定无效路径

get_object_ring(policy_idx)

根据策略获取用于处理请求的环对象。

参数:

policy_idx – swift.conf 中定义的策略索引

返回值:

相应的环对象

get_policy_options(policy)

返回策略特定选项。

参数:

policyBaseStoragePolicy 实例或 None

返回值:

ProxyOverrideOptions 实例

handle_request(req)

代理服务器的入口点。应返回 WSGI 样式可调用对象(例如 swob.Response)。

参数:

req – swob.Request 对象

modify_wsgi_pipeline(pipe)

在 WSGI 管道创建期间调用。修改 WSGI 管道上下文以确保管道中存在强制性中间件。

参数:

pipe – PipelineWrapper 对象

set_node_timing(node, timing)
sort_nodes(nodes, policy=None)

根据配置的策略对节点进行原地排序(并返回排序后的列表)。默认的“排序”是随机打乱节点。如果选择“timing”策略,则根据存储的计时数据对节点进行排序。

参数:
  • nodes – 节点列表

  • policyBaseStoragePolicy 实例

update_request(req)
class swift.proxy.server.ProxyOverrideOptions(base_conf, override_conf, app)

基类: object

封装了可能被覆盖的代理服务器选项,例如针对策略特定的配置。

参数:
  • conf – 代理服务器配置字典。

  • override_conf – 覆盖配置选项的字典。

swift.proxy.server.app_factory(global_conf, **local_conf)

paste.deploy 应用程序工厂,用于创建 WSGI 代理应用程序。

swift.proxy.server.main()
swift.proxy.server.parse_per_policy_config(conf)

在配置文件中搜索任何按策略配置的部分,并将这些部分加载到映射策略引用(名称或索引)到策略选项的字典中。

参数:

conf – 代理服务器配置字典

返回值:

映射策略引用 -> 策略选项字典的字典

引发:

ValueError – 如果策略配置部分的名称无效