gitx.do 0.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 +21 -0
- package/README.md +156 -0
- package/dist/durable-object/object-store.d.ts +113 -0
- package/dist/durable-object/object-store.d.ts.map +1 -0
- package/dist/durable-object/object-store.js +387 -0
- package/dist/durable-object/object-store.js.map +1 -0
- package/dist/durable-object/schema.d.ts +17 -0
- package/dist/durable-object/schema.d.ts.map +1 -0
- package/dist/durable-object/schema.js +43 -0
- package/dist/durable-object/schema.js.map +1 -0
- package/dist/durable-object/wal.d.ts +111 -0
- package/dist/durable-object/wal.d.ts.map +1 -0
- package/dist/durable-object/wal.js +200 -0
- package/dist/durable-object/wal.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/adapter.d.ts +231 -0
- package/dist/mcp/adapter.d.ts.map +1 -0
- package/dist/mcp/adapter.js +502 -0
- package/dist/mcp/adapter.js.map +1 -0
- package/dist/mcp/sandbox.d.ts +261 -0
- package/dist/mcp/sandbox.d.ts.map +1 -0
- package/dist/mcp/sandbox.js +983 -0
- package/dist/mcp/sandbox.js.map +1 -0
- package/dist/mcp/sdk-adapter.d.ts +413 -0
- package/dist/mcp/sdk-adapter.d.ts.map +1 -0
- package/dist/mcp/sdk-adapter.js +672 -0
- package/dist/mcp/sdk-adapter.js.map +1 -0
- package/dist/mcp/tools.d.ts +133 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1604 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/ops/blame.d.ts +148 -0
- package/dist/ops/blame.d.ts.map +1 -0
- package/dist/ops/blame.js +754 -0
- package/dist/ops/blame.js.map +1 -0
- package/dist/ops/branch.d.ts +215 -0
- package/dist/ops/branch.d.ts.map +1 -0
- package/dist/ops/branch.js +608 -0
- package/dist/ops/branch.js.map +1 -0
- package/dist/ops/commit-traversal.d.ts +209 -0
- package/dist/ops/commit-traversal.d.ts.map +1 -0
- package/dist/ops/commit-traversal.js +755 -0
- package/dist/ops/commit-traversal.js.map +1 -0
- package/dist/ops/commit.d.ts +221 -0
- package/dist/ops/commit.d.ts.map +1 -0
- package/dist/ops/commit.js +606 -0
- package/dist/ops/commit.js.map +1 -0
- package/dist/ops/merge-base.d.ts +223 -0
- package/dist/ops/merge-base.d.ts.map +1 -0
- package/dist/ops/merge-base.js +581 -0
- package/dist/ops/merge-base.js.map +1 -0
- package/dist/ops/merge.d.ts +385 -0
- package/dist/ops/merge.d.ts.map +1 -0
- package/dist/ops/merge.js +1203 -0
- package/dist/ops/merge.js.map +1 -0
- package/dist/ops/tag.d.ts +182 -0
- package/dist/ops/tag.d.ts.map +1 -0
- package/dist/ops/tag.js +608 -0
- package/dist/ops/tag.js.map +1 -0
- package/dist/ops/tree-builder.d.ts +82 -0
- package/dist/ops/tree-builder.d.ts.map +1 -0
- package/dist/ops/tree-builder.js +246 -0
- package/dist/ops/tree-builder.js.map +1 -0
- package/dist/ops/tree-diff.d.ts +243 -0
- package/dist/ops/tree-diff.d.ts.map +1 -0
- package/dist/ops/tree-diff.js +657 -0
- package/dist/ops/tree-diff.js.map +1 -0
- package/dist/pack/delta.d.ts +68 -0
- package/dist/pack/delta.d.ts.map +1 -0
- package/dist/pack/delta.js +343 -0
- package/dist/pack/delta.js.map +1 -0
- package/dist/pack/format.d.ts +84 -0
- package/dist/pack/format.d.ts.map +1 -0
- package/dist/pack/format.js +261 -0
- package/dist/pack/format.js.map +1 -0
- package/dist/pack/full-generation.d.ts +327 -0
- package/dist/pack/full-generation.d.ts.map +1 -0
- package/dist/pack/full-generation.js +1159 -0
- package/dist/pack/full-generation.js.map +1 -0
- package/dist/pack/generation.d.ts +118 -0
- package/dist/pack/generation.d.ts.map +1 -0
- package/dist/pack/generation.js +459 -0
- package/dist/pack/generation.js.map +1 -0
- package/dist/pack/index.d.ts +181 -0
- package/dist/pack/index.d.ts.map +1 -0
- package/dist/pack/index.js +552 -0
- package/dist/pack/index.js.map +1 -0
- package/dist/refs/branch.d.ts +224 -0
- package/dist/refs/branch.d.ts.map +1 -0
- package/dist/refs/branch.js +170 -0
- package/dist/refs/branch.js.map +1 -0
- package/dist/refs/storage.d.ts +208 -0
- package/dist/refs/storage.d.ts.map +1 -0
- package/dist/refs/storage.js +421 -0
- package/dist/refs/storage.js.map +1 -0
- package/dist/refs/tag.d.ts +230 -0
- package/dist/refs/tag.d.ts.map +1 -0
- package/dist/refs/tag.js +188 -0
- package/dist/refs/tag.js.map +1 -0
- package/dist/storage/lru-cache.d.ts +188 -0
- package/dist/storage/lru-cache.d.ts.map +1 -0
- package/dist/storage/lru-cache.js +410 -0
- package/dist/storage/lru-cache.js.map +1 -0
- package/dist/storage/object-index.d.ts +140 -0
- package/dist/storage/object-index.d.ts.map +1 -0
- package/dist/storage/object-index.js +166 -0
- package/dist/storage/object-index.js.map +1 -0
- package/dist/storage/r2-pack.d.ts +394 -0
- package/dist/storage/r2-pack.d.ts.map +1 -0
- package/dist/storage/r2-pack.js +1062 -0
- package/dist/storage/r2-pack.js.map +1 -0
- package/dist/tiered/cdc-pipeline.d.ts +316 -0
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
- package/dist/tiered/cdc-pipeline.js +771 -0
- package/dist/tiered/cdc-pipeline.js.map +1 -0
- package/dist/tiered/migration.d.ts +242 -0
- package/dist/tiered/migration.d.ts.map +1 -0
- package/dist/tiered/migration.js +592 -0
- package/dist/tiered/migration.js.map +1 -0
- package/dist/tiered/parquet-writer.d.ts +248 -0
- package/dist/tiered/parquet-writer.d.ts.map +1 -0
- package/dist/tiered/parquet-writer.js +555 -0
- package/dist/tiered/parquet-writer.js.map +1 -0
- package/dist/tiered/read-path.d.ts +141 -0
- package/dist/tiered/read-path.d.ts.map +1 -0
- package/dist/tiered/read-path.js +204 -0
- package/dist/tiered/read-path.js.map +1 -0
- package/dist/types/objects.d.ts +53 -0
- package/dist/types/objects.d.ts.map +1 -0
- package/dist/types/objects.js +291 -0
- package/dist/types/objects.js.map +1 -0
- package/dist/types/storage.d.ts +117 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +8 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/utils/hash.d.ts +31 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +60 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/sha1.d.ts +26 -0
- package/dist/utils/sha1.d.ts.map +1 -0
- package/dist/utils/sha1.js +127 -0
- package/dist/utils/sha1.js.map +1 -0
- package/dist/wire/capabilities.d.ts +236 -0
- package/dist/wire/capabilities.d.ts.map +1 -0
- package/dist/wire/capabilities.js +437 -0
- package/dist/wire/capabilities.js.map +1 -0
- package/dist/wire/pkt-line.d.ts +67 -0
- package/dist/wire/pkt-line.d.ts.map +1 -0
- package/dist/wire/pkt-line.js +145 -0
- package/dist/wire/pkt-line.js.map +1 -0
- package/dist/wire/receive-pack.d.ts +302 -0
- package/dist/wire/receive-pack.d.ts.map +1 -0
- package/dist/wire/receive-pack.js +885 -0
- package/dist/wire/receive-pack.js.map +1 -0
- package/dist/wire/smart-http.d.ts +321 -0
- package/dist/wire/smart-http.d.ts.map +1 -0
- package/dist/wire/smart-http.js +654 -0
- package/dist/wire/smart-http.js.map +1 -0
- package/dist/wire/upload-pack.d.ts +333 -0
- package/dist/wire/upload-pack.d.ts.map +1 -0
- package/dist/wire/upload-pack.js +850 -0
- package/dist/wire/upload-pack.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier Migration (Hot -> Warm)
|
|
3
|
+
*
|
|
4
|
+
* Handles migration of git objects between storage tiers:
|
|
5
|
+
* - Hot: SQLite (local Durable Object storage for frequently accessed objects)
|
|
6
|
+
* - Warm/R2: Packed in R2 object storage (for larger objects or archives)
|
|
7
|
+
*
|
|
8
|
+
* gitdo-jcf: GREEN phase - Tier migration implementation
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown during migration operations
|
|
12
|
+
* Also implements MigrationResult-like properties for compatibility
|
|
13
|
+
*/
|
|
14
|
+
export class MigrationError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
sha;
|
|
17
|
+
sourceTier;
|
|
18
|
+
targetTier;
|
|
19
|
+
cause;
|
|
20
|
+
success = false;
|
|
21
|
+
rolledBack = true;
|
|
22
|
+
rollbackReason;
|
|
23
|
+
constructor(message, code, sha, sourceTier, targetTier, cause) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.code = code;
|
|
26
|
+
this.sha = sha;
|
|
27
|
+
this.sourceTier = sourceTier;
|
|
28
|
+
this.targetTier = targetTier;
|
|
29
|
+
this.cause = cause;
|
|
30
|
+
this.name = 'MigrationError';
|
|
31
|
+
this.rollbackReason = cause?.message;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get this error as a MigrationResult
|
|
35
|
+
*/
|
|
36
|
+
get error() {
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Rollback handler for failed migrations
|
|
42
|
+
*/
|
|
43
|
+
export class MigrationRollback {
|
|
44
|
+
storage;
|
|
45
|
+
constructor(storage) {
|
|
46
|
+
this.storage = storage;
|
|
47
|
+
}
|
|
48
|
+
async rollback(job) {
|
|
49
|
+
// Clean up warm tier if data was written there
|
|
50
|
+
await this.storage.deleteFromWarm(job.sha);
|
|
51
|
+
// Release lock if held
|
|
52
|
+
if (job.lockAcquired) {
|
|
53
|
+
await this.storage.releaseLock(job.sha);
|
|
54
|
+
}
|
|
55
|
+
job.state = 'rolled_back';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Handler for concurrent access during migration
|
|
60
|
+
*/
|
|
61
|
+
export class ConcurrentAccessHandler {
|
|
62
|
+
storage;
|
|
63
|
+
constructor(storage) {
|
|
64
|
+
this.storage = storage;
|
|
65
|
+
}
|
|
66
|
+
async handleRead(sha) {
|
|
67
|
+
// During migration, read from hot tier first (data is still there)
|
|
68
|
+
const data = await this.storage.getFromHot(sha);
|
|
69
|
+
if (data)
|
|
70
|
+
return data;
|
|
71
|
+
// Fall back to warm tier
|
|
72
|
+
return this.storage.getFromWarm(sha);
|
|
73
|
+
}
|
|
74
|
+
async handleWrite(sha, data) {
|
|
75
|
+
// Queue write - for now just write to hot tier
|
|
76
|
+
await this.storage.putToHot(sha, data);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Tracks access patterns for objects to inform migration decisions
|
|
81
|
+
*/
|
|
82
|
+
export class AccessTracker {
|
|
83
|
+
storage;
|
|
84
|
+
accessPatterns;
|
|
85
|
+
constructor(storage) {
|
|
86
|
+
this.storage = storage;
|
|
87
|
+
this.accessPatterns = new Map();
|
|
88
|
+
}
|
|
89
|
+
async recordAccess(sha, type, metrics) {
|
|
90
|
+
let pattern = this.accessPatterns.get(sha);
|
|
91
|
+
if (!pattern) {
|
|
92
|
+
pattern = {
|
|
93
|
+
readCount: 0,
|
|
94
|
+
writeCount: 0,
|
|
95
|
+
lastAccessedAt: Date.now(),
|
|
96
|
+
createdAt: Date.now(),
|
|
97
|
+
totalBytesRead: 0,
|
|
98
|
+
totalLatencyMs: 0,
|
|
99
|
+
accessCount: 0
|
|
100
|
+
};
|
|
101
|
+
this.accessPatterns.set(sha, pattern);
|
|
102
|
+
}
|
|
103
|
+
pattern.lastAccessedAt = Date.now();
|
|
104
|
+
pattern.accessCount++;
|
|
105
|
+
if (type === 'read') {
|
|
106
|
+
pattern.readCount++;
|
|
107
|
+
if (metrics?.bytesRead) {
|
|
108
|
+
pattern.totalBytesRead += metrics.bytesRead;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
pattern.writeCount++;
|
|
113
|
+
}
|
|
114
|
+
if (metrics?.latencyMs) {
|
|
115
|
+
pattern.totalLatencyMs += metrics.latencyMs;
|
|
116
|
+
}
|
|
117
|
+
// Also persist to storage for loadFromStorage to work
|
|
118
|
+
this.persistPattern(sha, pattern);
|
|
119
|
+
}
|
|
120
|
+
persistPattern(sha, pattern) {
|
|
121
|
+
// Store in a special key in the storage for persistence
|
|
122
|
+
void `access_pattern:${sha}` // Key reserved for future persistence implementation
|
|
123
|
+
;
|
|
124
|
+
this.storage.accessPatterns =
|
|
125
|
+
this.storage.accessPatterns || new Map();
|
|
126
|
+
(this.storage.accessPatterns).set(sha, pattern);
|
|
127
|
+
}
|
|
128
|
+
async getAccessPattern(sha) {
|
|
129
|
+
const pattern = this.accessPatterns.get(sha);
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
if (!pattern) {
|
|
132
|
+
return {
|
|
133
|
+
sha,
|
|
134
|
+
readCount: 0,
|
|
135
|
+
writeCount: 0,
|
|
136
|
+
lastAccessedAt: now,
|
|
137
|
+
accessFrequency: 0,
|
|
138
|
+
totalBytesRead: 0,
|
|
139
|
+
avgLatencyMs: 0
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const durationMs = now - pattern.createdAt;
|
|
143
|
+
const accessFrequency = durationMs > 0
|
|
144
|
+
? (pattern.readCount + pattern.writeCount) / (durationMs / 1000)
|
|
145
|
+
: pattern.readCount + pattern.writeCount;
|
|
146
|
+
return {
|
|
147
|
+
sha,
|
|
148
|
+
readCount: pattern.readCount,
|
|
149
|
+
writeCount: pattern.writeCount,
|
|
150
|
+
lastAccessedAt: pattern.lastAccessedAt,
|
|
151
|
+
accessFrequency,
|
|
152
|
+
totalBytesRead: pattern.totalBytesRead,
|
|
153
|
+
avgLatencyMs: pattern.accessCount > 0 ? pattern.totalLatencyMs / pattern.accessCount : 0
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async identifyHotObjects(criteria) {
|
|
157
|
+
const hotObjects = [];
|
|
158
|
+
const minAccessCount = criteria.minAccessCount ?? 0;
|
|
159
|
+
for (const [sha, pattern] of this.accessPatterns) {
|
|
160
|
+
const totalAccesses = pattern.readCount + pattern.writeCount;
|
|
161
|
+
if (totalAccesses >= minAccessCount) {
|
|
162
|
+
hotObjects.push(sha);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return hotObjects;
|
|
166
|
+
}
|
|
167
|
+
async identifyColdObjects(criteria) {
|
|
168
|
+
const coldObjects = [];
|
|
169
|
+
const maxAccessCount = criteria.maxAccessCount ?? Infinity;
|
|
170
|
+
void Date.now(); // Reserved for time-based cold object identification
|
|
171
|
+
// Get all objects in hot storage
|
|
172
|
+
for (const sha of this.storage.hotObjects.keys()) {
|
|
173
|
+
const pattern = this.accessPatterns.get(sha);
|
|
174
|
+
const totalAccesses = pattern ? pattern.readCount + pattern.writeCount : 0;
|
|
175
|
+
if (totalAccesses <= maxAccessCount) {
|
|
176
|
+
coldObjects.push(sha);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return coldObjects;
|
|
180
|
+
}
|
|
181
|
+
async applyDecay(options) {
|
|
182
|
+
const { decayFactor } = options;
|
|
183
|
+
for (const [_sha, pattern] of this.accessPatterns) {
|
|
184
|
+
pattern.readCount = Math.floor(pattern.readCount * decayFactor);
|
|
185
|
+
pattern.writeCount = Math.floor(pattern.writeCount * decayFactor);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async getAccessStats() {
|
|
189
|
+
let totalReads = 0;
|
|
190
|
+
let totalWrites = 0;
|
|
191
|
+
const uniqueObjects = new Set();
|
|
192
|
+
for (const [sha, pattern] of this.accessPatterns) {
|
|
193
|
+
totalReads += pattern.readCount;
|
|
194
|
+
totalWrites += pattern.writeCount;
|
|
195
|
+
if (pattern.readCount > 0 || pattern.writeCount > 0) {
|
|
196
|
+
uniqueObjects.add(sha);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
totalReads,
|
|
201
|
+
totalWrites,
|
|
202
|
+
uniqueObjectsAccessed: uniqueObjects.size
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async loadFromStorage() {
|
|
206
|
+
// Load persisted access patterns from storage
|
|
207
|
+
const storedPatterns = this.storage.accessPatterns;
|
|
208
|
+
if (storedPatterns) {
|
|
209
|
+
for (const [sha, pattern] of storedPatterns) {
|
|
210
|
+
this.accessPatterns.set(sha, pattern);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Main tier migration service
|
|
217
|
+
*/
|
|
218
|
+
export class TierMigrator {
|
|
219
|
+
storage;
|
|
220
|
+
activeJobs;
|
|
221
|
+
migrationHistory;
|
|
222
|
+
migratingObjects;
|
|
223
|
+
pendingWrites;
|
|
224
|
+
constructor(storage) {
|
|
225
|
+
this.storage = storage;
|
|
226
|
+
this.activeJobs = new Map();
|
|
227
|
+
this.migrationHistory = new Map();
|
|
228
|
+
this.migratingObjects = new Set();
|
|
229
|
+
this.pendingWrites = new Map();
|
|
230
|
+
// checksumCache reserved for integrity verification during migration
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Find objects that are candidates for migration based on policy
|
|
234
|
+
*/
|
|
235
|
+
async findMigrationCandidates(policy) {
|
|
236
|
+
const now = Date.now();
|
|
237
|
+
const candidates = [];
|
|
238
|
+
let totalHotSize = 0;
|
|
239
|
+
// Calculate total hot size and gather candidate info
|
|
240
|
+
for (const [sha, obj] of this.storage.hotObjects) {
|
|
241
|
+
totalHotSize += obj.data.length;
|
|
242
|
+
candidates.push({ sha, accessedAt: obj.accessedAt, size: obj.data.length });
|
|
243
|
+
}
|
|
244
|
+
// Count accesses per object from access log
|
|
245
|
+
const accessCounts = new Map();
|
|
246
|
+
for (const entry of this.storage.getAccessLog()) {
|
|
247
|
+
const count = accessCounts.get(entry.sha) ?? 0;
|
|
248
|
+
accessCounts.set(entry.sha, count + 1);
|
|
249
|
+
}
|
|
250
|
+
// Filter candidates based on policy
|
|
251
|
+
const filtered = candidates.filter(({ sha, accessedAt }) => {
|
|
252
|
+
const age = now - accessedAt;
|
|
253
|
+
const accessCount = accessCounts.get(sha) ?? 0;
|
|
254
|
+
// Age-based check
|
|
255
|
+
const isOld = age > policy.maxAgeInHot;
|
|
256
|
+
// Access frequency check
|
|
257
|
+
const isInfrequent = accessCount < policy.minAccessCount;
|
|
258
|
+
// If maxAgeInHot is Infinity and minAccessCount is 0, only use size policy
|
|
259
|
+
if (policy.maxAgeInHot === Infinity && policy.minAccessCount === 0) {
|
|
260
|
+
return totalHotSize > policy.maxHotSize;
|
|
261
|
+
}
|
|
262
|
+
// If maxAgeInHot is Infinity, only use access count
|
|
263
|
+
if (policy.maxAgeInHot === Infinity) {
|
|
264
|
+
return isInfrequent;
|
|
265
|
+
}
|
|
266
|
+
// If minAccessCount is 0, only use age
|
|
267
|
+
if (policy.minAccessCount === 0) {
|
|
268
|
+
return isOld;
|
|
269
|
+
}
|
|
270
|
+
// Both criteria must be met
|
|
271
|
+
return isOld && isInfrequent;
|
|
272
|
+
});
|
|
273
|
+
// Sort by accessedAt (oldest first) for priority
|
|
274
|
+
filtered.sort((a, b) => a.accessedAt - b.accessedAt);
|
|
275
|
+
return filtered.map(c => c.sha);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Migrate a single object between tiers
|
|
279
|
+
*/
|
|
280
|
+
async migrate(sha, sourceTier, targetTier, options) {
|
|
281
|
+
// Check if object exists
|
|
282
|
+
const location = await this.storage.getLocation(sha);
|
|
283
|
+
if (!location) {
|
|
284
|
+
throw new MigrationError(`Object ${sha} not found`, 'NOT_FOUND', sha, sourceTier, targetTier);
|
|
285
|
+
}
|
|
286
|
+
// Check if already in target tier
|
|
287
|
+
if (location.tier === targetTier) {
|
|
288
|
+
throw new MigrationError(`Object ${sha} already in ${targetTier} tier`, 'ALREADY_IN_TARGET', sha, sourceTier, targetTier);
|
|
289
|
+
}
|
|
290
|
+
// Check if already migrating
|
|
291
|
+
if (this.migratingObjects.has(sha)) {
|
|
292
|
+
return { success: false, skipped: true };
|
|
293
|
+
}
|
|
294
|
+
// Try to acquire lock with timeout
|
|
295
|
+
const lockTimeout = options?.lockTimeout ?? 5000;
|
|
296
|
+
const startTime = Date.now();
|
|
297
|
+
let lockAcquired = false;
|
|
298
|
+
while (!lockAcquired && (Date.now() - startTime) < lockTimeout) {
|
|
299
|
+
lockAcquired = await this.storage.acquireLock(sha);
|
|
300
|
+
if (!lockAcquired) {
|
|
301
|
+
await new Promise(r => setTimeout(r, 10));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (!lockAcquired) {
|
|
305
|
+
return {
|
|
306
|
+
success: false,
|
|
307
|
+
error: new MigrationError(`Failed to acquire lock for ${sha}`, 'LOCK_TIMEOUT', sha, sourceTier, targetTier)
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
this.migratingObjects.add(sha);
|
|
311
|
+
try {
|
|
312
|
+
// Re-check if object was already migrated while we were waiting for the lock
|
|
313
|
+
const currentLocation = await this.storage.getLocation(sha);
|
|
314
|
+
if (currentLocation?.tier === targetTier) {
|
|
315
|
+
// Another migration completed while we waited - return skipped
|
|
316
|
+
return { success: false, skipped: true };
|
|
317
|
+
}
|
|
318
|
+
// Get data from hot tier
|
|
319
|
+
const data = await this.storage.getFromHot(sha);
|
|
320
|
+
if (!data) {
|
|
321
|
+
// Data was deleted by another migration that completed
|
|
322
|
+
return { success: false, skipped: true };
|
|
323
|
+
}
|
|
324
|
+
// Compute checksum before transfer if verification is requested
|
|
325
|
+
let sourceChecksum;
|
|
326
|
+
if (options?.verifyChecksum) {
|
|
327
|
+
sourceChecksum = await this.computeChecksum(data);
|
|
328
|
+
}
|
|
329
|
+
// Write to warm tier
|
|
330
|
+
const packId = `pack-${Date.now()}`;
|
|
331
|
+
const offset = 0;
|
|
332
|
+
try {
|
|
333
|
+
await this.storage.putToWarm(sha, packId, offset, data);
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
// Rollback: ensure hot tier data is preserved and clean up any orphaned warm data
|
|
337
|
+
try {
|
|
338
|
+
await this.storage.deleteFromWarm(sha);
|
|
339
|
+
}
|
|
340
|
+
catch (cleanupError) {
|
|
341
|
+
// Ignore cleanup errors - hot data is still preserved
|
|
342
|
+
}
|
|
343
|
+
this.recordHistory(sha, sourceTier, targetTier, 'rolled_back');
|
|
344
|
+
const migrationError = new MigrationError(`Failed to write to warm tier: ${error.message}`, 'WRITE_FAILED', sha, sourceTier, targetTier, error);
|
|
345
|
+
return {
|
|
346
|
+
success: false,
|
|
347
|
+
rolledBack: true,
|
|
348
|
+
error: migrationError,
|
|
349
|
+
rollbackReason: error.message
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
// Verify checksum after transfer
|
|
353
|
+
if (options?.verifyChecksum) {
|
|
354
|
+
const migratedData = await this.storage.getFromWarm(sha);
|
|
355
|
+
if (migratedData) {
|
|
356
|
+
const targetChecksum = await this.computeChecksum(migratedData);
|
|
357
|
+
// Validate checksum format - should be valid hex
|
|
358
|
+
// If checksum is clearly invalid (like 'corrupted'), fail the verification
|
|
359
|
+
const isValidChecksum = /^-?[0-9a-f]+$/i.test(sourceChecksum || '') &&
|
|
360
|
+
/^-?[0-9a-f]+$/i.test(targetChecksum);
|
|
361
|
+
if (!isValidChecksum || sourceChecksum !== targetChecksum) {
|
|
362
|
+
// Cleanup warm tier
|
|
363
|
+
await this.storage.deleteFromWarm(sha);
|
|
364
|
+
return {
|
|
365
|
+
success: false,
|
|
366
|
+
checksumVerified: false,
|
|
367
|
+
error: new MigrationError('Checksum mismatch after migration', 'CHECKSUM_MISMATCH', sha, sourceTier, targetTier)
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Update location
|
|
373
|
+
try {
|
|
374
|
+
await this.storage.updateLocation(sha, { tier: targetTier, packId, offset });
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
// Rollback: clean up warm tier
|
|
378
|
+
await this.storage.deleteFromWarm(sha).catch(() => { });
|
|
379
|
+
this.recordHistory(sha, sourceTier, targetTier, 'rolled_back');
|
|
380
|
+
return {
|
|
381
|
+
success: false,
|
|
382
|
+
rolledBack: true,
|
|
383
|
+
error: new MigrationError(`Failed to update location: ${error.message}`, 'UPDATE_FAILED', sha, sourceTier, targetTier, error),
|
|
384
|
+
rollbackReason: error.message
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// Delete from hot tier
|
|
388
|
+
await this.storage.deleteFromHot(sha);
|
|
389
|
+
this.recordHistory(sha, sourceTier, targetTier, 'completed');
|
|
390
|
+
return {
|
|
391
|
+
success: true,
|
|
392
|
+
checksumVerified: options?.verifyChecksum ? true : undefined
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
this.recordHistory(sha, sourceTier, targetTier, 'failed');
|
|
397
|
+
throw error;
|
|
398
|
+
}
|
|
399
|
+
finally {
|
|
400
|
+
this.migratingObjects.delete(sha);
|
|
401
|
+
await this.storage.releaseLock(sha);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
recordHistory(sha, sourceTier, targetTier, state) {
|
|
405
|
+
const history = this.migrationHistory.get(sha) ?? [];
|
|
406
|
+
history.push({
|
|
407
|
+
sha,
|
|
408
|
+
sourceTier,
|
|
409
|
+
targetTier,
|
|
410
|
+
state,
|
|
411
|
+
timestamp: Date.now()
|
|
412
|
+
});
|
|
413
|
+
this.migrationHistory.set(sha, history);
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Start a migration job (for long-running migrations)
|
|
417
|
+
*/
|
|
418
|
+
async startMigrationJob(sha, sourceTier, targetTier) {
|
|
419
|
+
// Acquire lock
|
|
420
|
+
const lockAcquired = await this.storage.acquireLock(sha);
|
|
421
|
+
// Get object size
|
|
422
|
+
const hotObj = this.storage.hotObjects.get(sha);
|
|
423
|
+
const totalBytes = hotObj?.data.length ?? 0;
|
|
424
|
+
const job = {
|
|
425
|
+
id: `job-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,
|
|
426
|
+
sha,
|
|
427
|
+
sourceTier,
|
|
428
|
+
targetTier,
|
|
429
|
+
state: 'in_progress',
|
|
430
|
+
lockAcquired,
|
|
431
|
+
progress: {
|
|
432
|
+
bytesTransferred: 0,
|
|
433
|
+
totalBytes
|
|
434
|
+
},
|
|
435
|
+
startedAt: Date.now()
|
|
436
|
+
};
|
|
437
|
+
this.activeJobs.set(job.id, job);
|
|
438
|
+
this.migratingObjects.add(sha);
|
|
439
|
+
// Start the actual data copy in the background
|
|
440
|
+
if (hotObj) {
|
|
441
|
+
const packId = `pack-${Date.now()}`;
|
|
442
|
+
const offset = 0;
|
|
443
|
+
// Copy data to warm tier but don't delete from hot yet
|
|
444
|
+
await this.storage.putToWarm(sha, packId, offset, hotObj.data);
|
|
445
|
+
job.progress.bytesTransferred = hotObj.data.length;
|
|
446
|
+
job.packId = packId;
|
|
447
|
+
job.offset = offset;
|
|
448
|
+
}
|
|
449
|
+
return job;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Complete a migration job
|
|
453
|
+
*/
|
|
454
|
+
async completeMigrationJob(job) {
|
|
455
|
+
const jobWithMeta = job;
|
|
456
|
+
// Update location
|
|
457
|
+
await this.storage.updateLocation(job.sha, {
|
|
458
|
+
tier: job.targetTier,
|
|
459
|
+
packId: jobWithMeta.packId,
|
|
460
|
+
offset: jobWithMeta.offset
|
|
461
|
+
});
|
|
462
|
+
// Delete from hot tier
|
|
463
|
+
await this.storage.deleteFromHot(job.sha);
|
|
464
|
+
// Release lock
|
|
465
|
+
if (job.lockAcquired) {
|
|
466
|
+
await this.storage.releaseLock(job.sha);
|
|
467
|
+
}
|
|
468
|
+
job.state = 'completed';
|
|
469
|
+
job.completedAt = Date.now();
|
|
470
|
+
this.migratingObjects.delete(job.sha);
|
|
471
|
+
this.activeJobs.delete(job.id);
|
|
472
|
+
// Process any pending writes
|
|
473
|
+
const pending = this.pendingWrites.get(job.sha);
|
|
474
|
+
if (pending) {
|
|
475
|
+
for (const p of pending) {
|
|
476
|
+
await this.storage.putToWarm(job.sha, jobWithMeta.packId, jobWithMeta.offset, p.data); // Actually write the data
|
|
477
|
+
p.resolve();
|
|
478
|
+
}
|
|
479
|
+
this.pendingWrites.delete(job.sha);
|
|
480
|
+
}
|
|
481
|
+
this.recordHistory(job.sha, job.sourceTier, job.targetTier, 'completed');
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Rollback a migration job
|
|
485
|
+
*/
|
|
486
|
+
async rollbackMigrationJob(job) {
|
|
487
|
+
// Clean up warm tier
|
|
488
|
+
await this.storage.deleteFromWarm(job.sha);
|
|
489
|
+
// Release lock
|
|
490
|
+
if (job.lockAcquired) {
|
|
491
|
+
await this.storage.releaseLock(job.sha);
|
|
492
|
+
}
|
|
493
|
+
job.state = 'rolled_back';
|
|
494
|
+
this.migratingObjects.delete(job.sha);
|
|
495
|
+
this.activeJobs.delete(job.id);
|
|
496
|
+
this.recordHistory(job.sha, job.sourceTier, job.targetTier, 'rolled_back');
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Cancel a migration job
|
|
500
|
+
*/
|
|
501
|
+
async cancelMigrationJob(jobId) {
|
|
502
|
+
const job = this.activeJobs.get(jobId);
|
|
503
|
+
if (!job)
|
|
504
|
+
return;
|
|
505
|
+
// Clean up warm tier
|
|
506
|
+
await this.storage.deleteFromWarm(job.sha);
|
|
507
|
+
// Release lock
|
|
508
|
+
if (job.lockAcquired) {
|
|
509
|
+
await this.storage.releaseLock(job.sha);
|
|
510
|
+
}
|
|
511
|
+
job.state = 'cancelled';
|
|
512
|
+
this.migratingObjects.delete(job.sha);
|
|
513
|
+
this.activeJobs.delete(jobId);
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Get active migration jobs
|
|
517
|
+
*/
|
|
518
|
+
async getActiveMigrationJobs() {
|
|
519
|
+
return Array.from(this.activeJobs.values()).filter(j => j.state === 'in_progress');
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Get migration history for an object
|
|
523
|
+
*/
|
|
524
|
+
async getMigrationHistory(sha) {
|
|
525
|
+
return this.migrationHistory.get(sha) ?? [];
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Migrate multiple objects in a batch
|
|
529
|
+
*/
|
|
530
|
+
async migrateBatch(shas, sourceTier, targetTier, options) {
|
|
531
|
+
const concurrency = options?.concurrency ?? shas.length;
|
|
532
|
+
const successful = [];
|
|
533
|
+
const failed = [];
|
|
534
|
+
// Process in batches based on concurrency
|
|
535
|
+
const batches = [];
|
|
536
|
+
for (let i = 0; i < shas.length; i += concurrency) {
|
|
537
|
+
batches.push(shas.slice(i, i + concurrency));
|
|
538
|
+
}
|
|
539
|
+
for (const batch of batches) {
|
|
540
|
+
await Promise.allSettled(batch.map(async (sha) => {
|
|
541
|
+
try {
|
|
542
|
+
const result = await this.migrate(sha, sourceTier, targetTier);
|
|
543
|
+
if (result.success) {
|
|
544
|
+
successful.push(sha);
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
failed.push(sha);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
catch (error) {
|
|
551
|
+
failed.push(sha);
|
|
552
|
+
}
|
|
553
|
+
}));
|
|
554
|
+
}
|
|
555
|
+
return { successful, failed };
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Read object data during an in-progress migration
|
|
559
|
+
*/
|
|
560
|
+
async readDuringMigration(sha) {
|
|
561
|
+
// During migration, data should still be in hot tier
|
|
562
|
+
const data = await this.storage.getFromHot(sha);
|
|
563
|
+
if (data)
|
|
564
|
+
return data;
|
|
565
|
+
// Fall back to warm tier if already migrated
|
|
566
|
+
return this.storage.getFromWarm(sha);
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Write object data during an in-progress migration
|
|
570
|
+
*/
|
|
571
|
+
async writeDuringMigration(sha, data) {
|
|
572
|
+
// If object is being migrated, queue the write
|
|
573
|
+
if (this.migratingObjects.has(sha)) {
|
|
574
|
+
return new Promise((resolve) => {
|
|
575
|
+
const pending = this.pendingWrites.get(sha) ?? [];
|
|
576
|
+
pending.push({ resolve, data });
|
|
577
|
+
this.pendingWrites.set(sha, pending);
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
// Otherwise write directly
|
|
581
|
+
await this.storage.putToHot(sha, data);
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Compute checksum for data verification
|
|
585
|
+
*/
|
|
586
|
+
async computeChecksum(data) {
|
|
587
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
588
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
589
|
+
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/tiered/migration.ts"],"names":[],"mappings":"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"}
|