Container

Container Auditor

class swift.container.auditor.ContainerAuditor(conf, logger=None)

基础: DatabaseAuditor

审计容器。

broker_class

别名 ContainerBroker

server_type = 'container'
swift.container.auditor.main()

Container Backend

容器服务器的可插拔后端

class swift.container.backend.ContainerBroker(db_file, timeout=25, logger=None, account=None, container=None, pending_timeout=None, stale_reads_ok=False, skip_commits=False, force_db_file=False)

基础: DatabaseBroker

封装了与容器数据库的交互。

请注意,如果容器被分片,这可能涉及多个磁盘上的 DB 文件

  • _db_file 是旧容器 DB 名称的路径,即 <hash>.db。对于从未分片的已初始化 broker,此文件应存在,但在容器分片后将不再存在。

  • db_files 是 broker 存在的 db 文件的列表。此列表对于已初始化的 broker 应该至少有一个条目,并且在容器处于 SHARDING 状态时应该有两个条目。

  • db_file 是此 broker 当前权威的 db 文件的路径。根据容器的状态,这可能与传递给 __init__()db_file 相同,除非 force_db_file 为 True,在这种情况下 db_file 始终等于传递给 __init__()db_file 参数。

  • pending_file 始终等于 _db_file 加上 .pending,即 <hash>.db.pending

classmethod create_broker(device_path, part, account, container, logger=None, epoch=None, put_timestamp=None, storage_policy_index=None)

创建一个 ContainerBroker 实例。如果 db 不存在,则初始化 db 文件。

参数:
  • device_path – 设备路径

  • part – 分区号

  • account – 帐户名称字符串

  • container – 容器名称字符串

  • logger – 一个 logger 实例

  • epoch – 包含在 db 文件名中的时间戳

  • put_timestamp – 如果需要初始化 broker,则为初始时间戳

  • storage_policy_index – 存储策略索引

返回值:

一个元组 (broker, initialized),其中 brokerswift.container.backend.ContainerBroker 的实例,initialized 如果 db 文件已初始化,则为 True,否则为 False。

create_container_info_table(conn, put_timestamp, storage_policy_index)

创建 container_info 表,该表特定于容器 DB。不是可插拔后端的一部分,而是基线代码的内部部分。同时创建 container_stat 视图。

参数:
  • conn – 数据库连接对象

  • put_timestamp – 放入时间戳

  • storage_policy_index – 存储策略索引

create_object_table(conn)

创建 object 表,该表特定于容器 DB。不是可插拔后端的一部分,而是基线代码的内部部分。

参数:

conn – 数据库连接对象

create_policy_stat_table(conn, storage_policy_index=0)

创建 policy_stat 表。

参数:
  • conn – 数据库连接对象

  • storage_policy_index – 容器正在创建的策略索引

create_shard_range_table(conn)

创建 shard_range 表,该表特定于容器 DB。

参数:

conn – 数据库连接对象

db_contains_type = 'object'
property db_epoch
property db_file

获取此 broker 的主要 db 文件路径。这通常是最新分片 epoch 的 db 文件。但是,如果磁盘上不存在 db 文件,或者在构建 broker 时 force_db_file 为 True,则主要 db 文件是传递给 broker 构造函数的 db_file

返回值:

一个 db 文件路径;该文件不一定存在。

property db_files

获取为此 broker 缓存在磁盘上存在的有效 db 文件列表。

可以通过调用刷新缓存列表

reload_db_files().

返回值:

一个按升序 epoch 排序的 db 文件路径列表;该列表可能为空。

db_reclaim_timestamp = 'created_at'
db_type = 'container'
delete_meta_whitelist = ['x-container-sysmeta-shard-quoted-root', 'x-container-sysmeta-shard-root', 'x-container-sysmeta-sharding']
delete_object(name, timestamp, storage_policy_index=0)

标记一个对象已删除。

参数:
  • name – 要删除的对象名称

  • timestamp – 标记对象删除的时间戳

  • storage_policy_index – 对象的存储策略索引

empty()

检查容器 DB 是否为空。

此方法使用比 is_deleted() 更严格的检查来检查对象计数:此方法检查任何策略中都没有对象;如果容器正在分片,则检查新的和退役的数据库是否为空;如果根容器具有分片范围,则检查它们是否为空。

返回值:

如果数据库没有活动对象,则为 True,否则为 False

enable_sharding(epoch)

使用给定的 epoch 更新此 broker 自己的分片范围,将其状态设置为 SHARDING 并将其持久化到 DB 中。

参数:

epoch – 一个 Timestamp

返回值:

broker 更新后的自己的分片范围。

find_shard_ranges(shard_size, limit=-1, existing_ranges=None, minimum_shard_size=1)

扫描容器数据库以查找分片范围。扫描将从任何给定 existing_ranges 的上限开始,否则从 ShardRange.MIN 开始。扫描将在找到 limit 个分片范围后停止,或者在找不到更多分片范围时停止。在后一种情况下,最后一个分片范围的上限将等于容器命名空间的上限。

此方法不会修改数据库的状态;调用者负责将任何分片范围数据持久化到数据库中。

参数:
  • shard_size – 每个分片范围的大小

  • limit – 要找到的最大分片点数;负值(默认)表示没有限制。

  • existing_ranges – 一个可选的现有 ShardRanges 列表;如果给定,此列表应按上限排序;新的分片范围的扫描将从最后一个现有 ShardRange 的上限开始。

  • minimum_shard_size – 最后一个分片范围的最小大小。如果此值大于 1,则最后一个分片范围可能会扩展到大于 shard_size,以避免具有更少 minimum_shard_size 行的进一步分片范围。

返回值:

一个元组;元组的第一个值是一个字典列表,每个字典都有键 {‘index’,‘lower’,‘upper’,‘object_count’},按升序 ‘upper’ 排序;元组的第二个值是一个布尔值,如果找到了最后一个分片范围,则为 True,否则为 False。

get_all_shard_range_data()

返回所有分片范围数据列表,包括自己的分片范围和已删除的分片范围。

返回值:

一个 ShardRange 的字典表示形式列表。

get_brokers()

返回组件数据库的 broker 列表。当数据库状态为分片时,该列表有两个条目:第一个条目是具有 skip_commits 设置为 True 的退役数据库的 broker;第二个条目是具有 skip_commits 设置为 False 的新鲜数据库的 broker。对于任何其他数据库状态,该列表只有一个条目。

返回值:

一个 ContainerBroker 列表

get_db_state()

返回磁盘上数据库文件的当前状态。

get_db_version(conn)
get_info()

获取容器的全局数据。

返回值:

一个包含键的字典:account、container、created_at、put_timestamp、delete_timestamp、status、status_changed_at、object_count、bytes_used、reported_put_timestamp、reported_delete_timestamp、reported_object_count、reported_bytes_used、hash、id、x_container_sync_point1、x_container_sync_point2 和 storage_policy_index、db_state。

get_info_is_deleted()

获取容器的 is_deleted 状态和信息。

返回值:

一个元组,形式为 (info, is_deleted) info 是 get_info 返回的字典,is_deleted 是一个布尔值。

get_misplaced_since(start, count)

获取存储策略与容器的存储策略不同的对象的列表。

参数:
  • start – 上次 reconciler 同步点

  • count – 要获取的最大条目数

返回值:

包含键的字典列表:name、created_at、size、content_type、etag、storage_policy_index

get_namespaces(marker=None, end_marker=None, includes=None, reverse=False, states=None, fill_gaps=False)

根据输入参数返回持久化的命名空间列表。

参数:
  • marker – 将返回的列表限制为命名空间包括或大于此标记值的分片范围。如果 reverse=True,则将 marker 视为 end_marker。如果指定了 includes,则忽略 marker

  • end_marker – 将返回的列表限制为命名空间包括或小于此 end_marker 值的分片范围。如果 reverse=True,则将 end_marker 视为 marker。如果指定了 includes,则忽略 end_marker

  • includes – 将返回的列表限制为包含给定值的分片范围;如果指定了 includes,则忽略 fill_gapsmarkerend_marker

  • reverse – 反转结果顺序。

  • states – 如果指定,则将返回的列表限制为具有给定状态之一的命名空间;应为整数列表。

  • fill_gaps – 如果为 True,则插入自己分片范围的修改副本以填充任何找到的分片范围的末端和自己分片范围的上限之间的间隙。在找到的分片范围内的间隙不会被填充。

返回值:

一个 Namespace 对象列表。

get_objects(limit=None, marker='', end_marker='', include_deleted=None, since_row=None)

返回所有策略中的对象列表,包括已删除的对象。列表中的每个对象都由一个包含键 {‘name’,‘created_at’,‘size’,‘content_type’,‘etag’,‘deleted’,‘storage_policy_index’} 的字典描述。

参数:
  • limit – 获取的最大条目数

  • marker – 如果设置,名称小于或等于此值的对象将不包含在列表中。

  • end_marker – 如果设置,名称大于或等于此值的对象将不包含在列表中。

  • include_deleted – 如果为 True,则仅包含已删除的对象;如果为 False,则仅包含未删除的对象;否则(默认),包含已删除和未删除的对象。

  • since_row – 仅包含 ROWID 大于给定行 ID 的项目;默认情况下,包含所有行。

返回值:

一个字典列表,每个字典描述一个对象。

get_own_shard_range(no_default=False)

返回表示此 broker 自己的分片范围的分片范围。如果尚未在 broker 的分片范围表中持久化这样的范围,则将返回一个默认分片范围,该范围表示整个命名空间。

返回的分片范围的 object_countbytes_used 不保证与此 broker 的当前对象统计信息保持最新。需要最新统计信息的调用者应使用 get_info 方法。

参数:

no_default – 如果为 True 并且 broker 自己的分片范围未在分片范围表中找到,则返回 None,否则返回默认分片范围。

返回值:

一个 ShardRange 实例

get_policy_stats()
get_reconciler_sync()
get_replication_info()

获取复制所需的数据库信息。

返回值:

包含来自 get_info 的键的字典,以及 max_row 和 metadata

注意:get_info 的 <db_contains_type>_count 被转换为

“count”,metadata 是原始字符串。

get_shard_ranges(marker=None, end_marker=None, includes=None, reverse=False, include_deleted=False, states=None, include_own=False, exclude_others=False, fill_gaps=False)

返回持久化的分片范围列表。

参数:
  • marker – 将返回的列表限制为命名空间包括或大于此标记值的分片范围。如果 reverse=True,则将 marker 视为 end_marker。如果指定了 includes,则忽略 marker

  • end_marker – 将返回的列表限制为命名空间包括或小于此 end_marker 值的分片范围。如果 reverse=True,则将 end_marker 视为 marker。如果指定了 includes,则忽略 end_marker

  • includes – 将返回的列表限制为包含给定值的分片范围;如果指定了 includes,则忽略 fill_gapsmarkerend_marker,但应用其他约束(例如 exclude_othersinclude_deleted)。

  • reverse – 反转结果顺序。

  • include_deleted – 包含已设置删除标记的项目。

  • states – 如果指定,则将返回的列表限制为具有给定状态之一的分片范围;应为整数列表。

  • include_own – 一个布尔值,用于控制是否将名称与 broker 路径匹配的行包含在返回的列表中。如果为 True,则除非被其他约束排除(例如 markerend_markerincludes),否则将包含该行。如果为 False,则不包含该行。默认值为 False。

  • exclude_others – 一个布尔值,用于控制是否将名称与 broker 路径不匹配的行包含在返回的列表中。如果为 True,则不包含这些行,否则包含这些行。默认值为 False。

  • fill_gaps – 如果为 True,则插入自己分片范围的修改副本以填充任何找到的分片范围的末端和自己分片范围的上限之间的间隙。在找到的分片范围内的间隙不会被填充。fill_gaps 在指定了 includes 时将被忽略。

返回值:

一个 swift.common.utils.ShardRange 实例列表。

get_shard_usage()

获取所有分片范围在 ACTIVE、SHARDING 或 SHRINKING 状态下的聚合对象统计信息。

返回值:

一个字典,键为 {bytes_used, object_count}

get_sharding_sysmeta(key=None)

从 broker 的元数据中返回分片相关信息。

参数:

key – 如果给定,将返回分片信息中 key 处存储的值。

返回值:

一个包含分片信息的字典,或者该字典中 key 处存储的值。

get_sharding_sysmeta_with_timestamps()

从 broker 的元数据中返回带有时间戳的分片相关信息。

参数:

key – 如果给定,将返回分片信息中 key 处存储的值。

返回值:

一个包含分片信息及其时间戳的字典。

has_multiple_policies()
has_other_shard_ranges()

此函数判断是否存在除 broker 自身分片范围之外的其他分片范围,且该范围未标记为已删除。

返回值:

一个布尔值,如上所述。

is_empty_enough_to_reclaim()
is_old_enough_to_reclaim(now, reclaim_age)
is_own_shard_range(shard_range)
is_reclaimable(now, reclaim_age)

检查经纪人抽象是否为空,并且是否已标记为已删除至少 reclaim_age 时间。

is_root_container()

如果此容器是根容器,则返回 True,否则返回 False。

根容器是指不是另一个容器分片的容器。

is_sharded()
list_objects_iter(limit, marker, end_marker, prefix, delimiter, path=None, storage_policy_index=0, reverse=False, include_deleted=False, since_row=None, transform_func=None, all_policies=False, allow_reserved=False)

从 marker 开始,最多返回 limit 个条目,按名称排序的对象列表。条目将以 prefix 开头,并且不会在 prefix 之后包含 delimiter。

参数:
  • limit – 获取的最大条目数

  • marker – marker 查询

  • end_marker – 结束 marker 查询

  • prefix – prefix 查询

  • delimiter – delimiter 查询

  • path – 如果定义,将根据路径设置 prefix 和 delimiter

  • storage_policy_index – 查询的存储策略索引

  • reverse – 反转结果顺序。

  • include_deleted – 如果为 True,则仅包含已删除的对象;如果为 False(默认值),则仅包含未删除的对象;否则,包含已删除和未删除的对象。

  • since_row – 仅包含 ROWID 大于给定行 ID 的项目;默认情况下,包含所有行。

  • transform_func – 一个可选函数,如果给定,将为列表中的每个对象调用该函数,以获取对象的转换版本;应具有与 _transform_record() 相同的签名;默认值为 _transform_record()

  • all_policies – 如果为 True,则忽略 storage_policy_index 给定的任何值,并包含所有存储策略的对象

  • allow_reserved – 默认排除带有保留字节名称

返回值:

元组列表,格式为 (name, created_at, size, content_type, etag, deleted)

make_tuple_for_pickle(record)

将此数据库记录字典转换为此服务用于待定 pickles 的格式。

merge_items(item_list, source=None)

将条目合并到对象表中。

参数:
  • item_list – 字典列表,格式为 {‘name’, ‘created_at’, ‘size’, ‘content_type’, ‘etag’, ‘deleted’, ‘storage_policy_index’, ‘ctype_timestamp’, ‘meta_timestamp’}

  • source – 如果已定义,则使用 source 更新 incoming_sync

merge_shard_ranges(shard_ranges)

将分片范围合并到分片范围表中。

参数:

shard_ranges – 一个分片范围或分片范围列表;每个分片范围应为 ShardRange 的实例,或包含 SHARD_RANGE_KEYS 的分片范围字典。

property path
put_object(name, timestamp, size, content_type, etag, deleted=0, storage_policy_index=0, ctype_timestamp=None, meta_timestamp=None)

在 DB 中创建对象及其元数据。

参数:
  • name – 要创建的对象名称

  • timestamp – 对象创建的时间戳

  • size – 对象大小

  • content_type – 对象内容类型

  • etag – 对象 etag

  • deleted – 如果为 True,则将对象标记为已删除,并将 deleted_at 时间戳设置为时间戳

  • storage_policy_index – 对象的存储策略索引

  • ctype_timestamp – 内容类型上次更新的时间戳

  • meta_timestamp – 元数据上次更新的时间戳

reload_db_files()

重新加载此 broker 的有效磁盘 DB 文件的缓存列表。

remove_objects(lower, upper, max_row=None)

从对象表中删除给定命名空间范围内的对象记录。

请注意,无论其 storage_policy_index 如何,都会删除对象。

参数:
  • lower – 定义将要删除的对象名称的下限;大于此值的名称将被删除;小于或等于此值的名称将不会被删除。

  • upper – 定义将要删除的对象名称的上限;小于或等于此值的名称将被删除;大于此值的名称将不会被删除。空字符串解释为没有上限。

  • max_row – 如果指定,则仅删除小于或等于 max_row 的行

reported(put_timestamp, delete_timestamp, object_count, bytes_used)

更新报告的统计信息,这些统计信息可在容器的 get_info 中获取。

参数:
  • put_timestamp – 要更新的 put_timestamp

  • delete_timestamp – 要更新的 delete_timestamp

  • object_count – 要更新的 object_count

  • bytes_used – 要更新的 bytes_used

classmethod resolve_shard_range_states(states)

给定一个值列表,其中每个值可能是状态的名称、状态的编号或别名,则返回由该列表描述的状态编号集合。

支持以下别名值:‘listing’ 映射到在列出对象时被认为是有效的所有状态;‘updating’ 映射到在重定向对象更新时被认为是有效的所有状态;‘auditing’ 映射到在根更新自身分片范围表的分片容器时被认为是有效的所有状态(当前映射到所有状态,但不包括 FOUND)。

参数:

states – 一个值列表,其中每个值可能是状态的名称、状态的编号或别名

返回值:

一个整数状态编号集合,或者如果没有给定任何状态,则为 None

引发:

ValueError – 如果给定列表中的任何值既不是有效状态也不是有效别名

property root_account
property root_container
property root_path
set_sharded_state()

取消链接 broker 的退役 DB 文件。

返回值:

如果成功取消链接了退役 DB,则返回 True,否则返回 False。

set_sharding_state()

创建一个新的 DB 文件,为退役 DB 的分片做准备。broker 自身的分片范围必须具有 epoch 时间戳,此方法才能成功。

返回值:

如果成功创建了新的 DB,则为 True,否则为 False。

set_sharding_sysmeta(key, value)

更新 broker 存储在给定键下的元数据,该键带有分片特定的命名空间。

参数:
  • key – 分片元数据命名空间中的元数据键。

  • value – 元数据值

set_storage_policy_index(policy_index, timestamp=None)

更新 container_stat 的 policy_index 和 status_changed_at。

set_x_container_sync_points(sync_point1, sync_point2)
sharding_initiated()

如果 broker 具有分片范围状态,该状态对于启动分片是必需的,则返回 True,否则返回 False。

sharding_required()

如果 broker 具有分片范围状态,该状态对于启动分片是必需的,但尚未完成分片,则返回 True,否则返回 False。

property storage_policy_index
update_reconciler_sync(point)
swift.container.backend.merge_shards(shard_data, existing)

shard_dataexisting 进行比较,并使用 existing 中优先于 shard_data 中相应项的任何项来更新 shard_data

参数:
  • shard_data – 可能是由此方法修改的分片范围的字典表示。

  • existing – 分片范围的字典表示。

返回值:

如果 shard data 具有任何被认为优先于 existing 中相应项的项,则返回 True

swift.container.backend.sift_shard_ranges(new_shard_ranges, existing_shard_ranges)

比较新的和现有的分片范围,使用来自现有分片的任何更新状态来更新新的分片范围,并返回需要添加的分片范围(因为它们包含新的或更新的状态)和需要删除的分片范围(因为它们的状态已被取代)。

参数:
  • new_shard_ranges – 一个字典列表,每个字典代表一个分片范围。

  • existing_shard_ranges – 一个将分片范围名称映射到代表分片范围的字典的字典。

返回值:

一个元组 (to_add, to_delete);to_add 是一个字典列表,每个字典代表一个要添加到现有分片范围的分片范围;to_delete 是一个要删除的分片范围名称的集合。

swift.container.backend.update_new_item_from_existing(new_item, existing)

比较新对象项的数据和元数据相关时间戳与现有对象记录的时间戳,如果它们较新,则使用现有记录中的数据和/或元数据相关属性来更新新项。

多个时间戳被编码成一个字符串,用于存储在 objects db 表的 ‘created_at’ 列中。

参数:
  • new_item – 对象更新属性的字典

  • existing – 现有对象属性的字典

返回值:

如果发现新项字典的任何属性都比现有项更新,因此未更新,则返回 True,否则返回 False,表示更新后的项等于现有项。

容器复制器

class swift.container.replicator.ContainerReplicator(conf, logger=None)

基类: Replicator

brokerclass

别名 ContainerBroker

cleanup_post_replicate(broker, orig_info, responses)

如果需要,清理非主数据库中的磁盘。

参数:
  • broker – 我们正在复制的数据库的 broker

  • orig_info – 在复制之前拍摄的 broker 复制信息字典的快照

  • responses – 一个布尔成功值的列表,表示对其他节点的每个复制请求

返回成功:

如果尝试删除数据库但未成功,则返回 False,否则返回 True。

datadir = 'containers'
default_port = 6201
delete_db(broker)

确保仅在复制运行结束时清理 reconciler 数据库。

dump_to_reconciler(broker, point)

查找 broker 中对象更新在错误存储策略中的对象行,其 ROWID 大于作为 point 给定的行 id。

参数:
  • broker – 具有放置错误的对象的容器 broker

  • point – 上次验证的 reconciler_sync_point

返回值:

上次成功入队的行 id

feed_reconciler(container, item_list)

将 item_list 中的行条目添加到本地 reconciler 容器数据库中的队列。

参数:
  • container – reconciler 容器的名称

  • item_list – 要入队的行列表

返回值:

如果成功入队,则返回 True

find_local_handoff_for_part(part)

查找环中位于此节点上的设备,以便放置分区。优先选择是该分区的主位置的设备。如果未找到这样的设备,则选择具有权重的本地设备,否则选择任何本地设备。

参数:

part – 一个分区

返回值:

环中的一个节点条目

get_reconciler_broker(timestamp)

获取一个本地 reconciler 容器 broker 实例,该实例适合于入队给定的时间戳。

参数:

timestamp – 要入队行的时间戳

返回值:

一个本地 reconciler broker

replicate_reconcilers()

确保复制期间合并到 reconciler 容器的任何项目都被推送到正确的节点,并且任何不属于此节点的 reconciler 容器都被删除。

report_up_to_date(full_info)
run_once(*args, **kwargs)

运行一次复制过程。

server_type = 'container'
class swift.container.replicator.ContainerReplicatorRpc(root, datadir, broker_class, mount_check=True, logger=None)

基类: ReplicatorRpc

get_shard_ranges(broker, args)
merge_shard_ranges(broker, args)
swift.container.replicator.check_merge_own_shard_range(shards, broker, logger, source)

如果 broker 拥有带有 epoch 的 own_shard_range,则过滤掉没有 epoch 的 own_shard_range,并记录警告信息。

参数:
  • shards – 要合并的 ShardRanges 列表

  • broker – 一个 ContainerBroker

  • logger – 一个 logger

  • source – 用于记录 shards 源的字符串

返回值:

实际要合并的 ShardRanges 列表

swift.container.replicator.main()

容器服务器

class swift.container.server.ContainerController(conf, logger=None)

基类:BaseStorageServer

容器服务器的 WSGI 控制器。

DELETE(req)

处理 HTTP DELETE 请求。

GET(req)

处理 HTTP GET 请求。

成功 GET 请求的响应主体包含对象或 shard range 的列表。列表的确切内容由请求头和查询字符串参数的组合决定,如下所示

  • 列表的类型由 X-Backend-Record-Type 头确定。如果此头的值为 shard,则响应主体将是 shard range 的列表;如果此头的值为 auto,并且容器状态为 shardingsharded,则列表将是 shard range 的列表;否则,响应主体将是对象的列表。

  • shard range 和对象列表都可以根据以下约束进行过滤。但是,可以使用 X-Backend-Ignore-Shard-Name-Filter 头来覆盖将 markerend_markerincludesreverse 参数应用于 shard range 列表。如果头的值为 ‘sharded’ 并且当前的数据库 sharding 状态也为 ‘sharded’,则将忽略这些参数。请注意,此头不会覆盖 shard range 列表上的 states 约束。

  • 可以使用带有 swift.common.utils.TRUE_VALUES 中值的 reverse 查询字符串参数来反转 shard range 和对象列表的顺序。

  • 可以使用 markerend_marker 查询字符串参数将 shard range 和对象列表约束为名称范围。对象列表将仅包含名称大于任何 marker 值且小于任何 end_marker 值的对象。shard range 列表将仅包含命名空间大于或包含任何 marker 值且小于或包含任何 end_marker 值的 shard range。

  • shard range 列表还可以通过 includes 查询字符串参数进行约束。如果存在此参数,则列表将仅包含命名空间包含参数值的 shard range;任何 markerend_marker 参数将被忽略

  • 可以使用 limit 参数约束对象列表的长度。对象列表还可以通过 prefixdelimiterpath 查询字符串参数进行约束。

  • 如果 X-Backend-Include-Deleted 头的值是 swift.common.utils.TRUE_VALUES 中的一个,则 shard range 列表将包含已删除的 shard range。对象列表永远不包含已删除的对象。

  • 可以使用查询字符串 states 参数约束 shard range 列表,以仅包含状态由参数指定的 shard range。如果存在,states 参数应为 STATES 的字符串或整数表示形式的逗号分隔列表。

    可以在 states 参数值中使用别名。 listing 别名将导致列表包含所有适合为对象列表做出贡献的 shard range。 updating 别名将导致列表包含所有适合接受对象更新的 shard range。

    如果使用这些别名中的任何一个,则 shard range 列表如有必要将扩展为合成的“填充”范围,以便满足请求的名称范围,因为找不到足够的实际 shard range。任何“填充”shard range 将覆盖否则未覆盖的请求名称范围的尾部,并指向同一个容器。

    auditing 别名将导致列表包含所有对 sharder 在审核 shard 容器时有用的 shard range。此别名不会导致添加“填充”范围,但会导致容器的 own shard range 包含在列表中。目前,仅当 ‘X-Backend-Record-Shard-Format’ 为 ‘full’ 时才支持 auditing

  • 如果调用者发送带有值 ‘namespace’ 的头 X-Backend-Record-Shard-Format 作为提示,表明它更喜欢命名空间,则可以简化 shard range 列表,以仅包含仅命名空间的属性(名称、下限和上限)。如果此头不存在或值为 ‘full’,则列表将默认包含 shard range 的所有属性。但是,如果参数包含 includes/marker/end_marker,则响应将是完整的 shard range,无论 X-Backend-Record-Shard-Format 头如何。响应头 X-Backend-Record-Type 将告诉用户它获得的是什么类型。

  • 通常不会从已删除的容器返回列表。但是,可以使用带有 swift.common.utils.TRUE_VALUES 中值的 X-Backend-Override-Deleted 头来强制从仍然存在数据库文件的已删除容器返回 shard range 列表。

参数:

reqswift.common.swob.Request 的实例

返回值:

swift.common.swob.Response 的实例

GET_object(req, broker, container, params, info, is_deleted, out_content_type)

返回响应中的对象列表。

参数:
  • req – swob.Request 对象

  • broker – 容器数据库 broker 对象

  • container – 容器名称

  • params – 请求参数。

  • info – 容器的全局信息

  • is_deleted – 容器的 is_deleted 状态。

  • out_content_type – 内容类型作为字符串。

返回值:

swift.common.swob.Response 的实例

GET_shard(req, broker, container, params, info, is_deleted, out_content_type)

返回响应中的持久化 shard range 或命名空间列表。

参数:
  • req – swob.Request 对象

  • broker – 容器数据库 broker 对象

  • container – 容器名称

  • params – 请求参数。

  • info – 容器的全局信息

  • is_deleted – 容器的 is_deleted 状态。

  • out_content_type – 内容类型作为字符串。

返回值:

swift.common.swob.Response 的实例

HEAD(req)

处理 HTTP HEAD 请求。

POST(req)

处理 HTTP POST 请求。

POST 请求将更新容器的 put_timestamp,除非它具有带有 truthy 值的 X-Backend-No-Timestamp-Update 头。

参数:

reqRequest 的实例。

PUT(req)

处理 HTTP PUT 请求。

PUT_container(req, broker, account, container, req_timestamp)

更新或创建容器。

PUT_object(req, broker, account, obj, req_timestamp)

将对象放入容器。

PUT_shard(req, broker, account, req_timestamp)

将 shard 放入容器。

REPLICATE(req)

处理 HTTP REPLICATE 请求(用于复制的 json 编码 RPC 调用)。

UPDATE(req)

处理 HTTP UPDATE 请求(来自代理的 merge_items RPC)。

account_update(req, account, container, broker)

使用最新的容器信息更新帐户服务器。

参数:
  • req – swob.Request 对象

  • account – 账户名称

  • container – 容器名称

  • broker – 容器数据库 broker 对象

返回值:

如果所有帐户请求都返回 404 错误代码,则返回 HTTPNotFound 响应对象;如果由于格式错误的头而无法更新帐户,则返回 HTTPBadRequest 响应对象;否则返回 None。

allowed_sync_hosts

我们允许同步到的主机列表。这可以被 self.realms_conf 中的数据覆盖

check_free_space(drive)
get_and_validate_policy_index(req)

验证提供的索引是否映射到策略。

返回值:

来自请求的策略索引,或者如果不存在则为 None

引发:

HTTPBadRequest – 如果提供的索引无效

realms_conf

用于验证 sync-to 值的 ContainerSyncCluster 实例。

save_headers = ['x-container-read', 'x-container-write', 'x-container-sync-key', 'x-container-sync-to']
server_type = 'container-server'
update_object_record(record)

对所有序列化格式通用的容器列表记录执行变异,并将其作为字典返回。

将创建时间转换为 iso 时间戳。将大小替换为 ‘swift_bytes’ 内容类型参数。

参数:

record – 对象条目记录

返回值:

修改后的记录

update_shard_record(record, shard_record_full=True)

将 shard_range 数据库记录作为字典返回,键将取决于记录中提供的数据库字段。

参数:
  • record – shard 条目记录,可以是 ShardRange 或 Namespace。

  • shard_record_full – 布尔值,当为 true 时,时间戳字段将以 iso 格式作为“last_modified”添加。

返回值:

适合列表响应的字典

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

paste.deploy 应用工厂,用于创建 WSGI 容器服务器应用

swift.container.server.gen_resp_headers(info, is_deleted=False)

将容器信息字典转换为头部。

swift.container.server.get_container_name_and_placement(req)

拆分并验证容器的路径。

参数:

req – 一个 swob 请求

返回值:

一个字符串路径部件的元组

swift.container.server.get_obj_name_and_placement(req)

拆分并验证对象的路径。

参数:

req – 一个 swob 请求

返回值:

一个字符串路径部件的元组

swift.container.server.main()

容器协调器

class swift.container.reconciler.ContainerReconciler(conf, logger=None, swift=None)

基类: Daemon

移动位于错误存储策略中的对象。

can_reconcile_policy(policy_index)
ensure_object_in_right_location(q_policy_index, account, container, obj, q_ts, path, container_policy_index, source_ts, source_obj_status, source_obj_info, source_obj_iter, **kwargs)

验证源对象将满足错位对象队列条目并移动到目标位置。

参数:
  • q_policy_index – 源对象的 policy_index

  • account – 错位对象的帐户名

  • container – 错位对象的容器名

  • obj – 错位对象的名称

  • q_ts – 错位对象的时间戳

  • path – 错位对象的完整路径,用于记录

  • container_policy_index – 目标的 policy_index

  • source_ts – 源对象的时间戳

  • source_obj_status – 源对象请求的 HTTP 状态

  • source_obj_info – 源对象请求的 HTTP 头部

  • source_obj_iter – 源对象请求的主体迭代器

ensure_tombstone_in_right_location(q_policy_index, account, container, obj, q_ts, path, container_policy_index, source_ts, **kwargs)

对目标发出 DELETE 请求,以匹配源的错位 DELETE。

log_route = 'container-reconciler'
log_stats(force=False)

将统计信息转储到记录器,如果统计信息在过去一分钟内已经记录,则不执行任何操作。

pop_queue(container, obj, q_ts, q_record)

对容器发出删除对象请求,以获取错位对象队列条目。

参数:
  • container – 错位对象的容器

  • obj – 错位对象的名称

  • q_ts – 错位对象的时间戳

  • q_record – 队列条目的时间戳

注意:q_ts 通常与 q_record 相同,除非对象被手动重新入队。

process_queue_item(q_container, q_entry, queue_item)

处理一个条目,并在成功时从队列中删除。

参数:
  • q_container – 队列容器

  • q_entry – 来自 q_container 的 raw_obj 名称

  • queue_item – 来自队列的解析条目

reconcile()

并发处理错位对象的入口点。

迭代所有队列条目,并将处理委托给池中的生成的工作人员。

reconcile_object(info)

处理可能错位的对象写入请求。通过检查主容器确定正确的存储策略。检查源和目标,将对象复制或删除到目标,并根据需要清理源。

此方法用异常处理包装 _reconcile_object。

参数:

info – 一个队列条目字典

返回值:

如果请求已完全成功处理,则为 True,否则为 False。

run_forever(*args, **kwargs)

重写此方法以永久运行

run_once(*args, **kwargs)

处理队列中的每个条目。

should_process(queue_item)

检查给定的条目是否应由此进程处理。

参数:
  • container – 队列容器

  • queue_item – 来自队列的条目

stats_log(metric, msg, *args, **kwargs)

更新指标跟踪并发出日志消息。

throw_tombstones(account, container, obj, timestamp, policy_index, path)

对给定的存储策略发出删除对象请求。

参数:
  • account – 帐户名

  • container – 容器名

  • obj – 对象名

  • timestamp – 要删除的对象的的时间戳

  • policy_index – 用于定向请求的策略索引

  • path – 用于记录的路径

swift.container.reconciler.add_to_reconciler_queue(container_ring, account, container, obj, obj_policy_index, obj_timestamp, op, force=False, conn_timeout=5, response_timeout=15)

将对象添加到容器协调器的队列中。这将导致容器协调器将其从当前的存储策略索引移动到正确的存储策略索引。

参数:
  • container_ring – 容器环

  • account – 错位对象的帐户

  • container – 错位对象的容器

  • obj – 错位对象

  • obj_policy_index – 错位对象当前所在的策略索引

  • obj_timestamp – 错位对象的 X-Timestamp。我们需要这个来确保协调器不会用旧的对象覆盖较新的对象。

  • op – 操作的方法 (DELETE 或 PUT)

  • force – 覆盖比 obj_timestamp 更新的队列条目

  • conn_timeout – 连接到容器服务器的最大等待时间

  • response_timeout – 从容器服务器接收响应的最大等待时间

返回值:

.misplaced_object 容器名称,失败时为 False。“成功”意味着大多数容器都收到了更新。

swift.container.reconciler.best_policy_index(headers)
swift.container.reconciler.cmp_policy_info(info, remote_info)

你必须眯起眼睛才能看到它,但总的策略是

如果其中任何一个已被重建

返回最新版本(重创建的版本)

否则

返回最旧版本

我尝试清理它一段时间,但最终选择了编写一堆测试。一旦你对这里的细微差别有了直观的理解,你可以尝试看看是否有更好的方式来表达布尔逻辑,但最终结果看起来会有点复杂。

返回值:

-1 表示信息正确,1 表示 remote_info 更好

swift.container.reconciler.direct_delete_container_entry(container_ring, account_name, container_name, object_name, headers=None)

直接与主容器服务器通信以删除特定的对象列表条目。不与对象服务器通信;仅当容器条目实际上没有对应的对象时才使用此方法。

swift.container.reconciler.get_reconciler_container_name(obj_timestamp)

获取一个容器的名称,将错放的对象应该被排队到该容器中。该名称是对象的最后修改时间向下取整到最接近的小时。

参数:

obj_timestamp – 容器数据库行中对象的“created_at”时间的字符串表示。

返回值:

一个容器名称

swift.container.reconciler.get_reconciler_content_type(op)
swift.container.reconciler.get_reconciler_obj_name(policy_index, account, container, obj)
swift.container.reconciler.get_row_to_q_entry_translator(broker)
swift.container.reconciler.incorrect_policy_index(info, remote_info)

比较 remote_info 和 info,并确定是否应该使用远程存储策略索引而不是我们自己的索引。

swift.container.reconciler.main()
swift.container.reconciler.parse_raw_obj(obj_info)

将一个 reconciler 容器列表条目转换为一个字典,其中包含错放对象队列条目的各个部分。

参数:

obj_info – 容器列表中的一个条目,其中包含所需的键:name、content_type 和 hash

返回值:

一个队列条目字典,其中包含键:q_policy_index、account、container、obj、q_op、q_ts、q_record 和 path

swift.container.reconciler.slightly_later_timestamp(ts, offset=1)
swift.container.reconciler.translate_container_headers_to_info(headers)

容器分片器

class swift.container.sharder.CleavingContext(ref, cursor='', max_row=None, cleave_to_row=None, last_cleave_to_row=None, cleaving_done=False, misplaced_done=False, ranges_done=0, ranges_todo=0)

基类: object

封装与分割退休数据库的过程相关联的元数据。这些元数据包括

  • ref:用于将序列化的 CleavingContext 作为数据库中的 sysmeta 持久化的键的唯一部分。唯一部分基于数据库 ID。这确保了每个上下文都与特定的数据库文件相关联。该键的唯一部分包含在 CleavingContext 中,但不应由任何调用者修改。

  • cursor:最后要从退休数据库中分割的切片范围的上限。

  • max_row:退休数据库的最大行数;每次为该数据库加载 CleavingContext 时,都会将其更新为退休数据库的 max_row 的值,并且在分割数据库的过程中可能会发生变化。

  • cleave_to_row:开始分割数据库时的 max_row 的值。当分割完成(即分割游标已达到分割命名空间的上限)时,将 cleave_to_row 与当前的 max_row 进行比较:如果这两个值不相等,则表示已将行添加到数据库中,这些行可能未被分割,在这种情况下,CleavingContextreset 并重新启动分割。

  • last_cleave_to_row:应该从退休数据库中选择对象进行分割的最小行数;最初设置为 None,即应该分割所有行。如果 CleavingContextreset,则 last_cleave_to_row 设置为当前 cleave_to_row 的值,而 cleave_to_row 又被后续调用 start 设置为当前 max_row 的值。因此,重复分割仅选择大于 last_cleave_to_row 的行中的对象,而不是再次分割整个数据库。

  • ranges_done:已从退休数据库中分割的切片范围的数量。

  • ranges_todo:尚未从退休数据库中分割的切片范围的数量。

property cursor
delete(broker)
done()
classmethod load(broker)

返回跟踪给定 broker 数据库的分割进度的 CleavingContext。

参数:

brokerContainerBroker 的实例

返回值:

CleavingContext 的实例。

classmethod load_all(broker)

返回存储在 broker 数据库中的所有分割上下文。

参数:

brokerContainerBroker 的实例

返回值:

(CleavingContext, 时间戳) 元组的列表

property marker
range_done(new_cursor)
reset()
start()
store(broker)

将序列化的 CleavingContext 作为 sysmeta 持久化到给定的 broker 的数据库中。

参数:

brokerContainerBroker 的实例

class swift.container.sharder.ContainerSharder(conf, logger=None)

继承自 ContainerSharderConf, ContainerReplicator

分割容器。

debug(broker, msg, *args, **kwargs)
error(broker, msg, *args, **kwargs)
exception(broker, msg, *args, **kwargs)
info(broker, msg, *args, **kwargs)
log_route = 'container-sharder'
periodic_warning(broker, msg, *args, **kwargs)
run_forever(*args, **kwargs)

运行容器分片器直到停止。

run_once(*args, **kwargs)

运行容器分片器一次。

warning(broker, msg, *args, **kwargs)
yield_objects(broker, src_shard_range, since_row=None, batch_size=None)

迭代 src_shard_range 中的所有对象行,按名称顺序排列,以最多 batch_size 的长度的列表形式产生它们。所有未标记为已删除的行批次在所有标记为已删除的行批次之前产生。

参数:
  • broker – 一个 ContainerBroker

  • src_shard_range – 一个 ShardRange,描述源范围。

  • since_row – 仅包含 ROWID 大于给定行 ID 的对象行;默认情况下包含所有对象行。

  • batch_size – 每个产生的批次中包含的最大对象行数;默认为 cleave_row_batch_size。

返回值:

一个生成器,产生 (行列表,broker 信息字典) 的元组

yield_objects_to_shard_range(broker, src_shard_range, dest_shard_ranges)

迭代 src_shard_range 中的所有对象行,以将它们放置在 dest_shard_ranges 函数提供的目标分片范围中。产生 (对象行批次,属于该批次对象行的目标分片范围,broker 信息) 的元组。

如果对于对象行批次不存在目标分片范围,则产生 (对象行批次,None,broker 信息) 的元组。这表示调用者存在未找到目标分片范围的非零数量的对象行。

请注意,相同的目标分片范围可以在多个产生的元组中引用。

参数:
  • broker – 一个 ContainerBroker

  • src_shard_range – 一个 ShardRange,描述源范围。

  • dest_shard_ranges – 一个函数,应该返回按 sort_key() 定义的顺序排序的目标分片范围列表。

返回值:

一个生成器,产生 (对象行列表,分片范围,broker 信息字典) 的元组,其中 shard_range 可能是 None

class swift.container.sharder.ContainerSharderConf(conf=None)

基类: object

percent_of_threshold(val)
classmethod validate_conf(namespace)
swift.container.sharder.combine_shard_ranges(new_shard_ranges, existing_shard_ranges)

基于最新状态组合新的和现有的分片范围。

参数:
  • new_shard_ranges – ShardRange 实例的列表。

  • existing_shard_ranges – ShardRange 实例的列表。

返回值:

ShardRange 实例的列表。

swift.container.sharder.finalize_shrinking(broker, acceptor_ranges, donor_ranges, timestamp)

更新捐赠者分片范围为缩小状态,并将捐赠者和接受者合并到 broker。

参数:
  • broker – 一个 ContainerBroker

  • acceptor_ranges – 将作为接受者的 ShardRange 列表。

  • donor_ranges – 将作为捐赠者的 ShardRange 列表;这些将更新其状态和时间戳。

  • timestamp – 更新捐赠者状态时使用的时间戳

swift.container.sharder.find_compactible_shard_sequences(broker, shrink_threshold, expansion_limit, max_shrinking, max_expanding, include_shrinking=False)

查找可以合并到单个接受者分片范围中的分片范围序列。

此函数不会修改分片范围。

参数:
  • broker – 一个 ContainerBroker

  • shrink_threshold – 分片可能被认为缩小到另一个分片的行数的阈值

  • expansion_limit – 在其他分片范围合并到其中之后,接受者分片范围应具有的最大行数

  • max_shrinking – 每个接受者可以合并的最大分片范围数;-1 表示无限制。

  • max_expanding – 要找到的接受者的最大数量(即,要返回的序列的最大数量);-1 表示无限制。

  • include_shrinking – 如果为 True,则将现有的可合并序列包含在结果中;默认值为 False。

返回值:

一个 ShardRangeList 列表,每个列表包含可以合并的相邻分片范围序列;列表中的最后一个分片范围是接受者

swift.container.sharder.find_overlapping_ranges(shard_ranges, exclude_parent_child=False, time_period=0)

查找给定列表中所有重叠的范围。

参数:
  • shard_rangesShardRange 的列表

  • exclude_parent_child – 如果为 True,则排除在过去时间段 time_period 内具有父子关系的重叠对。默认值为 False。

  • time_period – 指定的过去时间段,以秒为单位。值为 0 表示过去的所有时间。

返回值:

一个元组集合,每个元组包含相互重叠的范围。

swift.container.sharder.find_paths(shard_ranges)

返回通过分片范围的所有连续路径。单个路径不一定跨越整个命名空间,但它将跨越一个没有间隙的连续命名空间。

参数:

shard_rangesShardRange 的列表。

返回值:

一个 ShardRangeList 列表。

swift.container.sharder.find_paths_with_gaps(shard_ranges, within_range=None)

查找分片范围中的间隙以及通向这些间隙和从这些间隙出发的分片范围路径对。对于每个间隙,选择一对相邻路径。所有选定的路径和间隙的串联将跨越整个命名空间,没有重叠。

参数:
  • shard_ranges – ShardRange 实例的列表。

  • within_range – 一个可选的 ShardRange,用于约束搜索空间;该方法仅返回该范围内的间隙。默认值为整个命名空间。

返回值:

一个元组列表,格式为 (start_path, gap_range, end_path),其中 start_path 是通向间隙的分片范围列表,gap_range 是描述命名空间间隙的合成 ShardRange,end_path 是从间隙出发的分片范围列表。当间隙从命名空间的最小或最大边界开始或结束时,start_pathend_path 可能是包含命名空间的最小或最大值的“空”路径。

swift.container.sharder.find_sharding_candidates(broker, threshold, shard_ranges=None)
swift.container.sharder.find_shrinking_candidates(broker, shrink_threshold, expansion_limit)
swift.container.sharder.is_sharding_candidate(shard_range, threshold)
swift.container.sharder.is_shrinking_candidate(shard_range, shrink_threshold, expansion_limit, states=None)
swift.container.sharder.main()
swift.container.sharder.make_shard_ranges(broker, shard_data, shards_account_prefix)
swift.container.sharder.process_compactible_shard_sequences(broker, sequences)

将给定的分片范围序列转换为一个可接受者列表和一个缩小捐赠者列表。对于给定的每个序列,序列中的最后一个分片范围(可接受者)将被扩展以容纳序列中的其他分片范围(捐赠者)。然后,捐赠者和可接受者将被合并到broker中。

参数:
swift.container.sharder.random() x 区间 [0, 1)内。
swift.container.sharder.rank_paths(paths, shard_range_to_span)

对给定的路径列表进行排序,使得最首选的路径是列表中的第一个项目。

参数:
  • paths – 一个 ShardRangeList 列表。

  • shard_range_to_span – 一个 ShardRange 实例,它描述了理想情况下应该由路径跨越的命名空间。包含此命名空间的路径将比不包含此命名空间的路径更受青睐。

返回值:

一个排序后的 ShardRangeList 列表。

swift.container.sharder.sharding_enabled(broker)
swift.container.sharder.update_own_shard_range_stats(broker, own_shard_range)

使用 broker 中的最新对象统计信息更新 own_shard_range

注意:此方法不会持久化更新后的 own_shard_range;如果需要持久化更新后的统计信息,调用者应使用 broker.merge_shard_ranges

参数:
  • brokerContainerBroker 的一个实例。

  • own_shard_rangeShardRange 的一个实例。

返回值:

own_shard_range 具有最新的 object_countbytes_used

容器同步

class swift.container.sync.ContainerSync(conf, container_ring=None, logger=None)

基类: Daemon

同步可同步容器的守护进程。

这是通过扫描本地设备以查找容器数据库并检查 x-container-sync-to 和 x-container-sync-key 元数据值来完成的。如果它们存在,自上次同步以来较新的行将触发对其他容器的 PUT 或 DELETE 操作。

实际的同步稍微复杂一些,以便利用三个(或副本数)主节点来处理容器,而无需每个节点都尝试执行完全相同的工作,但如果某个节点碰巧关闭,也不会错过任何工作。

为每个容器数据库保留两个同步点。两个同步点之间的所有行都会触发更新。任何比两个同步点都新的行都会根据节点对于容器的位置(主节点执行三分之一,等等,具体取决于副本数)来触发更新。

一个例子可能会有所帮助。假设副本计数为 3,并且 ROWID 从 1 开始完美匹配。

第一次同步运行,数据库有 6 行

  • SyncPoint1 从 -1 开始。

  • SyncPoint2 从 -1 开始。

  • 点之间没有行,因此没有“所有更新”行。

  • 六行比 SyncPoint1 新,因此三分之一的行由节点 1 发送,另一三分之一由节点 2 发送,剩余三分之一由节点 3 发送。

  • SyncPoint1 设置为 6(已知的最新 ROWID)。

  • SyncPoint2 保持为 -1,因为没有同步“所有更新”行。

下一次同步运行,数据库有 12 行

  • SyncPoint1 从 6 开始。

  • SyncPoint2 从 -1 开始。

  • -1 和 6 之间的行都会触发更新(大多数在远程端都会短路,因为已经完成)。

  • 六行比 SyncPoint1 新,因此三分之一的行由节点 1 发送,另一三分之一由节点 2 发送,剩余三分之一由节点 3 发送。

  • SyncPoint1 设置为 12(已知的最新 ROWID)。

  • SyncPoint2 设置为 6(最新的“所有更新”ROWID)。

这样,在正常情况下,每个节点都会在每次运行中发送其份额的更新,并发送一批较旧的更新以确保没有遗漏任何内容。

参数:
  • conf – 来自 container-server.conf 文件的 [container-sync] 部分的配置值字典。

  • container_ring – 如果为 None,则将加载 <swift_dir>/container.ring.gz。这被单元测试覆盖。

allowed_sync_hosts

我们允许同步到的主机列表。这可以被 self.realms_conf 中的数据覆盖

conf

来自 container-server.conf 文件的 [container-sync] 部分的配置值字典。

container_deletes

触发的成功 DELETE 操作的数量。

container_failures

发生某种类型故障的容器数量。

container_puts

触发的成功 PUT 操作的数量。

container_report(start, end, sync_point1, sync_point2, info, max_row)
container_ring

swift.common.ring.Ring 用于定位容器。

container_skips

已关闭同步但尚未从同步存储中清除的容器数量。

container_stats

每个容器的统计信息。这些统计信息是每个容器收集的。puts - 执行的 PUT 操作的数量 deletes - 执行的 DELETE 操作的数量 bytes - 传输的总字节数

container_sync(path)

检查给定的路径是否存在容器数据库,确定是否已为该数据库启用同步,如果是,则将任何更新发送到其他容器。

参数:

path – 容器数据库的路径

container_sync_row(row, sync_to, user_key, broker, info, realm, realm_key)

将行指示的更新发送到 sync_to 容器。更新可以是删除或放置。

参数:
  • row – 本地数据库中更新的行,触发同步更新。

  • sync_to – 远程容器的 URL。

  • user_key – 发送到其他容器的请求时使用的 X-Container-Sync-Key。

  • broker – 本地容器数据库 broker。

  • info – 本地容器数据库 broker 的 get_info 结果。

  • realm – 如果存在,则来自 self.realms_conf 的 realm。如果为 None,则回退到使用较旧的 allowed_sync_hosts 方法进行同步。

  • realm_key – 如果存在,则来自 self.realms_conf 的 realm key。如果为 None,则回退到使用较旧的 allowed_sync_hosts 方法进行同步。

返回值:

成功时返回 True

container_syncs

已启用同步并成功同步的容器数量。

container_time

花费在同步容器上的最大时间,然后转到下一个容器。如果容器同步在此时未完成,则下次扫描将恢复它。

devices

本地设备挂载点的路径。

interval

完整扫描之间的最小时间。这可以防止守护进程在几乎为空的系统上运行。

log_route = 'container-sync'
logger

用于容器同步日志行的记录器。

mount_check

指示是否应将挂载点验证为实际挂载点(通常为 true,对于测试和 SAIO 为 false)。

realms_conf

用于验证 sync-to 值的 ContainerSyncCluster 实例。

report()

将统计信息写入记录器并重置下一份报告的统计信息。

reported

上次统计报告的时间。

run_forever(*args, **kwargs)

运行容器同步扫描,直到停止。

run_once(*args, **kwargs)

运行单个容器同步扫描。

select_http_proxy()
sync_store

ContainerSyncStore 实例,用于迭代同步的容器

swift.container.sync.main()
swift.container.sync.random() x 区间 [0, 1)内。

容器更新程序

class swift.container.updater.ContainerUpdater(conf, logger=None)

基类: Daemon

更新帐户列表中容器信息。

container_report(node, part, container, put_timestamp, delete_timestamp, count, bytes, storage_policy_index)

向账户服务器报告容器信息。

参数:
  • node – 来自账户环的节点字典

  • part – 账户所在的partition

  • container – 容器名称

  • put_timestamp – 放入时间戳

  • delete_timestamp – 删除时间戳

  • count – 容器中的对象数量

  • bytes – 容器中使用的字节数

  • storage_policy_index – 容器的策略索引

container_sweep(path)

遍历路径,查找容器数据库并处理它们。

参数:

path – 要遍历的路径

get_account_ring()

获取账户环。如果尚未加载,则加载它。

get_paths()

获取要处理的每个驱动器上所有partition的路径。

返回值:

路径列表

process_container(dbfile)

处理一个容器,并更新账户中的信息。

参数:

dbfile – 要处理的容器数据库

run_forever(*args, **kwargs)

持续运行更新器。

run_once(*args, **kwargs)

运行更新器一次。

swift.container.updater.main()
swift.container.updater.random() x [0, 1)区间内。