The namer re-reads partial releases as the Rust window writes them
The pending namer's TypeScript re-index gave a file short of parts on the server to the range path's fragment rule, so a partial release the edge wrote (Bob's hex-named uploads in chello, ratcave, font, storage) never came out again: 10 of 148k named releases moved. RangeIndexer's partialFiles keeps such a file in its release, marked partial; tools/namer_check.ts replays sample rows from the corpus (10 of 10 found with it, 1 without). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0ccb850ea4
commit
8cf965af80
5 files changed
+102
-1
No files matched your search
@@ -87,6 +87,24 @@ test.group('edge / RangeIndexer', () => {
|
||||
assert.deepEqual(batch.counts.map((c) => [c.rule, c.articles, c.files]), [['incomplete', 2, 1]])
|
||||
assert.lengthOf(batch.releases, 0)
|
||||
})
|
||||
|
||||
test("partialFiles: a file short of parts is a partial release, as the Rust window writes it; one article of a random multi-part file isn't", ({ assert }) => {
|
||||
const indexer = new RangeIndexer({ group: GROUP, start: 100, end: 200, rules, idleChunks: 0, edgeArticles: 0, partialFiles: true })
|
||||
const name = '8c21f5c36450f9e2ccc6ff387d159d4d'
|
||||
indexer.add([
|
||||
// Parts 1, 3 and 5 of 6 (the others gone from the server), from a re-send's copy of part 3 too.
|
||||
...post(100, name, 6, { poster: 'Bob <bob@home.me>' }).filter((_, i) => i % 2 === 0),
|
||||
...post(150, name, 6, { poster: 'Bob <bob@home.me>' }).slice(2, 3),
|
||||
...post(160, 'Pq4ZmXc8VbN2LkJh6GfDs3', 4).slice(1, 2),
|
||||
], 201)
|
||||
indexer.finish()
|
||||
const batch = indexer.take()
|
||||
assert.lengthOf(batch.releases, 1)
|
||||
assert.include(batch.releases[0], { name, files: 1, segments: 3, partial: true, firstArticle: 100, lastArticle: 104 })
|
||||
assert.deepEqual(decodeChunk(batch.releases[0].payload)[0].segments.map((s) => s[0]), [1, 3, 5])
|
||||
assert.deepEqual(batch.fragments, [])
|
||||
assert.deepEqual(batch.counts.map((c) => [c.rule, c.articles, c.files]), [['per-article', 1, 0]])
|
||||
})
|
||||
})
|
||||
|
||||
test.group('edge / taking over a range', () => {
|
||||
|
||||
Reference in new issue
Block a user