refactor(8.0): delete DataAPI — superseded by Db persist/restore + import API + stats
The legacy backup/import/export/stats facade (src/api/DataAPI.ts) drifted from the modern entity shape and every job it did now has a first-class surface. Delete it and brain.data(), and rewire the CLI: - data-stats → brain.stats() (full BrainyStats report: per-type breakdowns, indexed fields, index health, storage backend, writer lock, version) - clean → brain.clear() - export → alias of snapshot; a db.persist() snapshot is the full-fidelity export format (open with Brainy.load, load wholesale with brainy restore); external data ingestion remains brainy import (UniversalImportAPI) Rewiring clean onto brain.clear() exposed two real bugs, both fixed: - clear() left this.graphIndex undefined forever — any graph-touching call afterwards (relate, getNeighbors, stats) crashed. clear() now re-resolves the graph index exactly as init() does and re-wires the shared UUID↔int resolver, and re-resolves the metadata index with the same provider fallback as init(). - storage.clear() reset the legacy totals but not the per-type/subtype count rollups or id→type caches, so stats() reported phantom counts for deleted entities. Both adapters now delegate derived-state reset to reloadDerivedState(), the same path restore-from-snapshot uses. One-shot CLI commands (data-stats, clean, snapshot/export, restore, history, generation) now close the brain and exit explicitly — global cache timers otherwise keep the process alive holding the writer lock. Verified: build clean, 1383/1383 unit tests, 24/24 db-mvcc integration, plus an end-to-end CLI smoke (add → data-stats → export → clean → data-stats).
This commit is contained in:
parent
cc8037db10
commit
478fa176f2
12 changed files with 262 additions and 639 deletions
|
|
@ -1404,26 +1404,15 @@ export class FileSystemStorage extends BaseStorage {
|
|||
if (await this.directoryExists(casDir)) {
|
||||
// Delete the entire _cas/ directory (not just contents)
|
||||
await fs.promises.rm(casDir, { recursive: true, force: true })
|
||||
|
||||
// Drop the BlobStorage instance — its LRU cache holds deleted blobs.
|
||||
// initializeBlobStorage() re-creates it (brain.clear() does this before
|
||||
// the VFS is rebuilt).
|
||||
this.blobStorage = undefined
|
||||
}
|
||||
|
||||
// Clear the statistics cache
|
||||
this.statisticsCache = null
|
||||
this.statisticsModified = false
|
||||
|
||||
// Reset entity counters (inherited from BaseStorageAdapter)
|
||||
// These in-memory counters must be reset to 0 after clearing all data
|
||||
;(this as any).totalNounCount = 0
|
||||
;(this as any).totalVerbCount = 0
|
||||
|
||||
// Clear write-through cache (inherited from BaseStorage)
|
||||
// Without this, readCanonicalObject() would return stale cached data
|
||||
// after clear(), causing "ghost" entities to appear
|
||||
this.clearWriteCache()
|
||||
// Reset ALL shared derived state via the same path restore uses: the
|
||||
// write-through cache, id→type/subtype caches, per-type/subtype count
|
||||
// rollups, statistics cache, graph-index singleton, and the BlobStorage
|
||||
// instance (its LRU cache holds deleted blobs), then recount from the
|
||||
// now-empty data area. Without the rollup reset, stats() would keep
|
||||
// reporting per-type counts for deleted entities.
|
||||
await this.reloadDerivedState()
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -353,24 +353,14 @@ export class MemoryStorage extends BaseStorage {
|
|||
this.blobStore.clear()
|
||||
this.txLogLines = []
|
||||
this.statistics = null
|
||||
this.totalNounCount = 0
|
||||
this.totalVerbCount = 0
|
||||
this.entityCounts.clear()
|
||||
this.verbCounts.clear()
|
||||
|
||||
// Clear the statistics cache
|
||||
this.statisticsCache = null
|
||||
this.statisticsModified = false
|
||||
|
||||
// Drop the BlobStorage instance — its LRU cache holds deleted blobs.
|
||||
// initializeBlobStorage() re-creates it (brain.clear() does this before
|
||||
// the VFS is rebuilt).
|
||||
this.blobStorage = undefined
|
||||
|
||||
// Clear write-through cache (inherited from BaseStorage)
|
||||
// Without this, readCanonicalObject() would return stale cached data
|
||||
// after clear(), causing "ghost" entities to appear
|
||||
this.clearWriteCache()
|
||||
// Reset ALL shared derived state via the same path restore uses: the
|
||||
// write-through cache, id→type/subtype caches, per-type/subtype count
|
||||
// rollups, statistics cache, graph-index singleton, and the BlobStorage
|
||||
// instance (its LRU cache holds deleted blobs), then recount from the
|
||||
// now-empty object store. Without the rollup reset, stats() would keep
|
||||
// reporting per-type counts for deleted entities.
|
||||
await this.reloadDerivedState()
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue