brainy/docs/guides
David Snelling 0bcf50a442 fix: resolve HNSW concurrency race condition across all storage adapters
Fixes critical P0 bug causing data corruption during bulk imports with 50+ concurrent operations. The non-atomic read-modify-write pattern in saveHNSWData() combined with fire-and-forget neighbor updates was causing 16-32 concurrent writes per entity, resulting in lost HNSW connections and corrupted graph structure.

**Root Cause:**
- saveHNSWData() used non-atomic read-modify-write
- HNSW neighbor updates fired without await (16-32 concurrent writes/entity)
- Popular nodes became hotspots (100 concurrent imports = 3,400 concurrent saveHNSWData calls)
- Result: Lost neighbor connections, 0 search results

**Atomic Write Strategies by Adapter:**

FileSystemStorage:
- Atomic rename with temp files
- Write to {file}.tmp.{timestamp}.{random}
- POSIX-guaranteed atomic rename(temp, final)

GCSStorage:
- Optimistic locking with generation numbers
- preconditionOpts: { ifGenerationMatch }
- 5 retries with exponential backoff (50ms→800ms)

S3/R2/AzureStorage:
- ETag-based optimistic locking
- IfMatch/conditions preconditions
- 5 retries with exponential backoff

MemoryStorage + OPFSStorage:
- Mutex locks per entity path
- Serializes async operations even in single-threaded environments

HNSW Index:
- Changed fire-and-forget .catch() to await
- Serializes 16-32 neighbor updates per entity
- Trade-off: 20-30% slower bulk import vs 100% data integrity

**Sharding Compatibility:**
-  Works with deterministic UUID sharding (256 shards, always on)
-  Works with distributed multi-node sharding (optional)
-  All atomic strategies work in both single-node and distributed deployments

**Index Impact:**
- Only HNSW index modified (saveHNSWData, saveHNSWSystem)
- Other 4 indexes unaffected (Metadata, Graph Adjacency, Deleted Items, Entity ID Mapper)
- No regression risk - isolated code paths

**Testing:**
- 8/8 unit tests passing (real concurrent operations, no mocks)
- Tests verify data integrity after 20 concurrent updates
- Tests verify temp file cleanup and mutex serialization

**Files Modified:**
- All 8 storage adapters (FileSystem, GCS, S3, R2, Azure, Memory, OPFS)
- HNSW Index (neighbor update serialization)
- New test: tests/unit/storage/hnswConcurrency.test.ts (8 passing tests)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 15:24:20 -07:00
..
distributed-system.md docs: update documentation for accurate v3.9.0 API examples and technical claims 2025-09-22 16:19:27 -07:00
enterprise-for-everyone.md fix: update all imports and references from BrainyData to Brainy 2025-09-30 17:09:15 -07:00
framework-integration.md feat: enhance framework integration and simplify codebase 2025-09-15 14:54:13 -07:00
getting-started.md feat: implement always-adaptive caching with getCacheStats monitoring 2025-10-10 14:09:30 -07:00
import-anything.md feat: implement progressive flush intervals for streaming imports 2025-10-22 17:36:27 -07:00
import-flow.md feat: implement progressive flush intervals for streaming imports 2025-10-22 17:36:27 -07:00
import-progress-examples.md feat: comprehensive import progress tracking for all 7 formats 2025-10-24 14:45:46 -07:00
import-progress-implementation.md feat: comprehensive import progress tracking for all 7 formats 2025-10-24 14:45:46 -07:00
import-quick-reference.md fix: resolve HNSW concurrency race condition across all storage adapters 2025-10-29 15:24:20 -07:00
migrating-to-v4.md feat: add import API validation and v4.x migration guide 2025-10-21 15:25:12 -07:00
migration-3.36.0.md feat: implement always-adaptive caching with getCacheStats monitoring 2025-10-10 14:09:30 -07:00
model-loading.md fix: update all imports and references from BrainyData to Brainy 2025-09-30 17:09:15 -07:00
natural-language.md fix: update all imports and references from BrainyData to Brainy 2025-09-30 17:09:15 -07:00
neural-api.md fix: update all imports and references from BrainyData to Brainy 2025-09-30 17:09:15 -07:00
nextjs-integration.md feat: enhance framework integration and simplify codebase 2025-09-15 14:54:13 -07:00
standard-import-progress.md feat: comprehensive import progress tracking for all 7 formats 2025-10-24 14:45:46 -07:00
streaming-imports.md feat: implement progressive flush intervals for streaming imports 2025-10-22 17:36:27 -07:00
vue-integration.md feat: enhance framework integration and simplify codebase 2025-09-15 14:54:13 -07:00