feat: COW always-on architecture + cloud storage clear() fix (v5.11.0)

Major architectural improvements and critical bug fixes:

## COW Always-On Architecture
- Removed cowEnabled flag from BaseStorage (COW cannot be disabled)
- Eliminated marker file system (checkClearMarker, createClearMarker)
- Simplified all code paths to assume COW is always enabled
- COW automatically re-initializes after clear() operations

## Critical Bug Fix: Cloud Storage clear()
- Fixed GCS clear() using correct paths (branches/ instead of entities/nouns/)
- Fixed S3Compatible clear() path structure
- Fixed R2 clear() implementation
- Fixed Azure, FileSystem, OPFS, Memory clear() COW flag handling
- clear() now deletes: branches/, _cow/, _system/
- Result: Cloud buckets can now be fully cleared (previously impossible)

## Container Memory Detection
- Auto-detect Docker/K8s/Cloud Run memory limits (cgroup v1/v2)
- Smart memory allocation (75% graph data, 25% query operations)
- Environment variable support (CLOUD_RUN_MEMORY, MEMORY_LIMIT)
- Production-grade containerized deployment support

## CommitLog streamHistory Feature
- Added streamable commit history with pagination
- Efficient memory usage for large commit histories
- Support for branch filtering and time ranges

## Comprehensive Storage Documentation
- Complete v5.11.0 file structure reference
- Detailed path construction algorithms
- 8 common storage scenarios with examples
- Type-first storage, sharding, COW architecture explained
- Public docs: docs/architecture/data-storage-architecture.md (1063 lines)

## Files Modified (14 files)
- All 8 storage adapters (GCS, S3, R2, Azure, FS, OPFS, Memory, Historical)
- BaseStorage core architecture
- CommitLog with streaming
- Brainy memory configuration
- Parameter validation with container detection
- Storage architecture documentation

## Breaking Changes
NONE - COW was already enabled by default. This removes the ability to disable it.

## Migration
No action required. Upgrade and clear() will work correctly on cloud storage.

## Impact
- Users can now clear cloud storage buckets completely
- No more corrupted buckets after clear() operations
- Container deployments automatically optimize memory allocation
- COW is mandatory and always enabled (safer, simpler)

v5.11.0 - Production ready
This commit is contained in:
David Snelling 2025-11-18 13:44:02 -08:00
parent 28160a3052
commit 3e8b9aacc8
17 changed files with 2925 additions and 1207 deletions

View file

@ -1023,19 +1023,11 @@ export class FileSystemStorage extends BaseStorage {
// Delete the entire _cow/ directory (not just contents)
await fs.promises.rm(cowDir, { recursive: true, force: true })
// CRITICAL: Reset COW state to prevent automatic reinitialization
// When COW data is cleared, we must also clear the COW managers
// Otherwise initializeCOW() will auto-recreate initial commit on next operation
// v5.11.0: Reset COW managers (but don't disable COW - it's always enabled)
// COW will re-initialize automatically on next use
this.refManager = undefined
this.blobStorage = undefined
this.commitLog = undefined
this.cowEnabled = false
// v5.10.4: Create persistent marker file (CRITICAL FIX)
// Bug: cowEnabled = false only affects current instance, not future instances
// Fix: Create marker file that persists across instance restarts
// When new instance calls initializeCOW(), it checks for this marker
await this.createClearMarker()
}
// Clear the statistics cache
@ -1080,42 +1072,10 @@ export class FileSystemStorage extends BaseStorage {
* @returns true if marker file exists, false otherwise
* @protected
*/
protected async checkClearMarker(): Promise<boolean> {
// Check if fs module is available
if (!fs || !fs.promises) {
return false
}
try {
const markerPath = path.join(this.systemDir, 'cow-disabled')
await fs.promises.access(markerPath, fs.constants.F_OK)
return true // Marker exists
} catch (error) {
return false // Marker doesn't exist (ENOENT) or can't be accessed
}
}
/**
* Create marker indicating COW has been explicitly disabled
* v5.10.4: Called by clear() to prevent COW reinitialization on new instances
* @protected
* v5.11.0: Removed checkClearMarker() and createClearMarker() methods
* COW is now always enabled - marker files are no longer used
*/
protected async createClearMarker(): Promise<void> {
// Check if fs module is available
if (!fs || !fs.promises) {
console.warn('FileSystemStorage.createClearMarker: fs module not available, skipping marker creation')
return
}
try {
const markerPath = path.join(this.systemDir, 'cow-disabled')
// Create empty marker file
await fs.promises.writeFile(markerPath, '', 'utf8')
} catch (error) {
console.error('FileSystemStorage.createClearMarker: Failed to create marker file', error)
// Don't throw - marker creation failure shouldn't break clear()
}
}
/**
* Get information about storage usage and capacity