DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Qdrant 本地目录报 already accessed,删 .lock 后为什么还失败

本地客户端对持久化目录使用排他锁。核对实例和关闭生命周期,用独立测试目录验证 close 后重开;多进程共享需求应通过 Qdrant server 实现。

使用 QdrantClient(path=...) 打开本地持久化目录时,收到:

already accessed by another instance of Qdrant client

官方 issue #1018中,报告者删除 .lock 后仍遇到错误。维护者要求先显式关闭客户端。这个建议不能替你证明现场只剩一个进程;Notebook、Web worker 和长期缓存对象也可能持有相同目录。

qdrant-client 1.14.2 的本地实现会申请排他文件锁,关闭时释放。锁文件存在本身不等于还有活跃锁,删除路径也不等于原实例已正确释放资源。原 issue 没有给出确定版本,下方代码独立按 1.14.2 接口核对。

先找谁拥有这个目录

核对传入 path 的绝对位置、启动的 worker 数及客户端创建次数。相对路径在不同工作目录下可能指向不同数据;两个变量名也可能仍指向同一个实例。

一个进程里有多个组件需要访问同一目录时,让应用生命周期持有一份客户端,并在这些组件间复用。不要在每次请求中创建新的本地客户端,也不要在应用关闭后继续缓存使用旧对象。

需要确认当前代码能正常释放锁,可以用一个专门的临时目录:

from tempfile import TemporaryDirectory
from qdrant_client import QdrantClient

with TemporaryDirectory(prefix="qdrant-lock-check-") as directory:
    first = QdrantClient(path=directory)
    try:
        first.get_collections()
    finally:
        first.close()

    second = QdrantClient(path=directory)
    try:
        second.get_collections()
    finally:
        second.close()

这只验证创建、关闭、再次打开,退出后会删除专用临时目录。它不打开生产库、不创建业务点,也不能证明多进程并发写入安全。

第二次仍失败,检查真实生命周期

异步服务应在其生命周期退出时释放拥有的资源;Notebook 重新执行单元格前处理旧客户端。进程异常退出、取消或隐藏的对象引用,都需要结合实际日志和进程情况判断,不能简单归结为一个残留文件。

不要用关闭线程检查、禁用锁或删除活动 .lock 来消除症状。原实例可能仍在访问数据,绕过保护会把排障变成并发存储问题。

多进程需求,改用服务接口

若多个 worker 必须访问同一份数据,采用 Qdrant server,由客户端通过服务接口访问;本地 path 模式不是一份可供多个进程共享的数据库服务。迁移前备份原数据,按官方部署与导入方法准备测试服务,保留认证、TLS 和网络边界。

验收不只检查新客户端能构造:本地模式需确认唯一拥有者关闭后,新进程能打开原测试数据;服务模式需验证不同客户端在同一测试 collection 的读写结果。不要因本地锁错误消失就声称原生产数据已经迁移完整。