@push.rocks/smartdb 5.2.1 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_amd64.tsrust-build.json +4 -4
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_rust/rustdb_linux_arm64.tsrust-build.json +4 -4
- package/dist_rust/rustdb_macos_amd64 +0 -0
- package/dist_rust/rustdb_macos_amd64.tsrust-build.json +4 -4
- package/dist_rust/rustdb_macos_arm64 +0 -0
- package/dist_rust/rustdb_macos_arm64.tsrust-build.json +4 -4
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/ts_migration/migrators/v0_to_v1.js +5 -40
- package/package.json +1 -1
- package/readme.hints.md +8 -0
- package/readme.md +30 -8
- package/readme.plan.md +14 -2
- package/third-party-notices.md +32 -6
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/ts_migration/migrators/v0_to_v1.ts +1 -54
|
Binary file
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "5540a957900ae9ffb3c4ac119e61b508126143e6db827208f8d4555180569a72",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdb",
|
|
6
|
-
"projectVersion": "5.2.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "5.2.3",
|
|
7
|
+
"gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-08-
|
|
9
|
+
"builtAt": "2026-08-22T22:52:46.361Z",
|
|
10
10
|
"tsrustVersion": "1.10.0",
|
|
11
11
|
"binary": "rustdb",
|
|
12
12
|
"target": "linux_amd64"
|
|
Binary file
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "81eccfcdbbb51956608e04a3dbac5a13278ea45ad73b756083d614693120b6ba",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdb",
|
|
6
|
-
"projectVersion": "5.2.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "5.2.3",
|
|
7
|
+
"gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-08-
|
|
9
|
+
"builtAt": "2026-08-22T22:53:24.138Z",
|
|
10
10
|
"tsrustVersion": "1.10.0",
|
|
11
11
|
"binary": "rustdb",
|
|
12
12
|
"target": "linux_arm64"
|
|
Binary file
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "ada67fe412512c8f3a1654f161278a86f4734d07fc45a1229f37d5e90d27de03",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdb",
|
|
6
|
-
"projectVersion": "5.2.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "5.2.3",
|
|
7
|
+
"gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-08-
|
|
9
|
+
"builtAt": "2026-08-22T22:54:32.399Z",
|
|
10
10
|
"tsrustVersion": "1.10.0",
|
|
11
11
|
"binary": "rustdb",
|
|
12
12
|
"target": "macos_amd64"
|
|
Binary file
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "0b953034b6a3c24ed9bbb0c5e6d3500be88b76c3c6bca8765549edddb81ebdd1",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdb",
|
|
6
|
-
"projectVersion": "5.2.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "5.2.3",
|
|
7
|
+
"gitCommit": "b09765bbcdf06fe4be46005a63c22be532d7bfa2",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-08-
|
|
9
|
+
"builtAt": "2026-08-22T22:55:12.046Z",
|
|
10
10
|
"tsrustVersion": "1.10.0",
|
|
11
11
|
"binary": "rustdb",
|
|
12
12
|
"target": "macos_arm64"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartdb',
|
|
6
|
-
version: '5.2.
|
|
6
|
+
version: '5.2.3',
|
|
7
7
|
description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFIQUFxSDtDQUNuSSxDQUFBIn0=
|
|
@@ -11,7 +11,6 @@ const FILE_MAGIC = Buffer.from('SMARTDB\0', 'ascii');
|
|
|
11
11
|
const FORMAT_VERSION = 1;
|
|
12
12
|
/** File type tags */
|
|
13
13
|
const FILE_TYPE_DATA = 1;
|
|
14
|
-
const FILE_TYPE_HINT = 3;
|
|
15
14
|
/** File header total size */
|
|
16
15
|
const FILE_HEADER_SIZE = 64;
|
|
17
16
|
/** Per-record magic */
|
|
@@ -54,23 +53,6 @@ function encodeDataRecord(timestamp, key, value) {
|
|
|
54
53
|
buf.writeUInt32LE(crc, 18);
|
|
55
54
|
return buf;
|
|
56
55
|
}
|
|
57
|
-
function encodeHintEntry(key, offset, recordLen, valueLen, timestamp) {
|
|
58
|
-
const keyBuf = Buffer.from(key, 'utf-8');
|
|
59
|
-
const buf = Buffer.alloc(4 + keyBuf.length + 8 + 4 + 4 + 8);
|
|
60
|
-
let pos = 0;
|
|
61
|
-
buf.writeUInt32LE(keyBuf.length, pos);
|
|
62
|
-
pos += 4;
|
|
63
|
-
keyBuf.copy(buf, pos);
|
|
64
|
-
pos += keyBuf.length;
|
|
65
|
-
buf.writeBigUInt64LE(offset, pos);
|
|
66
|
-
pos += 8;
|
|
67
|
-
buf.writeUInt32LE(recordLen, pos);
|
|
68
|
-
pos += 4;
|
|
69
|
-
buf.writeUInt32LE(valueLen, pos);
|
|
70
|
-
pos += 4;
|
|
71
|
-
buf.writeBigUInt64LE(timestamp, pos);
|
|
72
|
-
return buf;
|
|
73
|
-
}
|
|
74
56
|
// ---------------------------------------------------------------------------
|
|
75
57
|
// CRC32 (matching crc32fast in Rust)
|
|
76
58
|
// ---------------------------------------------------------------------------
|
|
@@ -167,7 +149,7 @@ const syncFile = async (filePathArg, signalArg) => {
|
|
|
167
149
|
}, signalArg);
|
|
168
150
|
};
|
|
169
151
|
const assertPublishedMigrationComplete = async (collectionDirectoryArg) => {
|
|
170
|
-
for (const fileName of ['data.rdb', '
|
|
152
|
+
for (const fileName of ['data.rdb', 'indexes.json']) {
|
|
171
153
|
let fileStat;
|
|
172
154
|
try {
|
|
173
155
|
fileStat = await fs.lstat(path.join(collectionDirectoryArg, fileName));
|
|
@@ -183,6 +165,9 @@ const assertPublishedMigrationComplete = async (collectionDirectoryArg) => {
|
|
|
183
165
|
}
|
|
184
166
|
}
|
|
185
167
|
};
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// Migration: v0 (JSON) → v1 (Bitcask binary)
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
186
171
|
/**
|
|
187
172
|
* Migrate a storage directory from v0 (JSON-per-collection) to v1 (Bitcask binary).
|
|
188
173
|
*
|
|
@@ -247,8 +232,6 @@ export async function migrateV0ToV1(storagePath, signalArg) {
|
|
|
247
232
|
// File header
|
|
248
233
|
const headerBuf = writeFileHeader(FILE_TYPE_DATA);
|
|
249
234
|
await writeBuffer(dataFileHandle, headerBuf, signalArg);
|
|
250
|
-
let currentOffset = BigInt(FILE_HEADER_SIZE);
|
|
251
|
-
const keydir = new Map();
|
|
252
235
|
const ts = BigInt(Date.now());
|
|
253
236
|
for (const doc of docs) {
|
|
254
237
|
signalArg?.throwIfAborted();
|
|
@@ -274,27 +257,9 @@ export async function migrateV0ToV1(storagePath, signalArg) {
|
|
|
274
257
|
const valueBuf = Buffer.from(bsonBytes);
|
|
275
258
|
const record = encodeDataRecord(ts, keyBuf, valueBuf);
|
|
276
259
|
await writeBuffer(dataFileHandle, record, signalArg);
|
|
277
|
-
keydir.set(idHex, {
|
|
278
|
-
offset: currentOffset,
|
|
279
|
-
recordLen: record.length,
|
|
280
|
-
valueLen: valueBuf.length,
|
|
281
|
-
timestamp: ts,
|
|
282
|
-
});
|
|
283
|
-
currentOffset += BigInt(record.length);
|
|
284
260
|
}
|
|
285
261
|
await dataFileHandle.sync();
|
|
286
262
|
signalArg?.throwIfAborted();
|
|
287
|
-
// Write keydir.hint
|
|
288
|
-
const hintPath = path.join(stagingDir, 'keydir.hint');
|
|
289
|
-
await withFileHandle(hintPath, 'wx', async (hintFileHandle) => {
|
|
290
|
-
await writeBuffer(hintFileHandle, writeFileHeader(FILE_TYPE_HINT), signalArg);
|
|
291
|
-
for (const [key, entry] of keydir) {
|
|
292
|
-
signalArg?.throwIfAborted();
|
|
293
|
-
await writeBuffer(hintFileHandle, encodeHintEntry(key, entry.offset, entry.recordLen, entry.valueLen, entry.timestamp), signalArg);
|
|
294
|
-
}
|
|
295
|
-
await hintFileHandle.sync();
|
|
296
|
-
signalArg?.throwIfAborted();
|
|
297
|
-
}, signalArg);
|
|
298
263
|
}, signalArg);
|
|
299
264
|
// Copy indexes.json if it exists
|
|
300
265
|
if (await pathExists(indexJsonPath)) {
|
|
@@ -341,4 +306,4 @@ export async function migrateV0ToV1(storagePath, signalArg) {
|
|
|
341
306
|
}
|
|
342
307
|
return deletableFiles;
|
|
343
308
|
}
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjBfdG9fdjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19taWdyYXRpb24vbWlncmF0b3JzL3YwX3RvX3YxLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qiw4RUFBOEU7QUFDOUUsdURBQXVEO0FBQ3ZELDhFQUE4RTtBQUU5RSxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsNkJBQTZCO0FBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixxQkFBcUI7QUFDckIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6Qiw2QkFBNkI7QUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsdUJBQXVCO0FBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUM1Qiw2QkFBNkI7QUFDN0IsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7QUFFbkQsOEVBQThFO0FBQzlFLDBCQUEwQjtBQUMxQiw4RUFBOEU7QUFFOUUsU0FBUyxlQUFlLENBQUMsUUFBZ0I7SUFDdkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixHQUFHLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMs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
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjBfdG9fdjEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c19taWdyYXRpb24vbWlncmF0b3JzL3YwX3RvX3YxLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qiw4RUFBOEU7QUFDOUUsdURBQXVEO0FBQ3ZELDhFQUE4RTtBQUU5RSxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsNkJBQTZCO0FBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixxQkFBcUI7QUFDckIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLDZCQUE2QjtBQUM3QixNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUM1Qix1QkFBdUI7QUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBQzVCLDZCQUE2QjtBQUM3QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtBQUVuRCw4RUFBOEU7QUFDOUUsMEJBQTBCO0FBQzFCLDhFQUE4RTtBQUU5RSxTQUFTLGVBQWUsQ0FBQyxRQUFnQjtJQUN2QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLEdBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxVQUFVLENBQUMs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
|
package/package.json
CHANGED
package/readme.hints.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# smartdb hints
|
|
2
2
|
|
|
3
|
+
## Authoritative File Recovery
|
|
4
|
+
|
|
5
|
+
- `data.rdb` is the sole runtime source for rebuilding KeyDir. The v1 `keydir.hint` format cannot prove completeness or data-generation identity, so existing regular hint files are tolerated for compatibility and diagnostics but their contents are never loaded as runtime state. New shutdowns, compactions, and v0-to-v1 migrations do not publish hints.
|
|
6
|
+
- `KeyDir::build_from_data_file()` streams every payload through CRC32 in fixed-size chunks before allocating its key and never allocates the declared value length. It may classify only a final prefix shorter than `RECORD_HEADER_SIZE` with matching record-magic bytes as an incomplete tail. A full header with a short payload and every checksum, magic, length, or UTF-8 key failure are corruption and must leave `data.rdb` unchanged.
|
|
7
|
+
- Compaction durably removes any legacy hint and syncs the collection directory before replacing `data.rdb`. This ordering forces SmartDB 5.2.1 and earlier to rebuild after downgrade even when the compacted file happens to have the hint's old recorded size.
|
|
8
|
+
- Startup maintenance may skip a publication-held database. Its first later storage access still performs the authoritative scan and fails unchanged on corruption; never infer validation of held data from listener startup alone.
|
|
9
|
+
- Every cancellation-unsafe maintenance, fencing, auth, or storage worker must own a clone of the retained storage-root capability through its final file/lock cleanup. Provider installation is a finite joined startup sweep; periodic maintenance starts only after listener setup has no remaining fallible step. `close()` joins maintenance, `RustDb::drop()` requests cooperative shutdown, and Unix socket cleanup is bound to the exact device/inode created by `bind()`.
|
|
10
|
+
|
|
3
11
|
## Stopped Storage-Root Relocation
|
|
4
12
|
|
|
5
13
|
- `LocalSmartDb.relocateStoppedStorageRoot()` is the only supported path-changing operation. It uses a dedicated serialized mutating sidecar runner; do not route it through the disposable offline-inspection helper. A bridge whose termination is unconfirmed remains in the static cleanup gate, and no later relocation may spawn until cleanup succeeds.
|
package/readme.md
CHANGED
|
@@ -398,7 +398,7 @@ const released = await server.commitDatabasePublication({
|
|
|
398
398
|
});
|
|
399
399
|
```
|
|
400
400
|
|
|
401
|
-
The held barrier survives restart and blocks wire commands, transactions, startup recovery, compaction, index restoration
|
|
401
|
+
The held barrier survives restart and blocks wire commands, transactions, startup recovery, compaction, and index restoration for that database while unrelated databases remain available. Commit is exact and idempotent. A successful commit removes the raw capability from durable state and retains only protected verification material. Provider/root identity, durable fenced-mode markers, and bounded startup validation make copied, missing, corrupt, or legacy-active publication state fail closed. A higher fencing token compacts resolved older receipts, so long-lived coordinators do not exhaust receipt capacity.
|
|
402
402
|
|
|
403
403
|
Durable database publication holds and allocation fencing remain Linux-only. The macOS support described under stopped storage-root relocation does not enable these runtime mutation features.
|
|
404
404
|
|
|
@@ -682,7 +682,7 @@ const namespaces = await LocalSmartDb.inspectOfflinePhysicalNamespaces({
|
|
|
682
682
|
|
|
683
683
|
The result is exactly `{ schemaVersion: 1, databases: Array<{ name, collections }> }`. Databases and each database's collections are sorted by physical name, empty database directories are retained, and no documents, index definitions, record identifiers, or values cross the management boundary.
|
|
684
684
|
|
|
685
|
-
The accepted root must contain the current `.__rustdb_internal/storage-owner.lock`; legacy roots without that lock are rejected. The sidecar takes the shared owner lock, so an active engine causes the call to fail. Every reported collection must have the canonical complete profile of regular `data.rdb`, `wal.rdb`, and `indexes.json` files. A regular `keydir.hint` is optional and is treated only as an allowed cache file. Missing canonical files, unexpected collection entries, malformed index metadata, invalid data or WAL records, symlinks, cross-filesystem traversal, resource-limit exhaustion, and changes observed during inspection fail the complete operation. No partial result is returned and the storage tree is not mutated.
|
|
685
|
+
The accepted root must contain the current `.__rustdb_internal/storage-owner.lock`; legacy roots without that lock are rejected. The sidecar takes the shared owner lock, so an active engine causes the call to fail. Every reported collection must have the canonical complete profile of regular `data.rdb`, `wal.rdb`, and `indexes.json` files. A regular `keydir.hint` is optional and is treated only as an allowed legacy cache file; runtime recovery ignores its contents. Missing canonical files, unexpected collection entries, malformed index metadata, invalid data or WAL records, symlinks, cross-filesystem traversal, resource-limit exhaustion, and changes observed during inspection fail the complete operation. No partial result is returned and the storage tree is not mutated.
|
|
686
686
|
|
|
687
687
|
Inspection performs two full bounded passes and returns only if their namespace results and retained filesystem observations agree. The entry, database, collection, index, file-byte, and record limits are enforced independently on each pass, so total validation work is at most twice the corresponding caller cap. The result-size cap applies to the single serialized result. This is a contract for the current owner-locked canonical SmartDB file-storage profile, not a claim of compatibility with arbitrary MongoDB layouts, legacy SmartDB roots, or unspecified future storage formats.
|
|
688
688
|
|
|
@@ -967,6 +967,28 @@ const names = await collection.distinct('name');
|
|
|
967
967
|
|
|
968
968
|
Advertises MongoDB wire protocol versions 0–21. The documented command surface is tested with the official `mongodb` Node.js driver version 7.5.x.
|
|
969
969
|
|
|
970
|
+
OP_MSG parsing rejects unknown required flags, invalid CRC-32C checksums,
|
|
971
|
+
duplicate BSON keys, noncanonical array indexes, malformed section boundaries,
|
|
972
|
+
multiple body sections, duplicate or colliding document-sequence identifiers,
|
|
973
|
+
and missing or non-string `$db` fields. Unknown optional flags are ignored. A
|
|
974
|
+
message is limited to 48,000,000 bytes, each BSON document to 16,777,216 bytes,
|
|
975
|
+
and BSON nesting to 100 levels. One message may contain at most 128 sections,
|
|
976
|
+
10,000 document-sequence documents, 100,000 BSON elements, and 100,000 BSON
|
|
977
|
+
document or array containers. The advertised `maxWriteBatchSize` is therefore
|
|
978
|
+
10,000.
|
|
979
|
+
|
|
980
|
+
The `moreToCome` request flag is accepted only for the exact `endSessions` or
|
|
981
|
+
`killSessions` cleanup envelope: an `admin` command body containing only the
|
|
982
|
+
session array, `writeConcern: { w: 0 }`, and `$db: "admin"`, with no document
|
|
983
|
+
sequence. It executes without a transport response and leaves the connection
|
|
984
|
+
reusable. Every other `moreToCome` envelope closes before command routing or
|
|
985
|
+
response-owned resource creation.
|
|
986
|
+
|
|
987
|
+
Raw receive buffers and parsed requests are charged separately against a
|
|
988
|
+
process-wide 256 MiB encoded-byte admission budget. Large unread pipelines remain
|
|
989
|
+
charged and are compacted only at geometric utilization thresholds; the budget is
|
|
990
|
+
an encoded-input bound rather than a claim about exact allocator heap usage.
|
|
991
|
+
|
|
970
992
|
### Read and Write Concerns
|
|
971
993
|
|
|
972
994
|
SmartDB 5.x does not implement MongoDB `readConcern` or `writeConcern`
|
|
@@ -1040,8 +1062,8 @@ The Bitcask-style file storage engine includes several reliability features:
|
|
|
1040
1062
|
- **Write-ahead log (WAL)** — every write is logged before being applied, with crash recovery on restart; once committed entries grow past 16 MiB the WAL is checkpointed and truncated at runtime, so `wal.rdb` does not grow unbounded
|
|
1041
1063
|
- **CRC32 checksums** — every record is integrity-checked on read
|
|
1042
1064
|
- **Automatic compaction** — dead records are reclaimed when they exceed 50% of file size, runs on startup and after every write
|
|
1043
|
-
- **
|
|
1044
|
-
- **
|
|
1065
|
+
- **Authoritative streamed recovery** — collection initialization rebuilds KeyDir from the complete `data.rdb` record stream, verifies each CRC without allocating the declared value size, and never trusts legacy hint files as runtime state; publication-held databases defer this work until first access after release
|
|
1066
|
+
- **Conservative torn-header repair** — collection initialization truncates only a final sequence shorter than the fixed record header whose available record-magic bytes match; checksum, magic, length, UTF-8 key, and full-header short-payload failures stop initialization without changing `data.rdb`
|
|
1045
1067
|
- **Stale socket cleanup** — orphaned `/tmp/smartdb-*.sock` files from crashed instances are automatically cleaned up on startup
|
|
1046
1068
|
|
|
1047
1069
|
### Data Integrity CLI 🔍
|
|
@@ -1058,14 +1080,14 @@ The Rust binary includes an offline integrity checker:
|
|
|
1058
1080
|
# Database: mydb
|
|
1059
1081
|
# Collection: users
|
|
1060
1082
|
# Header: OK
|
|
1061
|
-
# Records:
|
|
1062
|
-
# Data size:
|
|
1083
|
+
# Records: 1234 (1200 live, 34 tombstones)
|
|
1084
|
+
# Data size: 2097152 bytes
|
|
1063
1085
|
# Duplicates: 0
|
|
1064
1086
|
# CRC errors: 0
|
|
1065
|
-
# Hint file:
|
|
1087
|
+
# Hint file: legacy cache (ignored)
|
|
1066
1088
|
```
|
|
1067
1089
|
|
|
1068
|
-
Checks file headers, record CRC32 checksums, duplicate `_id` entries
|
|
1090
|
+
Checks file headers, record CRC32 checksums, and duplicate `_id` entries. Existing hint files are reported as ignored legacy caches and do not determine data integrity. Exit code 1 if any authoritative-data errors are found.
|
|
1069
1091
|
|
|
1070
1092
|
---
|
|
1071
1093
|
|
package/readme.plan.md
CHANGED
|
@@ -3,11 +3,22 @@
|
|
|
3
3
|
Status: canonical direction, approved 2026-08-17. Reread before starting engine or
|
|
4
4
|
managed-service work.
|
|
5
5
|
|
|
6
|
-
Baseline: `@push.rocks/smartdb` 5.
|
|
6
|
+
Baseline: `@push.rocks/smartdb` 5.2.2. SmartDB is a Rust database engine with a
|
|
7
7
|
TypeScript lifecycle facade, a MongoDB wire-protocol command surface, file and
|
|
8
8
|
memory storage, authentication, transactions, resource fencing, and official
|
|
9
9
|
MongoDB Node.js driver integration.
|
|
10
10
|
|
|
11
|
+
Current execution status:
|
|
12
|
+
|
|
13
|
+
- the legal and provenance gate passed on 2026-08-22
|
|
14
|
+
- Phase 0 and the Phase 1 gate have not passed
|
|
15
|
+
- 5.x maintenance now treats `data.rdb` as authoritative, ignores unverifiable
|
|
16
|
+
legacy hint contents, streams CRC validation, and repairs only an incomplete
|
|
17
|
+
final record-header prefix
|
|
18
|
+
- strict runtime WAL recovery, ambiguous point-write reconciliation, crash-safe
|
|
19
|
+
ordinary DDL, debug-server security, and general crash/soak qualification remain
|
|
20
|
+
separate required slices
|
|
21
|
+
|
|
11
22
|
## Product objective
|
|
12
23
|
|
|
13
24
|
Build SmartDB into a commercially operated, MongoDB-driver-compatible managed
|
|
@@ -120,7 +131,8 @@ and reproducible baseline measurements.
|
|
|
120
131
|
|
|
121
132
|
- stop over-advertising MongoDB version, wire behavior, and batch limits
|
|
122
133
|
- reject ignored concerns, options, commands, and successful administrative stubs
|
|
123
|
-
- validate OP_MSG required flags,
|
|
134
|
+
- completed slice (2026-08-22): validate OP_MSG required flags, CRC-32C
|
|
135
|
+
checksums, bounded framing, and exact no-response admission and execution
|
|
124
136
|
- preserve complete BSON type and value identity for document and index keys
|
|
125
137
|
- reconcile ambiguous point-write failures before returning control to callers
|
|
126
138
|
- journal DDL and sync every required file and parent directory
|
package/third-party-notices.md
CHANGED
|
@@ -8,10 +8,8 @@ own MIT license and are not repeated below.
|
|
|
8
8
|
|
|
9
9
|
## Component Inventory
|
|
10
10
|
|
|
11
|
-
The
|
|
12
|
-
|
|
13
|
-
the table. This inventory was generated from the lockfile with
|
|
14
|
-
`cargo license --json`.
|
|
11
|
+
The selected license for each component is stated in the table. This inventory
|
|
12
|
+
was generated from the lockfile with `cargo license --json`.
|
|
15
13
|
|
|
16
14
|
| Component | Version | Upstream expression | Selected license |
|
|
17
15
|
| --- | --- | --- | --- |
|
|
@@ -40,6 +38,7 @@ the table. This inventory was generated from the lockfile with
|
|
|
40
38
|
| clap_lex | 1.1.0 | Apache-2.0 OR MIT | MIT |
|
|
41
39
|
| colorchoice | 1.0.5 | Apache-2.0 OR MIT | MIT |
|
|
42
40
|
| cpufeatures | 0.2.17 | Apache-2.0 OR MIT | MIT |
|
|
41
|
+
| crc32c | 0.6.8 | Apache-2.0 OR MIT | Apache-2.0 |
|
|
43
42
|
| crc32fast | 1.5.0 | Apache-2.0 OR MIT | MIT |
|
|
44
43
|
| crossbeam-utils | 0.8.21 | Apache-2.0 OR MIT | MIT |
|
|
45
44
|
| crypto-common | 0.1.7 | Apache-2.0 OR MIT | MIT |
|
|
@@ -111,6 +110,7 @@ the table. This inventory was generated from the lockfile with
|
|
|
111
110
|
| regex-automata | 0.4.14 | Apache-2.0 OR MIT | MIT |
|
|
112
111
|
| regex-syntax | 0.8.10 | Apache-2.0 OR MIT | MIT |
|
|
113
112
|
| ring | 0.17.14 | Apache-2.0 AND ISC | Apache-2.0 AND ISC |
|
|
113
|
+
| rustc_version | 0.4.1 | Apache-2.0 OR MIT | MIT |
|
|
114
114
|
| rustix | 1.1.4 | Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT | MIT |
|
|
115
115
|
| rustls | 0.23.40 | Apache-2.0 OR ISC OR MIT | MIT |
|
|
116
116
|
| rustls-pemfile | 2.2.0 | Apache-2.0 OR ISC OR MIT | MIT |
|
|
@@ -248,7 +248,7 @@ Copyright (c) 2016 Joe Wilm (utf8parse)
|
|
|
248
248
|
|
|
249
249
|
Copyright (c) 2016 Joseph Birr-Pixton <jpixton@gmail.com> (rustls, rustls-pemfile)
|
|
250
250
|
|
|
251
|
-
Copyright (c) 2016 The Rust Project Developers (lock_api, parking_lot, parking_lot_core, thread_local)
|
|
251
|
+
Copyright (c) 2016 The Rust Project Developers (lock_api, parking_lot, parking_lot_core, rustc_version, thread_local)
|
|
252
252
|
|
|
253
253
|
Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com> (strsim)
|
|
254
254
|
|
|
@@ -374,7 +374,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
374
374
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
375
375
|
SOFTWARE.
|
|
376
376
|
|
|
377
|
-
## Apache-2.0
|
|
377
|
+
## Apache-2.0 Notices
|
|
378
|
+
|
|
379
|
+
### ring
|
|
378
380
|
|
|
379
381
|
`ring` includes BoringSSL-derived, once_cell-derived, and fiat-crypto-derived
|
|
380
382
|
code under the Apache License 2.0. The fiat-crypto-derived code carries this
|
|
@@ -741,6 +743,30 @@ the following restrictions:
|
|
|
741
743
|
misrepresented as being the original software.
|
|
742
744
|
3. This notice may not be removed or altered from any source distribution.
|
|
743
745
|
|
|
746
|
+
## Zlib-derived Notice for crc32c
|
|
747
|
+
|
|
748
|
+
The `crc32c` component's `src/combine.rs` is based on the Zlib project's
|
|
749
|
+
`crc32.c` combine implementation and carries the following notice:
|
|
750
|
+
|
|
751
|
+
crc32.c -- compute the CRC-32 of a data stream
|
|
752
|
+
Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
|
|
753
|
+
|
|
754
|
+
This software is provided 'as-is', without any express or implied warranty. In
|
|
755
|
+
no event will the authors be held liable for any damages arising from the use of
|
|
756
|
+
this software.
|
|
757
|
+
|
|
758
|
+
Permission is granted to anyone to use this software for any purpose, including
|
|
759
|
+
commercial applications, and to alter it and redistribute it freely, subject to
|
|
760
|
+
the following restrictions:
|
|
761
|
+
|
|
762
|
+
1. The origin of this software must not be misrepresented; you must not claim
|
|
763
|
+
that you wrote the original software. If you use this software in a product,
|
|
764
|
+
an acknowledgment in the product documentation would be appreciated but is
|
|
765
|
+
not required.
|
|
766
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
|
767
|
+
misrepresented as being the original software.
|
|
768
|
+
3. This notice may not be removed or altered from any source distribution.
|
|
769
|
+
|
|
744
770
|
## Unicode License V3 for unicode-ident
|
|
745
771
|
|
|
746
772
|
COPYRIGHT AND PERMISSION NOTICE
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -13,7 +13,6 @@ const FILE_MAGIC = Buffer.from('SMARTDB\0', 'ascii');
|
|
|
13
13
|
const FORMAT_VERSION = 1;
|
|
14
14
|
/** File type tags */
|
|
15
15
|
const FILE_TYPE_DATA = 1;
|
|
16
|
-
const FILE_TYPE_HINT = 3;
|
|
17
16
|
/** File header total size */
|
|
18
17
|
const FILE_HEADER_SIZE = 64;
|
|
19
18
|
/** Per-record magic */
|
|
@@ -63,19 +62,6 @@ function encodeDataRecord(timestamp: bigint, key: Buffer, value: Buffer): Buffer
|
|
|
63
62
|
return buf;
|
|
64
63
|
}
|
|
65
64
|
|
|
66
|
-
function encodeHintEntry(key: string, offset: bigint, recordLen: number, valueLen: number, timestamp: bigint): Buffer {
|
|
67
|
-
const keyBuf = Buffer.from(key, 'utf-8');
|
|
68
|
-
const buf = Buffer.alloc(4 + keyBuf.length + 8 + 4 + 4 + 8);
|
|
69
|
-
let pos = 0;
|
|
70
|
-
buf.writeUInt32LE(keyBuf.length, pos); pos += 4;
|
|
71
|
-
keyBuf.copy(buf, pos); pos += keyBuf.length;
|
|
72
|
-
buf.writeBigUInt64LE(offset, pos); pos += 8;
|
|
73
|
-
buf.writeUInt32LE(recordLen, pos); pos += 4;
|
|
74
|
-
buf.writeUInt32LE(valueLen, pos); pos += 4;
|
|
75
|
-
buf.writeBigUInt64LE(timestamp, pos);
|
|
76
|
-
return buf;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
65
|
// ---------------------------------------------------------------------------
|
|
80
66
|
// CRC32 (matching crc32fast in Rust)
|
|
81
67
|
// ---------------------------------------------------------------------------
|
|
@@ -214,7 +200,7 @@ const syncFile = async (filePathArg: string, signalArg?: AbortSignal): Promise<v
|
|
|
214
200
|
const assertPublishedMigrationComplete = async (
|
|
215
201
|
collectionDirectoryArg: string,
|
|
216
202
|
): Promise<void> => {
|
|
217
|
-
for (const fileName of ['data.rdb', '
|
|
203
|
+
for (const fileName of ['data.rdb', 'indexes.json']) {
|
|
218
204
|
let fileStat: Awaited<ReturnType<typeof fs.lstat>>;
|
|
219
205
|
try {
|
|
220
206
|
fileStat = await fs.lstat(path.join(collectionDirectoryArg, fileName));
|
|
@@ -239,13 +225,6 @@ const assertPublishedMigrationComplete = async (
|
|
|
239
225
|
// Migration: v0 (JSON) → v1 (Bitcask binary)
|
|
240
226
|
// ---------------------------------------------------------------------------
|
|
241
227
|
|
|
242
|
-
interface IKeyDirEntry {
|
|
243
|
-
offset: bigint;
|
|
244
|
-
recordLen: number;
|
|
245
|
-
valueLen: number;
|
|
246
|
-
timestamp: bigint;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
228
|
/**
|
|
250
229
|
* Migrate a storage directory from v0 (JSON-per-collection) to v1 (Bitcask binary).
|
|
251
230
|
*
|
|
@@ -320,8 +299,6 @@ export async function migrateV0ToV1(
|
|
|
320
299
|
const headerBuf = writeFileHeader(FILE_TYPE_DATA);
|
|
321
300
|
await writeBuffer(dataFileHandle, headerBuf, signalArg);
|
|
322
301
|
|
|
323
|
-
let currentOffset = BigInt(FILE_HEADER_SIZE);
|
|
324
|
-
const keydir: Map<string, IKeyDirEntry> = new Map();
|
|
325
302
|
const ts = BigInt(Date.now());
|
|
326
303
|
|
|
327
304
|
for (const doc of docs) {
|
|
@@ -348,40 +325,10 @@ export async function migrateV0ToV1(
|
|
|
348
325
|
const record = encodeDataRecord(ts, keyBuf, valueBuf);
|
|
349
326
|
await writeBuffer(dataFileHandle, record, signalArg);
|
|
350
327
|
|
|
351
|
-
keydir.set(idHex, {
|
|
352
|
-
offset: currentOffset,
|
|
353
|
-
recordLen: record.length,
|
|
354
|
-
valueLen: valueBuf.length,
|
|
355
|
-
timestamp: ts,
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
currentOffset += BigInt(record.length);
|
|
359
328
|
}
|
|
360
329
|
|
|
361
330
|
await dataFileHandle.sync();
|
|
362
331
|
signalArg?.throwIfAborted();
|
|
363
|
-
|
|
364
|
-
// Write keydir.hint
|
|
365
|
-
const hintPath = path.join(stagingDir, 'keydir.hint');
|
|
366
|
-
await withFileHandle(hintPath, 'wx', async (hintFileHandle) => {
|
|
367
|
-
await writeBuffer(hintFileHandle, writeFileHeader(FILE_TYPE_HINT), signalArg);
|
|
368
|
-
for (const [key, entry] of keydir) {
|
|
369
|
-
signalArg?.throwIfAborted();
|
|
370
|
-
await writeBuffer(
|
|
371
|
-
hintFileHandle,
|
|
372
|
-
encodeHintEntry(
|
|
373
|
-
key,
|
|
374
|
-
entry.offset,
|
|
375
|
-
entry.recordLen,
|
|
376
|
-
entry.valueLen,
|
|
377
|
-
entry.timestamp,
|
|
378
|
-
),
|
|
379
|
-
signalArg,
|
|
380
|
-
);
|
|
381
|
-
}
|
|
382
|
-
await hintFileHandle.sync();
|
|
383
|
-
signalArg?.throwIfAborted();
|
|
384
|
-
}, signalArg);
|
|
385
332
|
}, signalArg);
|
|
386
333
|
|
|
387
334
|
// Copy indexes.json if it exists
|