LightRAG/lightrag/kg
chengjie 5d31412bd7 feat: add workspace isolation support to unified lock functions
Why this change is needed:
The current locking system uses global locks shared across all users
and workspaces, causing blocking issues in multi-tenant scenarios.
When one tenant performs document indexing, all other tenants are
blocked waiting for the same global lock. This severely limits
the system's ability to serve multiple users concurrently.

How it solves it:
- Add optional `workspace` parameter to 5 lock functions
- Implement lazy creation of workspace-specific locks with proper synchronization
- Store workspace locks in new `_sync_locks` dictionary
- Support both multi-process (RLock) and single-process (asyncio.Lock) modes
- Empty workspace parameter uses global lock for backward compatibility
- Extract common logic into `_get_workspace_lock()` to eliminate duplication

Impact:
- Enables concurrent operations across different workspaces
- Foundation for PR2 (pipeline status isolation)
- Zero impact on existing code (all parameters optional with defaults)
- Each workspace now has independent lock instances
- Thread-safe lazy creation using _registry_guard in multiprocess mode
- Automatic creation of async_locks for workspace locks in multiprocess mode

Code Quality Improvements (Linus review feedback):
- Fixed race condition: lazy creation protected by _registry_guard
- Eliminated code duplication: common logic extracted to _get_workspace_lock()
- Added async_lock support: workspace locks now have companion async_locks
- Handles None workspace parameter gracefully
- Clear separation of concerns: one function handles all workspace logic

Testing:
- 17 new test cases covering:
  - Basic functionality and naming
  - Workspace isolation and independence
  - Backward compatibility with empty workspace
  - Concurrent operations (3 workspaces in parallel)
  - Performance (1000 workspace lock creation <2s)
  - Edge cases (special characters, unicode, long names)
- All existing tests pass (21/21 excluding env issues)
- Verified lock serialization within workspace
- Verified lock independence across workspaces

Files modified:
- lightrag/kg/shared_storage.py: refactored lock functions + synchronization
- tests/test_workspace_locks.py: comprehensive test suite
2025-11-10 22:51:49 +08:00
..
deprecated Preserve ordering in get_by_ids methods across all storage implementations 2025-10-11 12:37:59 +08:00
__init__.py Improve storage config validation and add config.ini fallback support 2025-11-08 22:48:49 +08:00
faiss_impl.py Fix get_by_ids to return None for missing records consistently 2025-10-11 13:34:26 +08:00
json_doc_status_impl.py Add entity/relation chunk tracking with configurable source ID limits 2025-10-20 15:24:15 +08:00
json_kv_impl.py Add entity/relation chunk tracking with configurable source ID limits 2025-10-20 15:24:15 +08:00
memgraph_impl.py Remove unused chunk-based node/edge retrieval methods 2025-11-06 18:17:10 +08:00
milvus_impl.py Remove enable_logging parameter from get_data_init_lock call in MilvusVectorDBStorage 2025-10-29 09:49:59 +08:00
mongo_impl.py Remove unused chunk-based node/edge retrieval methods 2025-11-06 18:17:10 +08:00
nano_vector_db_impl.py Fix vector deletion logging to show actual deleted count 2025-10-27 14:22:16 +08:00
neo4j_impl.py Remove unused chunk-based node/edge retrieval methods 2025-11-06 18:17:10 +08:00
networkx_impl.py Remove unused chunk-based node/edge retrieval methods 2025-11-06 18:17:10 +08:00
postgres_impl.py Fix linting 2025-11-06 20:48:51 +08:00
qdrant_impl.py Add Qdrant legacy collection migration with workspace support 2025-10-30 19:16:33 +08:00
redis_impl.py Fix Redis data migration error 2025-10-21 16:27:04 +08:00
shared_storage.py feat: add workspace isolation support to unified lock functions 2025-11-10 22:51:49 +08:00