可插拔磁盘后端 API

代理服务器和帐户、容器和对象服务器之间使用的内部 REST API 几乎与公共 Swift REST API 相同,但有一些内部扩展(例如,使用新的容器更新帐户)。

三个 REST API 服务器(帐户、容器、对象)的可插拔后端 API 将服务各种 REST API 的需求与磁盘上数据布局和存储细节抽象开来。

这些 API 在所有三个服务器的参考实现中都有文档说明。出于历史原因,对象服务器后端参考实现模块命名为 diskfile,而帐户和容器服务器后端参考实现模块则命名为相应的名称。

此 API 仍在开发中,尚未最终确定。

帐户服务器 REST API 的后端 API

帐户服务器的可插拔后端

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

封装了与帐户数据库的交互。

create_account_stat_table(conn, put_timestamp)

创建帐户 DB 特有的 account_stat 表。不是可插拔后端的一部分,是基线代码的内部实现。

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

  • put_timestamp – 放入时间戳

create_container_table(conn)

创建帐户 DB 特有的容器表。

参数:

conn – 数据库连接对象

create_policy_stat_table(conn)

创建帐户 DB 特有的 policy_stat 表。不是可插拔后端的一部分,是基线代码的内部实现。

参数:

conn – 数据库连接对象

empty()

检查帐户 DB 是否为空。

返回值:

如果数据库中没有活动的容器,则返回 True。

get_info()

获取帐户的全局数据。

返回值:

字典,键包括:account、created_at、put_timestamp、delete_timestamp、status_changed_at、container_count、object_count、bytes_used、hash、id

get_policy_stats(do_migrations=False)

获取帐户的全局策略统计信息。

参数:

do_migrations – 布尔值,如果为 True,则策略统计信息字典将始终包含“container_count”键;否则,在迁移之前,它可能会在旧版数据库中省略。

返回值:

策略统计信息的字典,其中键是策略索引,值是类似于 {‘object_count’: M, ‘bytes_used’: N, ‘container_count’: L} 的字典

is_status_deleted()

仅当状态字段设置为 DELETED 时才返回 True。

list_containers_iter(limit, marker, end_marker, prefix, delimiter, reverse=False, allow_reserved=False)

按名称排序,从 marker 开始,最多 limit 个条目获取容器列表。条目将以 prefix 开头,并且在 prefix 之后不会有 delimiter。

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

  • marker – marker 查询

  • end_marker – 结束 marker 查询

  • prefix – prefix 查询

  • delimiter – delimiter 查询

  • reverse – 反转结果顺序。

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

返回值:

元组列表,格式为 (name, object_count, bytes_used, put_timestamp, storage_policy_index, is_subdir)

make_tuple_for_pickle(record)

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

merge_items(item_list, source=None)

将条目合并到容器表中。

参数:
  • item_list – 字典列表,格式为 {‘name’, ‘put_timestamp’, ‘delete_timestamp’, ‘object_count’, ‘bytes_used’, ‘deleted’, ‘storage_policy_index’}

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

put_container(name, put_timestamp, delete_timestamp, object_count, bytes_used, storage_policy_index)

使用给定的属性创建容器。

参数:
  • name – 要创建的容器的名称(本机字符串)

  • put_timestamp – 要创建的容器的 put_timestamp

  • delete_timestamp – 要创建的容器的 delete_timestamp

  • object_count – 容器中的对象数量

  • bytes_used – 容器使用的字节数

  • storage_policy_index – 此容器的存储策略

容器服务器 REST API 的后端 API

容器服务器的可插拔后端

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)

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

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

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

  • db_files 是代理的现有 db 文件列表。此列表对于已初始化的代理应至少包含一个条目,并且在 SHARDING 状态下,应包含两个条目。

  • db_file 是指向当前对容器具有权威性的主要 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 – 如果需要初始化代理,则为初始时间戳

  • storage_policy_index – 存储策略索引

返回值:

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

create_container_info_table(conn, put_timestamp, storage_policy_index)

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

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

  • put_timestamp – 放入时间戳

  • storage_policy_index – 存储策略索引

create_object_table(conn)

创建容器 DB 特有的对象表。不是可插拔后端的一部分,是基线代码的内部实现。

参数:

conn – 数据库连接对象

create_policy_stat_table(conn, storage_policy_index=0)

创建 policy_stat 表。

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

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

create_shard_range_table(conn)

创建容器 DB 特有的 shard_range 表。

参数:

conn – 数据库连接对象

property db_file

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

返回值:

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

property db_files

获取代理的磁盘上存在的有效 db 文件列表的缓存。

可以通过调用刷新缓存

reload_db_files().

返回值:

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

delete_object(name, timestamp, storage_policy_index=0)

标记一个对象为已删除。

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

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

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

empty()

检查容器数据库是否为空。

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

返回值:

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

enable_sharding(epoch)

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

参数:

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 – 最后一个分片范围的最小大小。如果此值大于一,则最后一个分片范围可能会扩展到大于 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_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,则插入自身分片范围的修改副本以填充任何找到的分片范围的末端和自身分片范围的上限之间的间隙。未包含在找到的分片范围内的间隙不会被填充。

返回值:

命名空间对象列表。

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_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 – 如果给定,将返回存储在 sharding info 中的 key 下的值。

返回值:

sharding info 的字典或该字典中 key 下存储的值。

get_sharding_sysmeta_with_timestamps()

返回与经纪人元数据相关的分片特定信息,以及时间戳。

参数:

key – 如果给定,将返回存储在 sharding info 中的 key 下的值。

返回值:

一个包含分片信息的字典,以及它们的时间戳。

has_other_shard_ranges()

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

返回值:

一个布尔值,如上所述。

is_reclaimable(now, reclaim_age)

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

is_root_container()

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

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

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 的字典表示。

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

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

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

  • timestamp – 对象创建的时间戳

  • size – 对象大小

  • content_type – 对象内容类型

  • etag – 对象 etag

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

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

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

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

reload_db_files()

重新加载此经纪人的有效磁盘数据库文件的缓存列表。

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 – 如果给定列表中的任何值既不是有效状态也不是有效别名

set_sharded_state()

取消链接经纪人的退役数据库文件。

返回值:

如果退役数据库已成功取消链接,则返回 True,否则返回 False。

set_sharding_state()

创建并初始化一个新鲜的数据库文件,为分片退役数据库做准备。为了使此方法成功,经纪人自己的分片范围必须具有 epoch 时间戳。

返回值:

如果新鲜的数据库已成功创建,则返回 True,否则返回 False。

set_sharding_sysmeta(key, value)

更新经纪人存储在给定键下的元数据,该键以前缀为分片特定的命名空间。

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

  • value – 元数据值

set_storage_policy_index(policy_index, timestamp=None)

更新 container_stat policy_index 和 status_changed_at。

sharding_initiated()

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

sharding_required()

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

swift.container.backend.merge_shards(shard_data, existing)

shard_dataexisting 进行比较,并使用 shard_data 中相应条目优先的 existing 中的任何条目更新 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)

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

多个时间戳被编码到一个字符串中,用于存储在对象数据库表的 ‘created_at’ 列中。

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

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

返回值:

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

对象服务器 REST API 的后端 API

Swift 对象服务器的磁盘文件接口

DiskFileDiskFileWriterDiskFileReader 类组合定义了支持对象服务器 REST API 接口(不包括 REPLICATE)的磁盘抽象层。希望提供对象服务器替代后端的其他实现必须实现这三个类。可以在 mem_server.pymem_diskfile.py 模块以及本模块中找到一个示例替代实现。

DiskFileManager 是一个参考实现特定类,不属于后端 API。

此模块的其余方法被认为是实现特定的,也不被认为是后端 API 的一部分。

class swift.obj.diskfile.AuditLocation(path, device, partition, policy)

表示要审计的对象位置。

除了成为一个数据桶之外,唯一有用的事情是字符串化为文件系统路径,以便审计器的日志看起来不错。

class swift.obj.diskfile.BaseDiskFile(mgr, device_path, partition, account=None, container=None, obj=None, _datadir=None, policy=None, use_splice=False, pipe_size=None, open_expired=False, next_part_power=None, **kwargs)

管理对象文件。

此特定实现管理格式化为 POSIX 兼容文件系统的磁盘上的对象文件,该文件系统支持将扩展属性作为文件或目录上的元数据。

注意

构造函数的参数被认为是特定于实现的。API 未定义构造函数参数。

数据文件位置使用的路径格式如下:<devices_path/<device_dir>/<datadir>/<partdir>/<suffixdir>/<hashdir>/ <datafile>.<ext>

参数:
  • mgr – 关联的 DiskFileManager 实例

  • device_path – 目标设备或驱动器的路径

  • partition – 对象所在的设备上的分区

  • account – 对象的帐户名

  • container – 对象的容器名

  • obj – 对象的对象名

  • _datadir – 覆盖此处构建的完整 datadir

  • policy – StoragePolicy 实例

  • use_splice – 如果为 true,则使用零拷贝 splice() 发送数据

  • pipe_size – 零拷贝操作中使用的管道缓冲区大小

  • open_expired – 如果为 True,open() 不会在对象过期时引发 DiskFileExpired

  • next_part_power – 要使用的下一个分区幂

create(size=None, extension='.data')

创建文件的上下文管理器。我们首先创建一个临时文件,然后返回一个 DiskFileWriter 对象来封装状态。

注意

即使指定了参数,实现也不需要执行磁盘上的预分配。但是,如果它失败了,则必须引发 DiskFileNoSpace 异常。

参数:
  • size – 显式在磁盘上分配的文件的可选初始大小

  • extension – 新创建文件的文件扩展名;默认为 .data 以便进行测试

引发:

DiskFileNoSpace – 如果指定了大小并且分配失败

delete(timestamp)

删除对象。

此实现使用给定的时间戳创建一个墓碑文件,并删除对象文件的任何旧版本。任何时间戳早于时间戳的文件都将被删除。

注意

实现可以自由使用或忽略时间戳参数。

参数:

timestamp – 与每个文件进行比较的时间戳

引发:

DiskFileError – 此实现将引发与 create() 方法相同的错误。

property durable_timestamp

提供在对象目录中找到的最新数据文件的的时间戳。

返回值:

一个 Timestamp 实例,或者如果没有找到数据文件则为 None。

引发:

DiskFileNotOpen – 如果尚未在此实例上调用 open() 方法。

get_datafile_metadata()

提供先前打开对象的 datafile 元数据作为字典。这是在最初 PUT 对象时包含的元数据,不包括任何后续 POST 设置的元数据。

返回值:

对象的 datafile 元数据字典

引发:

DiskFileNotOpen – 如果未先前调用 swift.obj.diskfile.DiskFile.open() 方法

get_metadata()

提供先前打开对象的元数据作为字典。

返回值:

对象的元数据字典

引发:

DiskFileNotOpen – 如果未先前调用 swift.obj.diskfile.DiskFile.open() 方法

get_metafile_metadata()

提供先前打开对象的 metafile 元数据作为字典。这是由 POST 写入的元数据,不包括原始 PUT 设置的任何持久元数据。

返回值:

对象的 .meta 文件元数据字典,或者如果没有 .meta 文件则为 None

引发:

DiskFileNotOpen – 如果未先前调用 swift.obj.diskfile.DiskFile.open() 方法

open(modernize=False, current_time=None)

打开对象。

此实现打开表示对象的 data 文件,读取扩展属性中的关联元数据,并结合来自快速 POST .meta 文件的元数据。

参数:
  • modernize – 如果设置,则将此 diskfile 更新到最新格式。目前,这意味着如果不存在元数据校验和,则添加元数据校验和。

  • current_time – 用于检查过期的 Unix 时间。如果未提供,将使用当前时间。

注意

实现允许引发以下任何异常,但仅需要在对象表示不存在时引发 DiskFileNotExist

引发:
返回值:

自身用作上下文管理器

read_metadata(current_time=None)

在不要求调用者先打开对象的情况下,返回对象的元数据。

参数:

current_time – 用于检查过期的 Unix 时间。如果未提供,将使用当前时间。

返回值:

对象的元数据字典

引发:

DiskFileError – 此实现将引发与 open() 方法相同的错误。

reader(keep_cache=False, cooperative_period=0, etag_validate_frac=1, _quarantine_hook=<function BaseDiskFile.<lambda>>)

返回一个与 swift.common.swob.Response 类兼容的“app_iter”对象,如 swift.obj.diskfile.DiskFileReader 中定义的那样。

对于此实现,关闭打开文件的责任传递给 swift.obj.diskfile.DiskFileReader 对象。

参数:
  • keep_cache – 调用者对将数据保留在操作系统缓冲区缓存中的偏好

  • cooperative_period – 文件读取期间协同 yield 的周期参数

  • etag_validate_frac – 在完整文件读取期间我们应该执行 etag 验证的概率

  • _quarantine_hook – 1 参数可调用对象,在隔离对象时调用;参数是隔离原因。默认情况下忽略它。REST 层不需要。

返回值:

一个 swift.obj.diskfile.DiskFileReader 对象

write_metadata(metadata)

将元数据块写入对象,而无需调用者先创建对象。支持快速 POST 行为语义。

参数:

metadata – 要与对象关联的元数据字典

引发:

DiskFileError – 此实现将引发与 create() 方法相同的错误。

class swift.obj.diskfile.BaseDiskFileManager(conf, logger)

设备管理类,为共享参数和 DiskFile 类未提供的常见方法提供通用位置(DiskFile 类主要服务于对象服务器 REST API 层)。

get_diskfile() 方法是此实现创建 DiskFile 对象的方式。

注意

此类是参考实现特定的,不属于可插拔的磁盘后端 API 的一部分。

注意

TODO(portante):不确定在这里推荐什么名称,因为“manager”似乎足够通用,但欢迎提出建议。

参数:
  • conf – 调用者提供的配置对象

  • logger – 调用者提供的 logger

cleanup_ondisk_files(hsh_path, **kwargs)

清理过时的磁盘文件并收集对象的有效磁盘文件集合。

参数:
  • hsh_path – 对象哈希路径

  • frag_index – 如果设置,则搜索特定的片段索引 .data 文件,否则接受第一个有效的 .data 文件

返回值:

一个字典,可能包含:以其文件名扩展名为键的有效磁盘文件;存储在键 ‘obsolete’ 下的过时文件列表;存储在键 ‘files’ 下的目录中剩余的文件列表,反向排序。

static consolidate_hashes(partition_dir)

获取 hashes.pkl 和 hashes.invalid 中的内容,将它们组合起来,将结果写回 hashes.pkl,并清除 hashes.invalid。

参数:

partition_dir – 包含 hashes.pkl 和 hashes.invalid 的分区目录的绝对路径

返回值:

一个字典,后缀哈希(如果有),键 ‘valid’ 如果 hashes.pkl 损坏、无法读取或不存在则为 False

construct_dev_path(device)

构造设备的路径,而不检查它是否已挂载。

参数:

device – 目标设备的名称

返回值:

设备的完整路径

get_dev_path(device, mount_check=None)

返回设备的路径,首先检查它是否是适当的挂载点,或者根据 mount_check 配置选项至少是一个目录。

参数:
  • device – 目标设备的名称

  • mount_check – 是否检查设备的挂载状态。默认为 self.mount_check 的布尔值。

返回值:

设备的完整路径,如果设备的路径不是适当的挂载点或目录,则为 None。

get_diskfile(device, partition, account, container, obj, policy, **kwargs)

根据对象的 partition、路径部分和 policy 返回一个 BaseDiskFile 实例。

参数:
  • device – 目标设备的名称

  • partition – 对象所在的设备上的分区

  • account – 对象的帐户名

  • container – 对象的容器名

  • obj – 对象的对象名

  • policy – StoragePolicy 实例

get_diskfile_and_filenames_from_hash(device, partition, object_hash, policy, **kwargs)

返回一个元组,包含给定 object_hash 的 DiskFile 实例以及该对象 hash 目录中文件的基本名称。以防有人考虑重构,请确保不会引发 DiskFileDeleted,而是返回表示已删除对象的 DiskFile 实例。

参数:
  • device – 目标设备的名称

  • partition – 对象所在的设备上的分区

  • object_hash – 对象路径的哈希值

  • policy – StoragePolicy 实例

引发:

DiskFileNotExist – 如果对象不存在

返回值:

一个元组,包含 (BaseDiskFile 的实例,文件基本名称列表)

get_diskfile_from_audit_location(audit_location)

返回给定 AuditLocation 的 BaseDiskFile 实例。

参数:

audit_location – 要审计的对象位置

get_diskfile_from_hash(device, partition, object_hash, policy, **kwargs)

返回给定 object_hash 的 DiskFile 实例。以防有人考虑重构,请确保不会引发 DiskFileDeleted,而是返回表示已删除对象的 DiskFile 实例。

参数:
  • device – 目标设备的名称

  • partition – 对象所在的设备上的分区

  • object_hash – 对象路径的哈希值

  • policy – StoragePolicy 实例

引发:

DiskFileNotExist – 如果对象不存在

返回值:

BaseDiskFile 的实例

get_hashes(device, partition, suffixes, policy, skip_rehash=False)
参数:
  • device – 目标设备的名称

  • partition – 分区名称

  • suffixes – 要重新计算的后缀目录列表

  • policy – StoragePolicy 实例

  • skip_rehash – 仅将后缀标记为脏;返回 None

返回值:

一个将后缀目录映射的字典

get_ondisk_files(files, datadir, verify=True, policy=None, **kwargs)

给定一个简单的文件名称列表,确定构成有效文件集的那些文件(即定义对象状态的文件集),并确定哪些文件已过时并可以删除。请注意,有些文件可能不属于任何一类。

如果某个文件被认为是有效文件集的一部分,则其信息字典将被添加到结果字典中,键名为 <extension>_info。任何不再需要的文件都将将其信息字典添加到存储在键 ‘obsolete’ 下的列表中。

结果字典始终包含键为 ‘ts_file’、‘data_file’ 和 ‘meta_file’ 的条目。它们的值将是相应类型文件的完全限定路径(如果有效文件集中存在这样的文件),或者为 None。

参数:
  • files – 文件名称列表。

  • datadir – 文件所在的目录名称;这用于在结果中构造文件路径,但此方法不会修改 datadir。

  • verify – 如果为 True,则验证 ondisk 文件契约是否未被违反,否则不进行验证。

  • policy – 用于存储文件的存储策略。用于验证 EC 策略的片段索引。

返回值:

一个包含键的字典

ts_file -> .ts 文件的路径或 None data_file -> .data 文件的路径或 None meta_file -> .meta 文件的路径或 None ctype_file -> .meta 文件的路径或 None

并且可能包含键

ts_info -> .ts 文件的文件信息字典 data_info -> .data 文件的文件信息字典 meta_info -> .meta 文件的文件信息字典 ctype_info -> 包含 content-type 值的 .meta 文件的文件信息字典 unexpected -> 意外文件的文件路径列表 possible_reclaim -> 可回收文件的文件信息字典列表 obsolete -> 过时文件的文件信息字典列表

static invalidate_hash(suffix_dir)

使分区哈希文件中的 suffix_dir 的哈希失效。

参数:

suffix_dir – 需要使哈希失效的后缀目录的绝对路径

make_on_disk_filename(timestamp, ext=None, ctype_timestamp=None, *a, **kw)

返回给定时间戳的文件名。

参数:
  • timestamp – 对象时间戳,Timestamp 的实例

  • ext – 一个可选字符串,表示要附加到返回的文件名的文件扩展名

  • ctype_timestamp – 一个可选的内容类型时间戳,Timestamp 的实例

返回值:

一个文件名

object_audit_location_generator(policy, device_dirs=None, auditor_type='ALL')

为存储在 device_dirs 下的所有对象生成 AuditLocation。

参数:
  • policy – StoragePolicy 实例

  • device_dirs – 目标设备的目录

  • auditor_type – 要么 ALL 要么 ZBF

parse_on_disk_filename(filename, policy)

解析磁盘上的文件名。

参数:
  • filename – 包含扩展名的文件名

  • policy – 用于存储文件的存储策略

返回值:

一个字典,包含时间戳、ext 和 ctype_timestamp 的键

  • timestamp 是一个 Timestamp

  • ctype_timestamp 是一个 Timestamp 或 None,用于 .meta 文件,否则为 None

  • ext 是一个字符串,包含前导点的文件扩展名,或者如果文件名没有扩展名则为空字符串。

子类可以覆盖此方法以将更多键添加到返回的字典中。

引发:

DiskFileError – 如果文件名中的任何部分都无法验证。

partition_lock(device, policy, partition, name=None, timeout=None)

一个上下文管理器,将在给定的分区上加锁。

参数:
  • device – 锁请求的目标设备

  • policy – 锁请求的目标策略

  • partition – 锁请求的目标分区

引发:

PartitionLockTimeout – 如果在配置的超时时间内无法授予分区的锁。

pickle_async_update(device, account, container, obj, data, timestamp, policy)

将描述容器更新通知的数据写入 async_pending 目录中的 pickle 文件。

参数:
  • device – 目标设备的名称

  • account – 对象的帐户名

  • container – 对象的容器名

  • obj – 对象的对象名

  • data – 要写入 pickle 文件的更新数据

  • timestamp – 一个 Timestamp

  • policy – StoragePolicy 实例

static quarantine_renamer(device_path, corrupted_file_path)

如果文件已损坏,将其移动到隔离区域以允许复制进行修复。

参数 device_path:

损坏文件所在的路径。

参数 corrupted_file_path:

要隔离的文件的路径。

返回值:

路径 (str) 文件移动到的目录

引发:

OSError – 重新引发来自 rename 的非 errno.EEXIST / errno.ENOTEMPTY 异常

replication_lock(device, policy, partition)

一个上下文管理器,将在给定的分区上加锁,如果配置为这样做,则在给定的设备上加锁。

参数:
  • device – 目标设备的名称

  • policy – 复制请求的目标策略

  • partition – 复制请求的目标分区

引发:

ReplicationLockTimeout – 如果在配置的超时时间内无法授予设备的锁。

yield_hashes(device, partition, policy, suffixes=None, **kwargs)

为给定设备、分区和(可选)后缀存储的对象信息生成 (hash_only, timestamps) 元组。如果 suffixes 为 None,则将搜索所有存储的后缀以获取对象哈希。请注意,如果 suffixes 不是 None 但为空,例如 [],则不会生成任何内容。

timestamps 是一个字典,其中可能包含以下映射

  • ts_data -> 数据或墓碑文件的 timestamp,

  • ts_meta -> meta 文件的 timestamp(如果存在)

  • ts_ctype -> 包含最新内容的 meta 文件的 timestamp

    content-type 值(如果存在)

  • durable -> 如果数据文件在 ts_data 处是持久的,则为 True,否则为 False

其中 timestamps 是 Timestamp 的实例

参数:
  • device – 目标设备的名称

  • partition – 分区名称

  • policy – StoragePolicy 实例

  • suffixes – 要搜索的可选后缀目录列表

yield_suffixes(device, partition, policy)

为给定设备和分区上存储的后缀生成 (full_path, suffix_only) 元组。

参数:
  • device – 目标设备的名称

  • partition – 分区名称

  • policy – StoragePolicy 实例

class swift.obj.diskfile.BaseDiskFileReader(fp, data_file, obj_size, etag, disk_chunk_size, keep_cache_size, device_path, logger, quarantine_hook, use_splice, pipe_size, diskfile, keep_cache=False, cooperative_period=0, etag_validate_frac=1)

封装用于服务 GET REST API 请求的 WSGI 读取上下文。作为 swift.obj.diskfile.DiskFile 类的 swift.obj.diskfile.DiskFile.reader() 方法的上下文管理器对象。

注意

此方法隔离行为被认为是实现特定的,并且不是 API 所必需的。

注意

构造函数的参数被认为是特定于实现的。API 未定义构造函数参数。

参数:
  • fp – 打开的文件对象指针引用

  • data_file – 对象的磁盘数据文件名

  • obj_size – 经过验证的磁盘对象大小

  • etag – 整个文件的预期元数据 etag 值

  • disk_chunk_size – 从磁盘读取的大小(以字节为单位)

  • keep_cache_size – 将保留在缓存中的最大对象大小

  • device_path – 隔离对象时使用的磁盘设备路径

  • logger – 调用者希望此对象使用的记录器

  • quarantine_hook – 带有原因的 1 个参数可调用对象,在隔离时调用

  • use_splice – 如果为 true,则使用零拷贝 splice() 发送数据

  • pipe_size – 零拷贝操作中使用的管道缓冲区大小

  • diskfile – 创建此 DiskFileReader 实例的 diskfile

  • keep_cache – 结果读取是否应保存在缓冲区缓存中

  • cooperative_period – 文件读取期间协同产生期间的 period 参数

  • etag_validate_frac – 在完整文件读取期间我们应该执行 etag 验证的概率

app_iter_range(start, stop)

返回数据文件的范围 (start, stop) 的迭代器

app_iter_ranges(ranges, content_type, boundary, size)

返回数据文件的范围集的迭代器

close()

如果存在,则关闭打开的文件句柄。

对于这个特定的实现,该方法将在必要时处理文件的隔离。

zero_copy_send(wsockfd)

使用 splice() 和 tee() 执行一些操作,在不触及用户空间的情况下将数据从磁盘移动到网络。

参数:

wsockfd – 发送数据的套接字的文件描述符(整数)

class swift.obj.diskfile.BaseDiskFileWriter(name, datadir, size, bytes_per_sync, diskfile, next_part_power, extension='.data')

封装用于处理 PUT REST API 请求的写入上下文。作为 swift.obj.diskfile.DiskFile 类的 swift.obj.diskfile.DiskFile.create() 方法的上下文管理器对象。

注意

关闭打开的文件描述符的责任在于 swift.obj.diskfile.DiskFile.create() 方法的上下文管理器。

注意

构造函数的参数被认为是特定于实现的。API 未定义构造函数参数。

参数:
  • name – REST API 中的对象名称

  • datadir – 对象最终将位于 swift.obj.diskfile.DiskFileWriter.put() 中的磁盘目录

  • fd – 接收数据的临时文件的打开的文件描述符

  • tmppath – 打开的文件描述符的完整路径名

  • bytes_per_sync – 同步调用之间写入的字节数

  • diskfile – 创建此 DiskFileWriter 实例的 diskfile

  • next_part_power – 要使用的下一个分区幂

  • extension – 要使用的文件扩展名;可用于内部区分 PUT/POST/DELETE 操作

chunks_finished()

暴露有关已写入块的内部统计信息。

返回值:

一个元组,(upload_size, etag)

commit(timestamp)

执行必要的任何操作以将对象标记为持久。对于复制策略类型,这是一个空操作。

参数:

timestamp – 对象 put 时间戳,Timestamp 的一个实例

put(metadata)

完成在磁盘上写入文件。

参数:

metadata – 要与对象关联的元数据字典

write(chunk)

将数据块写入磁盘。此方法的所有调用都必须在调用 :func 之前进行

对于此实现,数据被写入到临时文件。

参数:

chunk – 要写入的数据块,作为一个字符串对象

class swift.obj.diskfile.DiskFile(mgr, device_path, partition, account=None, container=None, obj=None, _datadir=None, policy=None, use_splice=False, pipe_size=None, open_expired=False, next_part_power=None, **kwargs)
reader_cls

别名 DiskFileReader

writer_cls

别名 DiskFileWriter

class swift.obj.diskfile.DiskFileManager(conf, logger)
diskfile_cls

别名 DiskFile

class swift.obj.diskfile.DiskFileReader(fp, data_file, obj_size, etag, disk_chunk_size, keep_cache_size, device_path, logger, quarantine_hook, use_splice, pipe_size, diskfile, keep_cache=False, cooperative_period=0, etag_validate_frac=1)
class swift.obj.diskfile.DiskFileWriter(name, datadir, size, bytes_per_sync, diskfile, next_part_power, extension='.data')
put(metadata)

完成在磁盘上写入文件。

参数:

metadata – 要与对象关联的元数据字典

class swift.obj.diskfile.ECDiskFile(*args, **kwargs)
property durable_timestamp

提供在对象目录中找到的最新持久文件的的时间戳。

返回值:

一个 Timestamp 实例,或者如果没有找到持久文件则为 None。

引发:

DiskFileNotOpen – 如果尚未在此实例上调用 open() 方法。

property fragments

提供有关在对象目录中找到的所有片段的信息,包括没有匹配的持久文件的片段,以及用于构造打开的 diskfile 的任何片段。

返回值:

一个字典,映射 <Timestamp 实例> -> <frag 索引列表>,或者如果 diskfile 未打开或未找到任何片段则为 None。

purge(timestamp, frag_index, nondurable_purge_delay=0, meta_timestamp=None)

从对象目录中删除与指定时间戳匹配的墓碑文件或与指定时间戳和片段索引匹配的数据文件。

这为 EC 重构器/ssync 进程提供了一种将墓碑或片段从移交节点恢复到其主节点的方法。

哈希将被使无效,如果为空,hsh_path 将立即被删除。

参数:
  • timestamp – 对象时间戳,Timestamp 的实例

  • frag_index – 片段存档索引,必须是整数或 None。

  • nondurable_purge_delay – 仅当非持久数据文件在磁盘上存在的时间超过此秒数时才删除它。

  • meta_timestamp – 如果不为 None,则删除具有此时间戳的任何元文件

reader_cls

别名 ECDiskFileReader

writer_cls

别名 ECDiskFileWriter

class swift.obj.diskfile.ECDiskFileManager(conf, logger)
diskfile_cls

别名 ECDiskFile

make_on_disk_filename(timestamp, ext=None, frag_index=None, ctype_timestamp=None, durable=False, *a, **kw)

返回给定时间戳的 EC 特定文件名。

参数:
  • timestamp – 对象时间戳,Timestamp 的实例

  • ext – 一个可选字符串,表示要附加到返回的文件名的文件扩展名

  • frag_index – 片段存档索引,仅与 .data 扩展名一起使用,必须是整数。

  • ctype_timestamp – 一个可选的内容类型时间戳,Timestamp 的实例

  • durable – 如果为 True,则在数据文件名中包含持久标记。

返回值:

一个文件名

引发:

DiskFileError – 如果 ext==’.data’ 并且关键字参数 frag_index 不是整数

parse_on_disk_filename(filename, policy)

返回从策略特定文件名中提取的时间戳和其他信息。对于 EC 策略,数据文件名包括一个片段索引和一个可能的持久标记,两者都必须被剥离才能检索时间戳。

参数:

filename – 包含扩展名的文件名

返回值:

一个字典,包含时间戳、frag_index、durable、ext 和

ctype_timestamp

  • timestamp 是一个 Timestamp

  • frag_index 是一个 int 或 None

  • ctype_timestamp 是一个 Timestamp 或 None,用于 .meta 文件,否则为 None

  • ext 是一个字符串,包括前导点的文件扩展名,或者如果文件名没有扩展名则为空字符串

  • durable 是一个布尔值,如果文件名是包含持久标记的数据文件则为 True

引发:

DiskFileError – 如果文件名中的任何部分都无法验证。

validate_fragment_index(frag_index, policy=None)

返回 frag_index 的 int 表示形式,或者如果 frag_index 不是整数则引发 DiskFileError。

参数:
  • frag_index – 片段存档索引

  • policy – 用于针对策略验证索引的存储策略

class swift.obj.diskfile.ECDiskFileReader(fp, data_file, obj_size, etag, disk_chunk_size, keep_cache_size, device_path, logger, quarantine_hook, use_splice, pipe_size, diskfile, keep_cache=False, cooperative_period=0, etag_validate_frac=1)
class swift.obj.diskfile.ECDiskFileWriter(name, datadir, size, bytes_per_sync, diskfile, next_part_power, extension='.data')
commit(timestamp)

通过重命名对象数据文件以包含持久标记来完成 put。我们这样做是为了 EC 策略,因为它需要两阶段 put 提交确认。

参数:

timestamp – 对象 put 时间戳,Timestamp 的一个实例

引发:

DiskFileError – 如果 diskfile frag_index 未设置(在初始化期间或调用 put() 时)

put(metadata)

此方法与 DiskFileWriter 方法的唯一区别在于将片段索引添加到元数据中。

参数:

metadata – 要与对象关联的元数据字典

swift.obj.diskfile.consolidate_hashes(partition_dir)

获取 hashes.pkl 和 hashes.invalid 中的内容,将它们组合起来,将结果写回 hashes.pkl,并清除 hashes.invalid。

参数:

partition_dir – 包含 hashes.pkl 和 hashes.invalid 的分区目录的绝对路径

返回值:

一个字典,后缀哈希(如果有),键 ‘valid’ 如果 hashes.pkl 损坏、无法读取或不存在则为 False

swift.obj.diskfile.extract_policy(obj_path)

根据对象目录的名称提取对象的策略。如果路径格式不正确,则返回 None。

设备相对路径是挂载点之后的所有内容;例如

/srv/node/d42/objects-5/30/179/

485dc017205a81df3af616d917c90179/1401811134.873649.data

将具有设备相对路径

objects-5/30/179/485dc017205a81df3af616d917c90179/1401811134.873649.data

参数:

obj_path – 对象的设备相对路径,或完整路径

返回值:

一个 BaseStoragePolicy 或 None

swift.obj.diskfile.get_async_dir(policy_or_index)

获取给定策略的异步目录。

参数:

policy_or_indexStoragePolicy 实例,或索引(字符串或整数);如果为 None,则假定为旧策略 Policy-0。

返回值:

async_pendingasync_pending-<N>,具体取决于情况

swift.obj.diskfile.get_data_dir(policy_or_index)

获取给定策略的数据目录。

参数:

policy_or_indexStoragePolicy 实例,或索引(字符串或整数);如果为 None,则假定为旧策略 Policy-0。

返回值:

objectsobjects-<N>,具体取决于情况

swift.obj.diskfile.get_part_path(dev_path, policy, partition)

给定设备路径、策略和分区,返回指向分区的完整路径

swift.obj.diskfile.get_tmp_dir(policy_or_index)

获取给定策略的临时目录。

参数:

policy_or_indexStoragePolicy 实例,或索引(字符串或整数);如果为 None,则假定为旧策略 Policy-0。

返回值:

tmptmp-<N>,具体取决于情况

swift.obj.diskfile.invalidate_hash(suffix_dir)

使分区哈希文件中的 suffix_dir 的哈希失效。

参数:

suffix_dir – 需要使哈希失效的后缀目录的绝对路径

swift.obj.diskfile.object_audit_location_generator(devices, datadir, mount_check=True, logger=None, device_dirs=None, auditor_type='ALL')

给定设备路径(例如“/srv/node”),为给定 datadir(策略)下存储的所有对象生成审计位置,如果未设置 device_dirs。如果设置了 device_dirs,则仅为 device_dirs 中的对象生成审计位置。审计位置仅知道哈希目录的路径,而不知道其中的 .data 文件(如果有)。这是为了避免对 hash_dir 进行双重 listdir;DiskFile 对象始终执行一次,因此我们不需要。

参数:
  • devices – 要审计的设备的父目录

  • datadir – 对象目录

  • mount_check – 标志,用于检查是否应在设备上执行挂载检查

  • logger – 一个日志记录器对象

  • device_dirs – 要遍历的设备下的目录列表

  • auditor_type – 要么 ALL 要么 ZBF

swift.obj.diskfile.quarantine_renamer(device_path, corrupted_file_path)

如果文件已损坏,将其移动到隔离区域以允许复制进行修复。

参数 device_path:

损坏文件所在的路径。

参数 corrupted_file_path:

要隔离的文件的路径。

返回值:

路径 (str) 文件移动到的目录

引发:

OSError – 重新引发来自 rename 的非 errno.EEXIST / errno.ENOTEMPTY 异常

swift.obj.diskfile.read_hashes(partition_dir)

读取现有的 hashes.pkl

返回值:

一个字典,后缀哈希(如果有),键 ‘valid’ 如果 hashes.pkl 损坏、无法读取或不存在则为 False

swift.obj.diskfile.read_metadata(fd, add_missing_checksum=False)

辅助函数,用于从对象数据文件中读取腌制的元数据。

此函数与 _read_file_metadata 的唯一区别在于,如果无法读取文件,此函数会引发 DiskFileNotExist

参数:
  • fd – 要加载元数据的的文件描述符或文件名

  • add_missing_checksum – 如果设置且缺少校验和,则添加它

返回值:

元数据字典

引发:
swift.obj.diskfile.relink_paths(target_path, new_target_path, ignore_missing=True)

target_path 中使用第二个路径 new_target_path 硬链接文件。如果需要,创建中间目录。

参数:
  • target_path – 当前绝对文件名

  • new_target_path – 硬链接的新绝对文件名

  • ignore_missing – 如果为 True,则如果由于 target_path 不存在而无法创建链接,则不会引发异常,否则将引发 OSError。

引发:

如果硬链接无法创建(除非预期的硬链接已存在,或者 target_path 不存在且 must_exist 为 False),则引发 OSError。

返回值:

如果通过调用此方法创建了链接,则为 True,否则为 False。

swift.obj.diskfile.write_hashes(partition_dir, hashes)

将哈希写入 hashes.pkl

更新后的键在写入之前会添加到哈希中。

swift.obj.diskfile.write_metadata(fd, metadata, xattr_size=65536)

辅助函数,用于写入对象的文件的腌制元数据。

参数:
  • fd – 要写入元数据的的文件描述符或文件名

  • metadata – 要写入的元数据