@elaraai/e3-core 0.0.2-beta.9 → 1.0.1
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/LICENSE.md +4 -0
- package/README.md +74 -35
- package/dist/src/dataflow/api-compat.d.ts +90 -0
- package/dist/src/dataflow/api-compat.d.ts.map +1 -0
- package/dist/src/dataflow/api-compat.js +139 -0
- package/dist/src/dataflow/api-compat.js.map +1 -0
- package/dist/src/dataflow/api-compat.spec.d.ts +6 -0
- package/dist/src/dataflow/api-compat.spec.d.ts.map +1 -0
- package/dist/src/dataflow/api-compat.spec.js +182 -0
- package/dist/src/dataflow/api-compat.spec.js.map +1 -0
- package/dist/src/dataflow/index.d.ts +18 -0
- package/dist/src/dataflow/index.d.ts.map +1 -0
- package/dist/src/dataflow/index.js +23 -0
- package/dist/src/dataflow/index.js.map +1 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts +76 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts.map +1 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.js +729 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.js.map +1 -0
- package/dist/src/dataflow/orchestrator/index.d.ts +12 -0
- package/dist/src/dataflow/orchestrator/index.d.ts.map +1 -0
- package/dist/src/dataflow/orchestrator/index.js +12 -0
- package/dist/src/dataflow/orchestrator/index.js.map +1 -0
- package/dist/src/dataflow/orchestrator/interfaces.d.ts +163 -0
- package/dist/src/dataflow/orchestrator/interfaces.d.ts.map +1 -0
- package/dist/src/dataflow/orchestrator/interfaces.js +52 -0
- package/dist/src/dataflow/orchestrator/interfaces.js.map +1 -0
- package/dist/src/dataflow/state-store/FileStateStore.d.ts +67 -0
- package/dist/src/dataflow/state-store/FileStateStore.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/FileStateStore.js +300 -0
- package/dist/src/dataflow/state-store/FileStateStore.js.map +1 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts +42 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.js +229 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.js.map +1 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.spec.d.ts +6 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.spec.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.spec.js +114 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.spec.js.map +1 -0
- package/dist/src/dataflow/state-store/index.d.ts +13 -0
- package/dist/src/dataflow/state-store/index.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/index.js +13 -0
- package/dist/src/dataflow/state-store/index.js.map +1 -0
- package/dist/src/dataflow/state-store/interfaces.d.ts +159 -0
- package/dist/src/dataflow/state-store/interfaces.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/interfaces.js +6 -0
- package/dist/src/dataflow/state-store/interfaces.js.map +1 -0
- package/dist/src/dataflow/steps.d.ts +222 -0
- package/dist/src/dataflow/steps.d.ts.map +1 -0
- package/dist/src/dataflow/steps.js +707 -0
- package/dist/src/dataflow/steps.js.map +1 -0
- package/dist/src/dataflow/steps.spec.d.ts +6 -0
- package/dist/src/dataflow/steps.spec.d.ts.map +1 -0
- package/dist/src/dataflow/steps.spec.js +343 -0
- package/dist/src/dataflow/steps.spec.js.map +1 -0
- package/dist/src/dataflow/types.d.ts +127 -0
- package/dist/src/dataflow/types.d.ts.map +1 -0
- package/dist/src/dataflow/types.js +7 -0
- package/dist/src/dataflow/types.js.map +1 -0
- package/dist/src/dataflow-orchestration.spec.d.ts +6 -0
- package/dist/src/dataflow-orchestration.spec.d.ts.map +1 -0
- package/dist/src/dataflow-orchestration.spec.js +1025 -0
- package/dist/src/dataflow-orchestration.spec.js.map +1 -0
- package/dist/src/dataflow.d.ts +113 -38
- package/dist/src/dataflow.d.ts.map +1 -1
- package/dist/src/dataflow.js +269 -416
- package/dist/src/dataflow.js.map +1 -1
- package/dist/src/dataflow.spec.d.ts +6 -0
- package/dist/src/dataflow.spec.d.ts.map +1 -0
- package/dist/src/dataflow.spec.js +663 -0
- package/dist/src/dataflow.spec.js.map +1 -0
- package/dist/src/dataset-refs.d.ts +124 -0
- package/dist/src/dataset-refs.d.ts.map +1 -0
- package/dist/src/dataset-refs.js +319 -0
- package/dist/src/dataset-refs.js.map +1 -0
- package/dist/src/errors.d.ts +39 -9
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +51 -8
- package/dist/src/errors.js.map +1 -1
- package/dist/src/errors.spec.d.ts +6 -0
- package/dist/src/errors.spec.d.ts.map +1 -0
- package/dist/src/errors.spec.js +276 -0
- package/dist/src/errors.spec.js.map +1 -0
- package/dist/src/execution/LocalTaskRunner.d.ts +73 -0
- package/dist/src/execution/LocalTaskRunner.d.ts.map +1 -0
- package/dist/src/execution/LocalTaskRunner.js +399 -0
- package/dist/src/execution/LocalTaskRunner.js.map +1 -0
- package/dist/src/execution/MockTaskRunner.d.ts +49 -0
- package/dist/src/execution/MockTaskRunner.d.ts.map +1 -0
- package/dist/src/execution/MockTaskRunner.js +54 -0
- package/dist/src/execution/MockTaskRunner.js.map +1 -0
- package/dist/src/execution/index.d.ts +16 -0
- package/dist/src/execution/index.d.ts.map +1 -0
- package/dist/src/execution/index.js +8 -0
- package/dist/src/execution/index.js.map +1 -0
- package/dist/src/execution/interfaces.d.ts +246 -0
- package/dist/src/execution/interfaces.d.ts.map +1 -0
- package/dist/src/execution/interfaces.js +6 -0
- package/dist/src/execution/interfaces.js.map +1 -0
- package/dist/src/execution/processHelpers.d.ts +20 -0
- package/dist/src/execution/processHelpers.d.ts.map +1 -0
- package/dist/src/execution/processHelpers.js +62 -0
- package/dist/src/execution/processHelpers.js.map +1 -0
- package/dist/src/executions.d.ts +71 -104
- package/dist/src/executions.d.ts.map +1 -1
- package/dist/src/executions.js +113 -481
- package/dist/src/executions.js.map +1 -1
- package/dist/src/executions.spec.d.ts +6 -0
- package/dist/src/executions.spec.d.ts.map +1 -0
- package/dist/src/executions.spec.js +387 -0
- package/dist/src/executions.spec.js.map +1 -0
- package/dist/src/formats.d.ts +18 -2
- package/dist/src/formats.d.ts.map +1 -1
- package/dist/src/formats.js +34 -2
- package/dist/src/formats.js.map +1 -1
- package/dist/src/gc.spec.d.ts +6 -0
- package/dist/src/gc.spec.d.ts.map +1 -0
- package/dist/src/gc.spec.js +512 -0
- package/dist/src/gc.spec.js.map +1 -0
- package/dist/src/index.d.ts +20 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +48 -18
- package/dist/src/index.js.map +1 -1
- package/dist/src/objects.d.ts +7 -53
- package/dist/src/objects.d.ts.map +1 -1
- package/dist/src/objects.js +13 -232
- package/dist/src/objects.js.map +1 -1
- package/dist/src/objects.spec.d.ts +6 -0
- package/dist/src/objects.spec.d.ts.map +1 -0
- package/dist/src/objects.spec.js +247 -0
- package/dist/src/objects.spec.js.map +1 -0
- package/dist/src/packages.d.ts +41 -14
- package/dist/src/packages.d.ts.map +1 -1
- package/dist/src/packages.js +151 -89
- package/dist/src/packages.js.map +1 -1
- package/dist/src/packages.spec.d.ts +6 -0
- package/dist/src/packages.spec.d.ts.map +1 -0
- package/dist/src/packages.spec.js +324 -0
- package/dist/src/packages.spec.js.map +1 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts +35 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts.map +1 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.js +107 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.js.map +1 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.spec.d.ts +6 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.spec.d.ts.map +1 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.spec.js +187 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.spec.js.map +1 -0
- package/dist/src/storage/in-memory/InMemoryStorage.d.ts +139 -0
- package/dist/src/storage/in-memory/InMemoryStorage.d.ts.map +1 -0
- package/dist/src/storage/in-memory/InMemoryStorage.js +439 -0
- package/dist/src/storage/in-memory/InMemoryStorage.js.map +1 -0
- package/dist/src/storage/in-memory/index.d.ts +12 -0
- package/dist/src/storage/in-memory/index.d.ts.map +1 -0
- package/dist/src/storage/in-memory/index.js +12 -0
- package/dist/src/storage/in-memory/index.js.map +1 -0
- package/dist/src/storage/index.d.ts +18 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +10 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +581 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -0
- package/dist/src/storage/interfaces.js +6 -0
- package/dist/src/storage/interfaces.js.map +1 -0
- package/dist/src/storage/local/LocalBackend.d.ts +56 -0
- package/dist/src/storage/local/LocalBackend.d.ts.map +1 -0
- package/dist/src/storage/local/LocalBackend.js +145 -0
- package/dist/src/storage/local/LocalBackend.js.map +1 -0
- package/dist/src/storage/local/LocalDatasetRefStore.d.ts +22 -0
- package/dist/src/storage/local/LocalDatasetRefStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalDatasetRefStore.js +118 -0
- package/dist/src/storage/local/LocalDatasetRefStore.js.map +1 -0
- package/dist/src/storage/local/LocalLockService.d.ts +111 -0
- package/dist/src/storage/local/LocalLockService.d.ts.map +1 -0
- package/dist/src/storage/local/LocalLockService.js +364 -0
- package/dist/src/storage/local/LocalLockService.js.map +1 -0
- package/dist/src/storage/local/LocalLockService.spec.d.ts +6 -0
- package/dist/src/storage/local/LocalLockService.spec.d.ts.map +1 -0
- package/dist/src/storage/local/LocalLockService.spec.js +148 -0
- package/dist/src/storage/local/LocalLockService.spec.js.map +1 -0
- package/dist/src/storage/local/LocalLogStore.d.ts +23 -0
- package/dist/src/storage/local/LocalLogStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalLogStore.js +66 -0
- package/dist/src/storage/local/LocalLogStore.js.map +1 -0
- package/dist/src/storage/local/LocalObjectStore.d.ts +55 -0
- package/dist/src/storage/local/LocalObjectStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalObjectStore.js +300 -0
- package/dist/src/storage/local/LocalObjectStore.js.map +1 -0
- package/dist/src/storage/local/LocalRefStore.d.ts +50 -0
- package/dist/src/storage/local/LocalRefStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalRefStore.js +337 -0
- package/dist/src/storage/local/LocalRefStore.js.map +1 -0
- package/dist/src/storage/local/LocalRepoStore.d.ts +55 -0
- package/dist/src/storage/local/LocalRepoStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalRepoStore.js +365 -0
- package/dist/src/storage/local/LocalRepoStore.js.map +1 -0
- package/dist/src/storage/local/LocalRepoStore.spec.d.ts +6 -0
- package/dist/src/storage/local/LocalRepoStore.spec.d.ts.map +1 -0
- package/dist/src/storage/local/LocalRepoStore.spec.js +255 -0
- package/dist/src/storage/local/LocalRepoStore.spec.js.map +1 -0
- package/dist/src/storage/local/gc.d.ts +92 -0
- package/dist/src/storage/local/gc.d.ts.map +1 -0
- package/dist/src/storage/local/gc.js +377 -0
- package/dist/src/storage/local/gc.js.map +1 -0
- package/dist/src/storage/local/index.d.ts +18 -0
- package/dist/src/storage/local/index.d.ts.map +1 -0
- package/dist/src/storage/local/index.js +18 -0
- package/dist/src/storage/local/index.js.map +1 -0
- package/dist/src/storage/local/localHelpers.d.ts +25 -0
- package/dist/src/storage/local/localHelpers.d.ts.map +1 -0
- package/dist/src/storage/local/localHelpers.js +69 -0
- package/dist/src/storage/local/localHelpers.js.map +1 -0
- package/dist/src/{repository.d.ts → storage/local/repository.d.ts} +8 -4
- package/dist/src/storage/local/repository.d.ts.map +1 -0
- package/dist/src/{repository.js → storage/local/repository.js} +31 -29
- package/dist/src/storage/local/repository.js.map +1 -0
- package/dist/src/storage/local/repository.spec.d.ts +6 -0
- package/dist/src/storage/local/repository.spec.d.ts.map +1 -0
- package/dist/src/storage/local/repository.spec.js +186 -0
- package/dist/src/storage/local/repository.spec.js.map +1 -0
- package/dist/src/tasks.d.ts +16 -10
- package/dist/src/tasks.d.ts.map +1 -1
- package/dist/src/tasks.js +35 -41
- package/dist/src/tasks.js.map +1 -1
- package/dist/src/tasks.spec.d.ts +6 -0
- package/dist/src/tasks.spec.d.ts.map +1 -0
- package/dist/src/tasks.spec.js +105 -0
- package/dist/src/tasks.spec.js.map +1 -0
- package/dist/src/test-helpers.d.ts +5 -4
- package/dist/src/test-helpers.d.ts.map +1 -1
- package/dist/src/test-helpers.js +9 -21
- package/dist/src/test-helpers.js.map +1 -1
- package/dist/src/transfer/InMemoryTransferBackend.d.ts +75 -0
- package/dist/src/transfer/InMemoryTransferBackend.d.ts.map +1 -0
- package/dist/src/transfer/InMemoryTransferBackend.js +211 -0
- package/dist/src/transfer/InMemoryTransferBackend.js.map +1 -0
- package/dist/src/transfer/index.d.ts +9 -0
- package/dist/src/transfer/index.d.ts.map +1 -0
- package/dist/src/transfer/index.js +11 -0
- package/dist/src/transfer/index.js.map +1 -0
- package/dist/src/transfer/interfaces.d.ts +103 -0
- package/dist/src/transfer/interfaces.d.ts.map +1 -0
- package/dist/src/transfer/interfaces.js +6 -0
- package/dist/src/transfer/interfaces.js.map +1 -0
- package/dist/src/transfer/process.d.ts +55 -0
- package/dist/src/transfer/process.d.ts.map +1 -0
- package/dist/src/transfer/process.js +144 -0
- package/dist/src/transfer/process.js.map +1 -0
- package/dist/src/transfer/types.d.ts +106 -0
- package/dist/src/transfer/types.d.ts.map +1 -0
- package/dist/src/transfer/types.js +61 -0
- package/dist/src/transfer/types.js.map +1 -0
- package/dist/src/trees.d.ts +102 -63
- package/dist/src/trees.d.ts.map +1 -1
- package/dist/src/trees.js +319 -479
- package/dist/src/trees.js.map +1 -1
- package/dist/src/trees.spec.d.ts +6 -0
- package/dist/src/trees.spec.d.ts.map +1 -0
- package/dist/src/trees.spec.js +635 -0
- package/dist/src/trees.spec.js.map +1 -0
- package/dist/src/uuid.d.ts +26 -0
- package/dist/src/uuid.d.ts.map +1 -0
- package/dist/src/uuid.js +80 -0
- package/dist/src/uuid.js.map +1 -0
- package/dist/src/workspaceStatus.d.ts +6 -4
- package/dist/src/workspaceStatus.d.ts.map +1 -1
- package/dist/src/workspaceStatus.js +46 -60
- package/dist/src/workspaceStatus.js.map +1 -1
- package/dist/src/workspaces.d.ts +46 -47
- package/dist/src/workspaces.d.ts.map +1 -1
- package/dist/src/workspaces.js +281 -221
- package/dist/src/workspaces.js.map +1 -1
- package/dist/src/workspaces.spec.d.ts +6 -0
- package/dist/src/workspaces.spec.d.ts.map +1 -0
- package/dist/src/workspaces.spec.js +273 -0
- package/dist/src/workspaces.spec.js.map +1 -0
- package/package.json +15 -15
- package/dist/src/gc.d.ts +0 -54
- package/dist/src/gc.d.ts.map +0 -1
- package/dist/src/gc.js +0 -233
- package/dist/src/gc.js.map +0 -1
- package/dist/src/repository.d.ts.map +0 -1
- package/dist/src/repository.js.map +0 -1
- package/dist/src/workspaceLock.d.ts +0 -67
- package/dist/src/workspaceLock.d.ts.map +0 -1
- package/dist/src/workspaceLock.js +0 -217
- package/dist/src/workspaceLock.js.map +0 -1
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Tests for gc.ts
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
9
|
+
import assert from 'node:assert';
|
|
10
|
+
import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
11
|
+
import { join, dirname } from 'node:path';
|
|
12
|
+
import { StringType, StructType, encodeBeast2For, variant } from '@elaraai/east';
|
|
13
|
+
import e3 from '@elaraai/e3';
|
|
14
|
+
import { WorkspaceStateType, PackageObjectType, TaskObjectType, DataRefType, DatasetRefType } from '@elaraai/e3-types';
|
|
15
|
+
import { repoGc, collectAllRoots, markReachable, sweepBatch } from './storage/local/gc.js';
|
|
16
|
+
import { objectWrite, objectRead } from './storage/local/LocalObjectStore.js';
|
|
17
|
+
import { packageImport, packageRemove } from './packages.js';
|
|
18
|
+
import { ObjectNotFoundError } from './errors.js';
|
|
19
|
+
import { createTestRepo, removeTestRepo, createTempDir, removeTempDir } from './test-helpers.js';
|
|
20
|
+
import { LocalStorage } from './storage/local/index.js';
|
|
21
|
+
describe('gc', () => {
|
|
22
|
+
let testRepoPath;
|
|
23
|
+
let tempDir;
|
|
24
|
+
let storage;
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
testRepoPath = createTestRepo();
|
|
27
|
+
tempDir = createTempDir();
|
|
28
|
+
// Create LocalStorage with the parent of testRepo as reposDir.
|
|
29
|
+
// This allows repoGc to use repoName for repos.* operations,
|
|
30
|
+
// while objects/refs still use testRepoPath (full path).
|
|
31
|
+
storage = new LocalStorage(dirname(testRepoPath));
|
|
32
|
+
});
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
removeTestRepo(testRepoPath);
|
|
35
|
+
removeTempDir(tempDir);
|
|
36
|
+
});
|
|
37
|
+
describe('with no objects', () => {
|
|
38
|
+
it('returns zero counts for empty repository', async () => {
|
|
39
|
+
const result = await repoGc(storage, testRepoPath);
|
|
40
|
+
assert.strictEqual(result.deletedObjects, 0);
|
|
41
|
+
assert.strictEqual(result.deletedPartials, 0);
|
|
42
|
+
assert.strictEqual(result.retainedObjects, 0);
|
|
43
|
+
assert.strictEqual(result.bytesFreed, 0);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('with orphaned objects', () => {
|
|
47
|
+
it('deletes orphaned objects', async () => {
|
|
48
|
+
// Store an object directly without any ref
|
|
49
|
+
const data = new Uint8Array([1, 2, 3, 4, 5]);
|
|
50
|
+
const hash = await objectWrite(testRepoPath, data);
|
|
51
|
+
// Verify object exists
|
|
52
|
+
const loaded = await objectRead(testRepoPath, hash);
|
|
53
|
+
assert.deepStrictEqual(new Uint8Array(loaded), data);
|
|
54
|
+
// Run gc with minAge=0 to delete immediately
|
|
55
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
56
|
+
assert.strictEqual(result.deletedObjects, 1);
|
|
57
|
+
assert.strictEqual(result.retainedObjects, 0);
|
|
58
|
+
assert.ok(result.bytesFreed > 0);
|
|
59
|
+
// Verify object is gone
|
|
60
|
+
await assert.rejects(async () => await objectRead(testRepoPath, hash), ObjectNotFoundError);
|
|
61
|
+
});
|
|
62
|
+
it('deletes multiple orphaned objects', async () => {
|
|
63
|
+
// Store several objects
|
|
64
|
+
await objectWrite(testRepoPath, new Uint8Array([1]));
|
|
65
|
+
await objectWrite(testRepoPath, new Uint8Array([2]));
|
|
66
|
+
await objectWrite(testRepoPath, new Uint8Array([3]));
|
|
67
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
68
|
+
assert.strictEqual(result.deletedObjects, 3);
|
|
69
|
+
assert.strictEqual(result.retainedObjects, 0);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('with package refs', () => {
|
|
73
|
+
it('retains objects referenced by packages', async () => {
|
|
74
|
+
// Create and import a package
|
|
75
|
+
const myInput = e3.input('greeting', StringType, 'hello');
|
|
76
|
+
const pkg = e3.package('gc-test', '1.0.0', myInput);
|
|
77
|
+
const zipPath = join(tempDir, 'gc-test.zip');
|
|
78
|
+
await e3.export(pkg, zipPath);
|
|
79
|
+
const importResult = await packageImport(storage, testRepoPath, zipPath);
|
|
80
|
+
// Run gc - should not delete anything
|
|
81
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
82
|
+
assert.strictEqual(result.deletedObjects, 0);
|
|
83
|
+
assert.ok(result.retainedObjects >= 2, `Expected at least 2 retained objects, got ${result.retainedObjects}`);
|
|
84
|
+
// Verify package object still exists
|
|
85
|
+
const packageData = await objectRead(testRepoPath, importResult.packageHash);
|
|
86
|
+
assert.ok(packageData.length > 0);
|
|
87
|
+
});
|
|
88
|
+
it('deletes objects after package is removed', async () => {
|
|
89
|
+
// Create and import a package
|
|
90
|
+
const pkg = e3.package('remove-gc', '1.0.0');
|
|
91
|
+
const zipPath = join(tempDir, 'remove-gc.zip');
|
|
92
|
+
await e3.export(pkg, zipPath);
|
|
93
|
+
const importResult = await packageImport(storage, testRepoPath, zipPath);
|
|
94
|
+
const objectCount = importResult.objectCount;
|
|
95
|
+
// Remove the package
|
|
96
|
+
await packageRemove(storage, testRepoPath, 'remove-gc', '1.0.0');
|
|
97
|
+
// Run gc - should delete all package objects
|
|
98
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
99
|
+
assert.strictEqual(result.deletedObjects, objectCount);
|
|
100
|
+
assert.strictEqual(result.retainedObjects, 0);
|
|
101
|
+
});
|
|
102
|
+
it('retains shared objects between packages', async () => {
|
|
103
|
+
// Create and import two packages
|
|
104
|
+
const pkg1 = e3.package('shared-a', '1.0.0');
|
|
105
|
+
const pkg2 = e3.package('shared-b', '1.0.0');
|
|
106
|
+
const zip1 = join(tempDir, 'shared-a.zip');
|
|
107
|
+
const zip2 = join(tempDir, 'shared-b.zip');
|
|
108
|
+
await e3.export(pkg1, zip1);
|
|
109
|
+
await e3.export(pkg2, zip2);
|
|
110
|
+
await packageImport(storage, testRepoPath, zip1);
|
|
111
|
+
await packageImport(storage, testRepoPath, zip2);
|
|
112
|
+
// Remove one package
|
|
113
|
+
await packageRemove(storage, testRepoPath, 'shared-a', '1.0.0');
|
|
114
|
+
// Run gc
|
|
115
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
116
|
+
// Some objects may be deleted, but shared-b's objects are retained
|
|
117
|
+
assert.ok(result.retainedObjects >= 1);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('with staging files', () => {
|
|
121
|
+
it('deletes orphaned .partial files', async () => {
|
|
122
|
+
// Create a fake .partial staging file
|
|
123
|
+
const partialDir = join(testRepoPath, 'objects', 'ab');
|
|
124
|
+
mkdirSync(partialDir, { recursive: true });
|
|
125
|
+
const partialPath = join(partialDir, 'cdef.beast2.123456.abc123.partial');
|
|
126
|
+
writeFileSync(partialPath, 'orphaned staging data');
|
|
127
|
+
assert.ok(existsSync(partialPath));
|
|
128
|
+
// Run gc
|
|
129
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
130
|
+
assert.strictEqual(result.deletedPartials, 1);
|
|
131
|
+
assert.ok(!existsSync(partialPath));
|
|
132
|
+
});
|
|
133
|
+
it('skips young .partial files', async () => {
|
|
134
|
+
// Create a .partial file
|
|
135
|
+
const partialDir = join(testRepoPath, 'objects', 'cd');
|
|
136
|
+
mkdirSync(partialDir, { recursive: true });
|
|
137
|
+
const partialPath = join(partialDir, 'efgh.beast2.123456.xyz789.partial');
|
|
138
|
+
writeFileSync(partialPath, 'in-progress data');
|
|
139
|
+
// Run gc with default minAge (60s) - file is brand new
|
|
140
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 60000 });
|
|
141
|
+
assert.strictEqual(result.deletedPartials, 0);
|
|
142
|
+
assert.strictEqual(result.skippedYoung, 1);
|
|
143
|
+
assert.ok(existsSync(partialPath));
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('minAge option', () => {
|
|
147
|
+
it('skips young objects', async () => {
|
|
148
|
+
// Store an object
|
|
149
|
+
const hash = await objectWrite(testRepoPath, new Uint8Array([42]));
|
|
150
|
+
// Run gc with high minAge - object is too young
|
|
151
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 60000 });
|
|
152
|
+
assert.strictEqual(result.deletedObjects, 0);
|
|
153
|
+
assert.strictEqual(result.skippedYoung, 1);
|
|
154
|
+
// Object should still exist
|
|
155
|
+
const data = await objectRead(testRepoPath, hash);
|
|
156
|
+
assert.deepStrictEqual(new Uint8Array(data), new Uint8Array([42]));
|
|
157
|
+
});
|
|
158
|
+
it('deletes old objects with minAge=0', async () => {
|
|
159
|
+
const hash = await objectWrite(testRepoPath, new Uint8Array([99]));
|
|
160
|
+
// Run gc with minAge=0
|
|
161
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
162
|
+
assert.strictEqual(result.deletedObjects, 1);
|
|
163
|
+
await assert.rejects(async () => await objectRead(testRepoPath, hash), ObjectNotFoundError);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('dryRun option', () => {
|
|
167
|
+
it('reports but does not delete in dry run mode', async () => {
|
|
168
|
+
// Store an orphaned object
|
|
169
|
+
const data = new Uint8Array([10, 20, 30]);
|
|
170
|
+
const hash = await objectWrite(testRepoPath, data);
|
|
171
|
+
// Run gc in dry run mode
|
|
172
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0, dryRun: true });
|
|
173
|
+
assert.strictEqual(result.deletedObjects, 1);
|
|
174
|
+
assert.ok(result.bytesFreed > 0);
|
|
175
|
+
// Object should still exist
|
|
176
|
+
const loaded = await objectRead(testRepoPath, hash);
|
|
177
|
+
assert.deepStrictEqual(new Uint8Array(loaded), data);
|
|
178
|
+
});
|
|
179
|
+
it('reports partials but does not delete in dry run mode', async () => {
|
|
180
|
+
const partialDir = join(testRepoPath, 'objects', 'ef');
|
|
181
|
+
mkdirSync(partialDir, { recursive: true });
|
|
182
|
+
const partialPath = join(partialDir, 'ghij.beast2.999999.dry123.partial');
|
|
183
|
+
writeFileSync(partialPath, 'dry run test');
|
|
184
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0, dryRun: true });
|
|
185
|
+
assert.strictEqual(result.deletedPartials, 1);
|
|
186
|
+
assert.ok(existsSync(partialPath)); // Still exists
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('object graph traversal', () => {
|
|
190
|
+
it('retains transitively referenced objects via tree → value chain', async () => {
|
|
191
|
+
// Create a chain: Package → Tree → Value (leaf)
|
|
192
|
+
// Tree has a 'data' field pointing to a value object
|
|
193
|
+
// Create value leaf object (some arbitrary beast2 data)
|
|
194
|
+
const valueEncoder = encodeBeast2For(StringType);
|
|
195
|
+
const hashValue = await objectWrite(testRepoPath, valueEncoder('hello world'));
|
|
196
|
+
// Create a package object with refs referencing the value
|
|
197
|
+
const pkgEncoder = encodeBeast2For(PackageObjectType);
|
|
198
|
+
const hashPkg = await objectWrite(testRepoPath, pkgEncoder({
|
|
199
|
+
tasks: new Map(),
|
|
200
|
+
data: {
|
|
201
|
+
structure: variant('struct', new Map()),
|
|
202
|
+
refs: new Map([
|
|
203
|
+
['data', variant('value', { hash: hashValue, versions: new Map() })],
|
|
204
|
+
]),
|
|
205
|
+
},
|
|
206
|
+
}));
|
|
207
|
+
// Create a package ref pointing to the package
|
|
208
|
+
const refDir = join(testRepoPath, 'packages', 'transitive');
|
|
209
|
+
mkdirSync(refDir, { recursive: true });
|
|
210
|
+
writeFileSync(join(refDir, '1.0.0'), hashPkg + '\n');
|
|
211
|
+
// Run gc
|
|
212
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
213
|
+
assert.strictEqual(result.deletedObjects, 0);
|
|
214
|
+
assert.strictEqual(result.retainedObjects, 2); // pkg, value retained
|
|
215
|
+
// All objects should still exist
|
|
216
|
+
await objectRead(testRepoPath, hashPkg);
|
|
217
|
+
await objectRead(testRepoPath, hashValue);
|
|
218
|
+
});
|
|
219
|
+
it('deletes unreachable objects in graph', async () => {
|
|
220
|
+
// Create a reachable package with empty refs, plus an unreachable orphan
|
|
221
|
+
// Reachable package (no children via refs)
|
|
222
|
+
const pkgEncoder = encodeBeast2For(PackageObjectType);
|
|
223
|
+
const hashPkg = await objectWrite(testRepoPath, pkgEncoder({
|
|
224
|
+
tasks: new Map(),
|
|
225
|
+
data: {
|
|
226
|
+
structure: variant('struct', new Map()),
|
|
227
|
+
refs: new Map(),
|
|
228
|
+
},
|
|
229
|
+
}));
|
|
230
|
+
// Unreachable orphan object
|
|
231
|
+
const orphanData = new Uint8Array([77, 88, 99]);
|
|
232
|
+
const hashOrphan = await objectWrite(testRepoPath, orphanData);
|
|
233
|
+
// Only package is a root
|
|
234
|
+
const refDir = join(testRepoPath, 'packages', 'graph-test');
|
|
235
|
+
mkdirSync(refDir, { recursive: true });
|
|
236
|
+
writeFileSync(join(refDir, '1.0.0'), hashPkg + '\n');
|
|
237
|
+
// Run gc
|
|
238
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
239
|
+
assert.strictEqual(result.deletedObjects, 1); // orphan deleted
|
|
240
|
+
assert.strictEqual(result.retainedObjects, 1); // pkg retained
|
|
241
|
+
// Package exists, orphan is gone
|
|
242
|
+
await objectRead(testRepoPath, hashPkg);
|
|
243
|
+
await assert.rejects(async () => await objectRead(testRepoPath, hashOrphan), ObjectNotFoundError);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('execution refs', () => {
|
|
247
|
+
it('retains objects referenced by execution refs', async () => {
|
|
248
|
+
// Store an object
|
|
249
|
+
const data = new Uint8Array([11, 22, 33]);
|
|
250
|
+
const hash = await objectWrite(testRepoPath, data);
|
|
251
|
+
// Create an execution ref using the new schema:
|
|
252
|
+
// executions/<taskHash>/<inputsHash>/<executionId>/status.beast2
|
|
253
|
+
const taskHash = 'a'.repeat(64);
|
|
254
|
+
const inputsHash = 'b'.repeat(64);
|
|
255
|
+
const executionId = '01900000-0000-7000-8000-000000000001';
|
|
256
|
+
const execDir = join(testRepoPath, 'executions', taskHash, inputsHash, executionId);
|
|
257
|
+
mkdirSync(execDir, { recursive: true });
|
|
258
|
+
// Write a success execution status with outputHash
|
|
259
|
+
const { encodeBeast2For: encodeFor } = await import('@elaraai/east');
|
|
260
|
+
const { ExecutionStatusType } = await import('@elaraai/e3-types');
|
|
261
|
+
const encoder = encodeFor(ExecutionStatusType);
|
|
262
|
+
const status = variant('success', {
|
|
263
|
+
executionId,
|
|
264
|
+
inputHashes: [inputsHash],
|
|
265
|
+
outputHash: hash,
|
|
266
|
+
startedAt: new Date(),
|
|
267
|
+
completedAt: new Date(),
|
|
268
|
+
});
|
|
269
|
+
writeFileSync(join(execDir, 'status.beast2'), encoder(status));
|
|
270
|
+
// Run gc
|
|
271
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
272
|
+
assert.strictEqual(result.deletedObjects, 0);
|
|
273
|
+
assert.strictEqual(result.retainedObjects, 1);
|
|
274
|
+
// Object still exists
|
|
275
|
+
const loaded = await objectRead(testRepoPath, hash);
|
|
276
|
+
assert.deepStrictEqual(new Uint8Array(loaded), data);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('workspace refs', () => {
|
|
280
|
+
it('retains objects referenced by workspace state and dataset refs', async () => {
|
|
281
|
+
// Store objects for a dataset value and package
|
|
282
|
+
const valueData = new Uint8Array([44, 55, 66]);
|
|
283
|
+
const valueHash = await objectWrite(testRepoPath, valueData);
|
|
284
|
+
const pkgData = new Uint8Array([77, 88, 99]);
|
|
285
|
+
const pkgHash = await objectWrite(testRepoPath, pkgData);
|
|
286
|
+
// Create workspace state file at workspaces/<name>.beast2
|
|
287
|
+
const wsDir = join(testRepoPath, 'workspaces');
|
|
288
|
+
mkdirSync(wsDir, { recursive: true });
|
|
289
|
+
const state = {
|
|
290
|
+
packageName: 'test-pkg',
|
|
291
|
+
packageVersion: '1.0.0',
|
|
292
|
+
packageHash: pkgHash,
|
|
293
|
+
deployedAt: new Date(),
|
|
294
|
+
currentRunId: variant('none', null),
|
|
295
|
+
};
|
|
296
|
+
const encoder = encodeBeast2For(WorkspaceStateType);
|
|
297
|
+
writeFileSync(join(wsDir, 'myworkspace.beast2'), encoder(state));
|
|
298
|
+
// Create a per-dataset ref file that references valueHash
|
|
299
|
+
const refDir = join(testRepoPath, 'workspaces', 'myworkspace', 'data');
|
|
300
|
+
mkdirSync(refDir, { recursive: true });
|
|
301
|
+
const refEncoder = encodeBeast2For(DatasetRefType);
|
|
302
|
+
const ref = variant('value', { hash: valueHash, versions: new Map() });
|
|
303
|
+
writeFileSync(join(refDir, 'some-dataset.ref'), refEncoder(ref));
|
|
304
|
+
// Run gc
|
|
305
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
306
|
+
assert.strictEqual(result.deletedObjects, 0);
|
|
307
|
+
assert.strictEqual(result.retainedObjects, 2); // both valueHash and pkgHash
|
|
308
|
+
// Objects still exist
|
|
309
|
+
await objectRead(testRepoPath, valueHash);
|
|
310
|
+
await objectRead(testRepoPath, pkgHash);
|
|
311
|
+
});
|
|
312
|
+
it('ignores undeployed workspaces', async () => {
|
|
313
|
+
// Store an orphaned object
|
|
314
|
+
const data = new Uint8Array([11, 22, 33]);
|
|
315
|
+
await objectWrite(testRepoPath, data);
|
|
316
|
+
// Create empty workspace file (undeployed)
|
|
317
|
+
const wsDir = join(testRepoPath, 'workspaces');
|
|
318
|
+
mkdirSync(wsDir, { recursive: true });
|
|
319
|
+
writeFileSync(join(wsDir, 'undeployed.beast2'), '');
|
|
320
|
+
// Run gc - orphaned object should be deleted
|
|
321
|
+
const result = await repoGc(storage, testRepoPath, { minAge: 0 });
|
|
322
|
+
assert.strictEqual(result.deletedObjects, 1);
|
|
323
|
+
assert.strictEqual(result.retainedObjects, 0);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
// ==========================================================================
|
|
327
|
+
// Unit tests for shared algorithm functions
|
|
328
|
+
// ==========================================================================
|
|
329
|
+
describe('collectAllRoots', () => {
|
|
330
|
+
it('collects roots from all root types', async () => {
|
|
331
|
+
const roots = await collectAllRoots(storage.repos, testRepoPath);
|
|
332
|
+
// Empty repo has no roots
|
|
333
|
+
assert.strictEqual(roots.size, 0);
|
|
334
|
+
});
|
|
335
|
+
it('collects package roots', async () => {
|
|
336
|
+
// Create a package ref
|
|
337
|
+
const hash = 'a'.repeat(64);
|
|
338
|
+
const refDir = join(testRepoPath, 'packages', 'test-pkg');
|
|
339
|
+
mkdirSync(refDir, { recursive: true });
|
|
340
|
+
writeFileSync(join(refDir, '1.0.0'), hash + '\n');
|
|
341
|
+
const roots = await collectAllRoots(storage.repos, testRepoPath);
|
|
342
|
+
assert.ok(roots.has(hash));
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
describe('markReachable', () => {
|
|
346
|
+
// Helper: create a tree type with DataRef fields
|
|
347
|
+
const makeTreeType = (fieldNames) => {
|
|
348
|
+
const fields = {};
|
|
349
|
+
for (const name of fieldNames) {
|
|
350
|
+
fields[name] = DataRefType;
|
|
351
|
+
}
|
|
352
|
+
return StructType(fields);
|
|
353
|
+
};
|
|
354
|
+
it('follows PackageObject → TaskObject → IR chain', async () => {
|
|
355
|
+
const irHash = 'c'.repeat(64);
|
|
356
|
+
// Encode a TaskObject referencing the IR hash
|
|
357
|
+
const taskEncoder = encodeBeast2For(TaskObjectType);
|
|
358
|
+
const taskData = taskEncoder({
|
|
359
|
+
commandIr: irHash,
|
|
360
|
+
inputs: [[variant('field', 'x')]],
|
|
361
|
+
output: [variant('field', 'y')],
|
|
362
|
+
kind: variant('none', null), metadata: variant('none', null),
|
|
363
|
+
});
|
|
364
|
+
const taskHash = 'b'.repeat(64);
|
|
365
|
+
// Encode a PackageObject referencing the task
|
|
366
|
+
const pkgEncoder = encodeBeast2For(PackageObjectType);
|
|
367
|
+
const pkgData = pkgEncoder({
|
|
368
|
+
tasks: new Map([['myTask', taskHash]]),
|
|
369
|
+
data: {
|
|
370
|
+
structure: variant('struct', new Map()),
|
|
371
|
+
refs: new Map(),
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
const pkgHash = 'a'.repeat(64);
|
|
375
|
+
const objects = new Map();
|
|
376
|
+
objects.set(pkgHash, pkgData);
|
|
377
|
+
objects.set(taskHash, taskData);
|
|
378
|
+
// irHash is NOT in the object store — it is a leaf
|
|
379
|
+
const readObject = async (hash) => objects.get(hash) ?? null;
|
|
380
|
+
const reachable = await markReachable(readObject, new Set([pkgHash]));
|
|
381
|
+
// Package (read) + task (read) + IR leaf (not read)
|
|
382
|
+
assert.ok(reachable.has(pkgHash), 'package should be reachable');
|
|
383
|
+
assert.ok(reachable.has(taskHash), 'task should be reachable');
|
|
384
|
+
assert.ok(reachable.has(irHash), 'IR leaf should be reachable (marked without reading)');
|
|
385
|
+
assert.strictEqual(reachable.size, 3);
|
|
386
|
+
});
|
|
387
|
+
it('follows TreeObject DataRef children', async () => {
|
|
388
|
+
const subtreeHash = 'b'.repeat(64);
|
|
389
|
+
const valueHash = 'c'.repeat(64);
|
|
390
|
+
// Encode a tree with both a tree ref and a value ref
|
|
391
|
+
const treeType = makeTreeType(['subtree', 'leaf']);
|
|
392
|
+
const treeEncoder = encodeBeast2For(treeType);
|
|
393
|
+
const treeData = treeEncoder({
|
|
394
|
+
subtree: variant('tree', subtreeHash),
|
|
395
|
+
leaf: variant('value', valueHash),
|
|
396
|
+
});
|
|
397
|
+
const treeHash = 'a'.repeat(64);
|
|
398
|
+
const objects = new Map();
|
|
399
|
+
objects.set(treeHash, treeData);
|
|
400
|
+
// subtreeHash and valueHash not in store
|
|
401
|
+
const readObject = async (hash) => objects.get(hash) ?? null;
|
|
402
|
+
const reachable = await markReachable(readObject, new Set([treeHash]));
|
|
403
|
+
assert.ok(reachable.has(treeHash), 'tree should be reachable');
|
|
404
|
+
assert.ok(reachable.has(valueHash), 'value leaf should be reachable (marked without reading)');
|
|
405
|
+
// subtreeHash pushed to stack, readObject returns null
|
|
406
|
+
assert.ok(!reachable.has(subtreeHash), 'subtree should not be reachable when object is missing');
|
|
407
|
+
assert.strictEqual(reachable.size, 2);
|
|
408
|
+
});
|
|
409
|
+
it('skips unassigned and null DataRefs', async () => {
|
|
410
|
+
// Tree with only unassigned/null refs — no children to follow
|
|
411
|
+
const treeType = makeTreeType(['pending', 'empty']);
|
|
412
|
+
const treeEncoder = encodeBeast2For(treeType);
|
|
413
|
+
const treeData = treeEncoder({
|
|
414
|
+
pending: variant('unassigned', null),
|
|
415
|
+
empty: variant('null', null),
|
|
416
|
+
});
|
|
417
|
+
const treeHash = 'a'.repeat(64);
|
|
418
|
+
const objects = new Map();
|
|
419
|
+
objects.set(treeHash, treeData);
|
|
420
|
+
const readObject = async (hash) => objects.get(hash) ?? null;
|
|
421
|
+
const reachable = await markReachable(readObject, new Set([treeHash]));
|
|
422
|
+
assert.strictEqual(reachable.size, 1); // Only the tree itself
|
|
423
|
+
assert.ok(reachable.has(treeHash));
|
|
424
|
+
});
|
|
425
|
+
it('handles non-BEAST2 data gracefully', async () => {
|
|
426
|
+
const hashA = 'a'.repeat(64);
|
|
427
|
+
const objects = new Map();
|
|
428
|
+
objects.set(hashA, new Uint8Array([1, 2, 3, 4, 5])); // Not BEAST2
|
|
429
|
+
const readObject = async (hash) => objects.get(hash) ?? null;
|
|
430
|
+
const reachable = await markReachable(readObject, new Set([hashA]));
|
|
431
|
+
// Object is reachable but treated as leaf (no children)
|
|
432
|
+
assert.strictEqual(reachable.size, 1);
|
|
433
|
+
assert.ok(reachable.has(hashA));
|
|
434
|
+
});
|
|
435
|
+
it('handles missing objects gracefully', async () => {
|
|
436
|
+
const hashA = 'a'.repeat(64);
|
|
437
|
+
const readObject = async (_hash) => null;
|
|
438
|
+
const reachable = await markReachable(readObject, new Set([hashA]));
|
|
439
|
+
// Root was not reachable because the object doesn't exist
|
|
440
|
+
assert.strictEqual(reachable.size, 0);
|
|
441
|
+
});
|
|
442
|
+
it('handles DAG deduplication (shared objects)', async () => {
|
|
443
|
+
// Two trees both reference the same value
|
|
444
|
+
const sharedValueHash = 'c'.repeat(64);
|
|
445
|
+
const treeType = makeTreeType(['data']);
|
|
446
|
+
const treeEncoder = encodeBeast2For(treeType);
|
|
447
|
+
const tree1Data = treeEncoder({ data: variant('value', sharedValueHash) });
|
|
448
|
+
const tree1Hash = 'a'.repeat(64);
|
|
449
|
+
const tree2Data = treeEncoder({ data: variant('value', sharedValueHash) });
|
|
450
|
+
const tree2Hash = 'b'.repeat(64);
|
|
451
|
+
const objects = new Map();
|
|
452
|
+
objects.set(tree1Hash, tree1Data);
|
|
453
|
+
objects.set(tree2Hash, tree2Data);
|
|
454
|
+
const readObject = async (hash) => objects.get(hash) ?? null;
|
|
455
|
+
const reachable = await markReachable(readObject, new Set([tree1Hash, tree2Hash]));
|
|
456
|
+
assert.strictEqual(reachable.size, 3); // tree1, tree2, shared value
|
|
457
|
+
assert.ok(reachable.has(sharedValueHash));
|
|
458
|
+
});
|
|
459
|
+
it('marks value leaves without reading them', async () => {
|
|
460
|
+
const valueHash = 'b'.repeat(64);
|
|
461
|
+
const treeType = makeTreeType(['data']);
|
|
462
|
+
const treeEncoder = encodeBeast2For(treeType);
|
|
463
|
+
const treeData = treeEncoder({ data: variant('value', valueHash) });
|
|
464
|
+
const treeHash = 'a'.repeat(64);
|
|
465
|
+
const readCalls = [];
|
|
466
|
+
const objects = new Map();
|
|
467
|
+
objects.set(treeHash, treeData);
|
|
468
|
+
objects.set(valueHash, new Uint8Array([99])); // exists but should not be read
|
|
469
|
+
const readObject = async (hash) => {
|
|
470
|
+
readCalls.push(hash);
|
|
471
|
+
return objects.get(hash) ?? null;
|
|
472
|
+
};
|
|
473
|
+
const reachable = await markReachable(readObject, new Set([treeHash]));
|
|
474
|
+
assert.ok(reachable.has(valueHash), 'value should be reachable');
|
|
475
|
+
assert.ok(!readCalls.includes(valueHash), 'value hash should NOT have been read');
|
|
476
|
+
assert.ok(readCalls.includes(treeHash), 'tree hash should have been read');
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
describe('sweepBatch', () => {
|
|
480
|
+
it('marks unreachable old objects for deletion', () => {
|
|
481
|
+
const objects = [
|
|
482
|
+
{ hash: 'a'.repeat(64), lastModified: 0, size: 100 },
|
|
483
|
+
{ hash: 'b'.repeat(64), lastModified: 0, size: 200 },
|
|
484
|
+
];
|
|
485
|
+
const reachable = new Set();
|
|
486
|
+
const result = sweepBatch(objects, reachable, 0);
|
|
487
|
+
assert.strictEqual(result.toDelete.length, 2);
|
|
488
|
+
assert.strictEqual(result.retained, 0);
|
|
489
|
+
assert.strictEqual(result.bytesFreed, 300);
|
|
490
|
+
});
|
|
491
|
+
it('retains reachable objects', () => {
|
|
492
|
+
const hashA = 'a'.repeat(64);
|
|
493
|
+
const objects = [
|
|
494
|
+
{ hash: hashA, lastModified: 0, size: 100 },
|
|
495
|
+
];
|
|
496
|
+
const reachable = new Set([hashA]);
|
|
497
|
+
const result = sweepBatch(objects, reachable, 0);
|
|
498
|
+
assert.strictEqual(result.toDelete.length, 0);
|
|
499
|
+
assert.strictEqual(result.retained, 1);
|
|
500
|
+
});
|
|
501
|
+
it('skips young objects', () => {
|
|
502
|
+
const objects = [
|
|
503
|
+
{ hash: 'a'.repeat(64), lastModified: Date.now(), size: 100 },
|
|
504
|
+
];
|
|
505
|
+
const reachable = new Set();
|
|
506
|
+
const result = sweepBatch(objects, reachable, 60000);
|
|
507
|
+
assert.strictEqual(result.toDelete.length, 0);
|
|
508
|
+
assert.strictEqual(result.skippedYoung, 1);
|
|
509
|
+
});
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
//# sourceMappingURL=gc.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gc.spec.js","sourceRoot":"","sources":["../../src/gc.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -9,17 +9,27 @@
|
|
|
9
9
|
* similar to libgit2 for git. It has no UI dependencies and can be
|
|
10
10
|
* used programmatically.
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
12
|
+
export * from './storage/index.js';
|
|
13
|
+
export * from './execution/index.js';
|
|
14
|
+
export { repoInit, repoFind, repoGet, type InitRepositoryResult, } from './storage/local/repository.js';
|
|
15
|
+
export { repoGc, collectAllRoots, markReachable, sweepBatch, type GcOptions, type GcResult, type SweepBatchResult, } from './storage/local/gc.js';
|
|
16
|
+
export { computeHash, BEAST2_CONTENT_TYPE } from './objects.js';
|
|
17
|
+
export { objectWrite, objectWriteStream, objectRead, objectExists, } from './storage/local/LocalObjectStore.js';
|
|
18
|
+
export { objectPath, objectAbbrev } from './storage/local/localHelpers.js';
|
|
19
|
+
export { packageImport, packageExport, packageRemove, packageList, packageGetLatestVersion, packageResolve, packageRead, type PackageImportResult, type PackageImportOptions, type PackageExportResult, } from './packages.js';
|
|
20
|
+
export { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceGetPackage, workspaceDeploy, workspaceExport, type WorkspaceExportResult, type WorkspaceRemoveOptions, type WorkspaceDeployOptions, } from './workspaces.js';
|
|
17
21
|
export { treeRead, treeWrite, datasetRead, datasetWrite, type TreeObject, } from './trees.js';
|
|
18
|
-
export { packageListTree,
|
|
22
|
+
export { packageListTree, workspaceListTree, workspaceGetDataset, workspaceGetDatasetHash, workspaceGetDatasetStatus, workspaceSetDataset, workspaceSetDatasetByHash, workspaceGetTree, type DatasetStatusResult, type WorkspaceSetDatasetOptions, type WorkspaceGetTreeOptions, type TreeNode, type TreeBranchNode, type TreeLeafNode, } from './trees.js';
|
|
19
23
|
export { packageListTasks, packageGetTask, workspaceListTasks, workspaceGetTask, workspaceGetTaskHash, } from './tasks.js';
|
|
20
|
-
export { inputsHash,
|
|
21
|
-
export {
|
|
22
|
-
export {
|
|
24
|
+
export { inputsHash, executionGet, executionGetLatest, executionGetOutput, executionListIds, executionListForTask, executionList, executionFindCurrent, type CurrentExecutionRef, executionReadLog, type LogReadOptions, evaluateCommandIr, } from './executions.js';
|
|
25
|
+
export { uuidv7, uuidv7Timestamp, isUuidv7 } from './uuid.js';
|
|
26
|
+
export { taskExecute, type ExecuteOptions, type ExecutionResult, } from './execution/LocalTaskRunner.js';
|
|
27
|
+
export { getBootId, getPidStartTime, isProcessAlive, } from './execution/processHelpers.js';
|
|
28
|
+
export { dataflowExecute, dataflowStart, dataflowGetGraph, dataflowGetReadyTasks, dataflowCheckCache, dataflowGetDependentsToSkip, dataflowResolveInputHashes, findAffectedTasks, parsePathString, type DataflowGraph, type DataflowOptions, type DataflowResult, type TaskExecutionResult, } from './dataflow.js';
|
|
29
|
+
export { type DataflowExecutionState, type DataflowExecutionStatus, type TaskState, type TaskStatus as DataflowTaskStatus, type ExecutionEvent, type DataflowGraph as DataflowGraphType, type DataflowGraphTask as DataflowGraphTaskType, type InitializeResult, type PrepareTaskResult, type TaskExecuteResult, type TaskCompletedResult, type TaskFailedResult, type FinalizeResult, stepInitialize, stepGetReady, stepPrepareTask, stepTaskStarted, stepTaskCompleted, stepTaskFailed, stepTasksSkipped, stepIsComplete, stepFinalize, stepCancel, stepApplyTreeUpdate, stepDetectInputChanges, stepInvalidateTasks, stepCheckVersionConsistency, type StepInitializeOptions, type ExecutionStateStore, type TaskStatusDetails, type ExecutionStatusDetails, InMemoryStateStore, FileStateStore, type DataflowOrchestrator, type ExecutionHandle, type ExecutionStatus as OrchestratorExecutionStatus, type OrchestratorStartOptions, type TaskCompletedCallback, LocalOrchestrator, stateToStatus, type ApiDataflowEventType, type ApiDataflowEvent, type ApiExecutionStatus, type ApiExecutionSummary, type ApiExecutionState, coreEventToApiEvent, coreStatusToApiStatus, coreStateToApiState, } from './dataflow/index.js';
|
|
30
|
+
export { acquireWorkspaceLock, getWorkspaceLockState, getWorkspaceLockHolder, lockStateToHolderInfo, isLockHolderAlive, workspaceLockPath, type WorkspaceLockHandle, type AcquireLockOptions, } from './storage/local/LocalLockService.js';
|
|
23
31
|
export { workspaceStatus, type DatasetStatus, type TaskStatus, type DatasetStatusInfo, type TaskStatusInfo, type WorkspaceStatusResult, } from './workspaceStatus.js';
|
|
24
|
-
export {
|
|
32
|
+
export { checkVersionConsistency, mergeVersionVectors, inputVersionVector, keypathToRefPath, refPathToKeypath, snapshotInputVersions, detectInputChanges, computeRootHash, writeRefsFromTree, writeRefsFromPackage, } from './dataset-refs.js';
|
|
33
|
+
export { E3Error, RepoNotFoundError, RepoAlreadyExistsError, RepoStatusConflictError, WorkspaceNotFoundError, WorkspaceNotDeployedError, WorkspaceExistsError, WorkspaceLockError, type LockHolderInfo, PackageNotFoundError, PackageInvalidError, PackageExistsError, DatasetNotFoundError, TaskNotFoundError, ObjectNotFoundError, ObjectCorruptError, ExecutionCorruptError, ExecutionNotFoundError, DataflowError, DataflowAbortedError, PermissionDeniedError, isNotFoundError, isPermissionError, isExistsError, wrapError, } from './errors.js';
|
|
34
|
+
export * from './transfer/index.js';
|
|
25
35
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|