Add async generator lock management rule to cline extension
This commit is contained in:
parent
5be04263b2
commit
b72632e4d4
1 changed files with 25 additions and 0 deletions
|
|
@ -47,6 +47,31 @@ else np.frombuffer(base64.b64decode(dp.embedding), dtype=np.float32)
|
||||||
**Location**: Neo4j storage finalization
|
**Location**: Neo4j storage finalization
|
||||||
**Impact**: Prevents application shutdown failures
|
**Impact**: Prevents application shutdown failures
|
||||||
|
|
||||||
|
### 6. Async Generator Lock Management (CRITICAL)
|
||||||
|
**Pattern**: Never hold locks across async generator yields - create snapshots instead
|
||||||
|
**Issue**: Holding locks while yielding causes deadlock when consumers need the same lock
|
||||||
|
**Location**: `lightrag/tools/migrate_llm_cache.py` - `stream_default_caches_json`
|
||||||
|
**Solution**: Create snapshot of data while holding lock, release lock, then iterate over snapshot
|
||||||
|
```python
|
||||||
|
# WRONG - Deadlock prone:
|
||||||
|
async with storage._storage_lock:
|
||||||
|
for key, value in storage._data.items():
|
||||||
|
batch[key] = value
|
||||||
|
if len(batch) >= batch_size:
|
||||||
|
yield batch # Lock still held!
|
||||||
|
|
||||||
|
# CORRECT - Snapshot approach:
|
||||||
|
async with storage._storage_lock:
|
||||||
|
matching_items = [(k, v) for k, v in storage._data.items() if condition]
|
||||||
|
# Lock released here
|
||||||
|
for key, value in matching_items:
|
||||||
|
batch[key] = value
|
||||||
|
if len(batch) >= batch_size:
|
||||||
|
yield batch # No lock held
|
||||||
|
```
|
||||||
|
**Impact**: Prevents deadlocks in Json→Json migrations and similar scenarios where source/target share locks
|
||||||
|
**Applicable To**: Any async generator that needs to access shared resources while yielding
|
||||||
|
|
||||||
## Architecture Patterns
|
## Architecture Patterns
|
||||||
|
|
||||||
### 1. Dependency Injection
|
### 1. Dependency Injection
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue