- 文档首页
对象存储
工具指南
tosfsspec
tosfsspec 故障处理
tosfsspec 故障处理
本文主要介绍一些在使用 tosfsspec 时可能遇到的常见问题及定位方法。
当您遇到问题时,可以开启 fsspec 和 tosfsspec 的调试日志来帮助定位问题。以下为一段可直接在代码中独立使用的示例:
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('fsspec').setLevel(logging.DEBUG)
logging.getLogger('tosfsspec').setLevel(logging.DEBUG)
这段代码会打印出详细的底层操作和网络请求信息,帮助您分析问题。
ValueError: The part_size must be >= 4194304
- 初始化 TosFileSystem 或调用 fs.open() 时出现 ValueError,提示part_size或block_size必须大于等于 4MB。
- TOS 对分片上传设置了最小分片大小限制。写入模式('wb'、'ab')下,block_size参数决定单个分片大小;若小于 4MB,将触发该错误。
- 写入模式使用 fs.open(..., mode='wb') 或 fs.open(..., mode='ab') 时,确保block_size 参数的值大于或等于 4 * 1024 * 1024。
- 初始化 TosFileSystem(part_size=...) 时,确保part_size参数的值大于或等于 4 * 1024 * 1024。
- 若不确定合适值,可不显式设置 block_size,由 tosfsspec 使用默认值 8MB。
权限错误 (例如TosException: status=403)
- 执行 ls, open, put 等操作时收到 tos.exceptions.TosException,状态码为 403 (Forbidden)。
- AK/SK 错误: 提供的 key (Access Key ID) 或 secret (Secret Access Key) 不正确或已失效。
- IAM 策略限制: 您使用的账号所附加的 IAM 策略没有执行相应操作的权限。例如仅有读取权限(tos:GetObject)但缺少写入权限(tos:PutObject)或列举权限(tos:ListObjects)。
- IP 白名单限制: Bucket 或账号设置了 IP 白名单,而您的访问来源 IP 不在允许范围内。
- 核对 AK/SK:确认无前后空格、处于启用状态、与使用账号匹配。
- 检查 IAM 策略:确认包含所需权限,常见权限包括读取 tos:GetObject、写入 tos:PutObject、列举 tos:ListObjects。
- 确认网络出口 IP:检查是否被 Bucket 的访问控制策略允许。
- 路径下面有文件,但您用 fs.isdir('tos://my-bucket/some/path/') 去判断时,返回 False。
- 目录里已经无内容,想用 fs.rmdir() 把目录删掉,但无法删除。
- TOS 的 FNS(扁平命名空间)Bucket 实际上没有真正的目录概念。目录是通过以 / 结尾的 0 字节对象来模拟的。
- isdir 检查的是是否存在一个名为 some/path/ 的对象。如果这个对象不存在(即使 some/path/file.txt 存在),isdir 也会返回 False。
- rmdir 只能删除代表目录的 0 字节对象,且要求该对象下没有任何其他对象(即 prefix 为该目录的对象不存在)。
- 使用 fs.makedirs(path, exist_ok=True)显式创建目录,确保目录对象被创建。
- 判断一个路径是否为目录,更可靠的方式是检查其名称是否以 / 结尾,或者通过 fs.info(path)['type'] == 'directory'。
- 删除非空目录,请使用 fs.rm(path, recursive=True)。
ValueError: The maxdepth is not supported for hns bucket
- 在 walk(), glob(), rm(recursive=True) 等递归操作中,对某个 Bucket 传入maxdepth 参数时,出现ValueError。
- maxdepth 参数用于限制递归遍历的深度,仅在 FNS (扁平命名空间) 类型的 Bucket 中受支持。HNS (层级命名空间) 类型的 Bucket 使用原生的目录结构,其底层遍历 API 不支持深度限制。
- 若为 HNS Bucket,移除maxdepth 参数。并自行在业务代码中处理深度限制,例如在 walk 的循环中加入计数器。
- 如果必须使用 maxdepth,请考虑将数据迁移到 FNS 类型的 Bucket 中。
- 访问一个您认为应该存在的路径时,返回 FileNotFoundError。
- 路径确实不存在:Bucket 名称或 Object Key 拼写错误。
- 权限不足:您缺少该对象的 tos:GetObject 或 tos:ListObjects 权限时,在某些情况下也可能表现为未找到。
- 目录标记缺失:对 fs.info() 而言,当路径是目录但不存在对应的目录标记对象(以 / 结尾的 0 字节对象)时,也可能返回 FileNotFoundError。
- 使用 fs.ls() 逐级列举父路径,确认路径各层级(Bucket、前缀、对象名)均正确。
- 针对目录场景,优先用 fs.ls(path) 检查内容,而不是仅依赖 fs.info(path)。
最近更新时间:2026.03.19 17:45:47