@gmod/bam 7.9.0 → 8.0.0
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/bamFile.d.ts +31 -26
- package/dist/bamFile.js +95 -122
- package/dist/bamFile.js.map +1 -1
- package/dist/indexFile.d.ts +33 -2
- package/dist/indexFile.js +68 -7
- package/dist/indexFile.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.js +6 -0
- package/dist/util.js.map +1 -1
- package/esm/bamFile.d.ts +31 -26
- package/esm/bamFile.js +96 -123
- package/esm/bamFile.js.map +1 -1
- package/esm/indexFile.d.ts +33 -2
- package/esm/indexFile.js +69 -8
- package/esm/indexFile.js.map +1 -1
- package/esm/util.d.ts +1 -1
- package/esm/util.js +4 -0
- package/esm/util.js.map +1 -1
- package/package.json +12 -12
- package/src/bamFile.ts +105 -146
- package/src/indexFile.ts +73 -8
- package/src/util.ts +5 -0
package/esm/indexFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexFile.js","sourceRoot":"","sources":["../src/indexFile.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"indexFile.js","sourceRoot":"","sources":["../src/indexFile.ts"],"names":[],"mappings":"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"}
|
package/esm/util.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export interface BaseOpts {
|
|
|
35
35
|
* underneath you. (The Chunk objects themselves are never mutated; a merged
|
|
36
36
|
* span produces a new instance.)
|
|
37
37
|
*/
|
|
38
|
+
export { throwIfAborted } from '@gmod/shared-read-cache';
|
|
38
39
|
export declare function optimizeChunks(chunks: Chunk[], lowest?: OffsetCoords): Chunk[];
|
|
39
40
|
export declare function parsePseudoBin(bytes: Uint8Array, offset: number): {
|
|
40
41
|
lineCount: number;
|
|
@@ -75,4 +76,3 @@ interface Positioned {
|
|
|
75
76
|
end: number;
|
|
76
77
|
}
|
|
77
78
|
export declare function appendInRange<T extends Positioned>(records: T[], chrId: number, min: number, max: number, out?: T[]): T[];
|
|
78
|
-
export {};
|
package/esm/util.js
CHANGED
|
@@ -10,6 +10,10 @@ import { VirtualOffset } from "./virtualOffset.js";
|
|
|
10
10
|
* underneath you. (The Chunk objects themselves are never mutated; a merged
|
|
11
11
|
* span produces a new instance.)
|
|
12
12
|
*/
|
|
13
|
+
// Re-exported so the internal import path stays './util.ts'. The
|
|
14
|
+
// implementation moved to @gmod/shared-read-cache, which needs it anyway --
|
|
15
|
+
// every consumer of that package was carrying an identical copy.
|
|
16
|
+
export { throwIfAborted } from '@gmod/shared-read-cache';
|
|
13
17
|
export function optimizeChunks(chunks, lowest) {
|
|
14
18
|
const n = chunks.length;
|
|
15
19
|
if (n === 0) {
|
package/esm/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gmod/bam",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"packageManager": "pnpm@11.15.1",
|
|
5
5
|
"description": "Parser for BAM and BAM index (bai) files",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/GMOD/bam-js.git"
|
|
9
|
+
"url": "git+https://github.com/GMOD/bam-js.git"
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|
|
12
12
|
"sideEffects": false,
|
|
@@ -51,24 +51,24 @@
|
|
|
51
51
|
"genomics"
|
|
52
52
|
],
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@gmod/bgzf-filehandle": "^6.2
|
|
54
|
+
"@gmod/bgzf-filehandle": "^6.3.2",
|
|
55
|
+
"@gmod/shared-read-cache": "^1.3.0",
|
|
55
56
|
"@jbrowse/quick-lru": "^7.3.5",
|
|
56
57
|
"crc": "^4.3.2",
|
|
57
|
-
"generic-filehandle2": "^2.2.
|
|
58
|
+
"generic-filehandle2": "^2.2.1"
|
|
58
59
|
},
|
|
59
60
|
"devDependencies": {
|
|
60
61
|
"@eslint/js": "^10.0.1",
|
|
61
|
-
"@types/node": "^25.9.
|
|
62
|
-
"@vitest/coverage-v8": "^4.1.
|
|
63
|
-
"eslint": "^10.
|
|
64
|
-
"eslint-plugin-import-x": "^4.
|
|
65
|
-
"eslint-plugin-unicorn": "^65.0.0",
|
|
62
|
+
"@types/node": "^25.9.5",
|
|
63
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
64
|
+
"eslint": "^10.8.0",
|
|
65
|
+
"eslint-plugin-import-x": "^4.17.1",
|
|
66
66
|
"git-cliff": "^2.13.1",
|
|
67
|
-
"prettier": "^3.
|
|
67
|
+
"prettier": "^3.9.6",
|
|
68
68
|
"rimraf": "^6.1.3",
|
|
69
69
|
"typescript": "^6.0.3",
|
|
70
|
-
"typescript-eslint": "^8.
|
|
71
|
-
"vitest": "^4.1.
|
|
70
|
+
"typescript-eslint": "^8.65.0",
|
|
71
|
+
"vitest": "^4.1.10"
|
|
72
72
|
},
|
|
73
73
|
"publishConfig": {
|
|
74
74
|
"access": "public"
|
package/src/bamFile.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { unzip, unzipChunkSlice } from '@gmod/bgzf-filehandle'
|
|
2
|
+
import { SharedReadCache } from '@gmod/shared-read-cache'
|
|
2
3
|
import crc32 from 'crc/calculators/crc32'
|
|
3
4
|
import { LocalFile, RemoteFile } from 'generic-filehandle2'
|
|
4
5
|
|
|
@@ -7,7 +8,7 @@ import CSI from './csi.ts'
|
|
|
7
8
|
import NullFilehandle from './nullFilehandle.ts'
|
|
8
9
|
import BAMFeature from './record.ts'
|
|
9
10
|
import { parseHeaderText } from './sam.ts'
|
|
10
|
-
import { appendInRange, parseRefSeqs } from './util.ts'
|
|
11
|
+
import { appendInRange, parseRefSeqs, throwIfAborted } from './util.ts'
|
|
11
12
|
|
|
12
13
|
import type Chunk from './chunk.ts'
|
|
13
14
|
import type { BamOpts, BaseOpts } from './util.ts'
|
|
@@ -63,13 +64,6 @@ interface ChunkEntry<T> {
|
|
|
63
64
|
features: T[]
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
interface InFlightChunk<T> {
|
|
67
|
-
promise: Promise<ChunkEntry<T>>
|
|
68
|
-
// the signal the read was started with, so a waiter can tell "the owner
|
|
69
|
-
// aborted" apart from "the read genuinely failed"
|
|
70
|
-
signal?: AbortSignal
|
|
71
|
-
}
|
|
72
|
-
|
|
73
67
|
/**
|
|
74
68
|
* Whether a chunk's first record already lies past `chrId:..-max`, which means
|
|
75
69
|
* every later chunk does too and none of them need to be read.
|
|
@@ -120,80 +114,6 @@ export const DEFAULT_MAX_CACHE_BYTES = 100 * 1024 * 1024
|
|
|
120
114
|
// nothing on the transport that matters and only widens peak memory.
|
|
121
115
|
const MAX_CONCURRENT_CHUNK_READS = 6
|
|
122
116
|
|
|
123
|
-
class ChunkFeatureCache<T> {
|
|
124
|
-
private _maxBytes: number
|
|
125
|
-
private entries = new Map<string, ChunkEntry<T>>()
|
|
126
|
-
private bytes = 0
|
|
127
|
-
|
|
128
|
-
constructor(maxBytes: number) {
|
|
129
|
-
this._maxBytes = maxBytes
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
get maxBytes() {
|
|
133
|
-
return this._maxBytes
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Accessor rather than a plain field so lowering the budget frees memory now.
|
|
137
|
-
// As a field, a caller trimming the cache under memory pressure got nothing
|
|
138
|
-
// back until the next chunk read happened to call set().
|
|
139
|
-
set maxBytes(maxBytes: number) {
|
|
140
|
-
this._maxBytes = maxBytes
|
|
141
|
-
this.evict()
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
get size() {
|
|
145
|
-
return this.entries.size
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
get byteSize() {
|
|
149
|
-
return this.bytes
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
get(key: string) {
|
|
153
|
-
const entry = this.entries.get(key)
|
|
154
|
-
if (entry) {
|
|
155
|
-
// re-insert so Map iteration order stays least-recently-used first
|
|
156
|
-
this.entries.delete(key)
|
|
157
|
-
this.entries.set(key, entry)
|
|
158
|
-
}
|
|
159
|
-
return entry
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
set(key: string, entry: ChunkEntry<T>) {
|
|
163
|
-
this.delete(key)
|
|
164
|
-
this.entries.set(key, entry)
|
|
165
|
-
this.bytes += entry.bytes
|
|
166
|
-
this.evict()
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Evict from the least-recently-used end. The size > 1 guard means a single
|
|
170
|
-
// chunk larger than the whole budget is still kept: the caller needs it for
|
|
171
|
-
// the query in flight, and dropping it would only force a re-decompress.
|
|
172
|
-
private evict() {
|
|
173
|
-
const lru = this.entries.keys()
|
|
174
|
-
while (this.bytes > this._maxBytes && this.entries.size > 1) {
|
|
175
|
-
this.delete(lru.next().value!)
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
delete(key: string) {
|
|
180
|
-
const entry = this.entries.get(key)
|
|
181
|
-
if (entry) {
|
|
182
|
-
this.entries.delete(key)
|
|
183
|
-
this.bytes -= entry.bytes
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
clear() {
|
|
188
|
-
this.entries.clear()
|
|
189
|
-
this.bytes = 0
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
[Symbol.iterator]() {
|
|
193
|
-
return this.entries[Symbol.iterator]()
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
117
|
export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
198
118
|
public renameRefSeq: (a: string) => string
|
|
199
119
|
public bam: GenericFilehandle
|
|
@@ -203,14 +123,18 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
203
123
|
public index?: BAI | CSI
|
|
204
124
|
public htsget = false
|
|
205
125
|
public headerP?: ReturnType<BamFile<T>['getHeaderPre']>
|
|
126
|
+
/**
|
|
127
|
+
* The signal `headerP` was started under, while it is still in flight. The
|
|
128
|
+
* header is parsed once and every query awaits it, so without this the first
|
|
129
|
+
* query to arrive would own a read all the others depend on — see
|
|
130
|
+
* {@link getHeader}.
|
|
131
|
+
*/
|
|
132
|
+
private headerSignal?: AbortSignal
|
|
206
133
|
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
// instead of racing. Entries live only until the read settles; the resolved
|
|
212
|
-
// features land in chunkFeatureCache.
|
|
213
|
-
private inFlightChunks = new Map<string, InFlightChunk<T>>()
|
|
134
|
+
// Parsed features by chunk, bounded by decompressed bytes. Also the
|
|
135
|
+
// in-flight map: concurrent queries for the same chunk share one read rather
|
|
136
|
+
// than racing to decompress it twice.
|
|
137
|
+
public chunkFeatureCache: SharedReadCache<Chunk, ChunkEntry<T>>
|
|
214
138
|
|
|
215
139
|
private RecordClass: BamRecordClass<T>
|
|
216
140
|
|
|
@@ -246,7 +170,15 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
246
170
|
}) {
|
|
247
171
|
this.renameRefSeq = renameRefSeqs
|
|
248
172
|
this.RecordClass = (recordClass ?? BAMFeature) as BamRecordClass<T>
|
|
249
|
-
this.chunkFeatureCache = new
|
|
173
|
+
this.chunkFeatureCache = new SharedReadCache<Chunk, ChunkEntry<T>>({
|
|
174
|
+
maxSize: maxCacheBytes,
|
|
175
|
+
// decompressed bytes, not entry count: parsed records are views into
|
|
176
|
+
// their chunk's decompressed buffer, so a cached entry pins that whole
|
|
177
|
+
// buffer and entry count says nothing about memory
|
|
178
|
+
sizeOf: entry => entry.bytes,
|
|
179
|
+
cacheKey: chunkCacheKey,
|
|
180
|
+
fill: (chunk, signal) => this._readChunkFeatures(chunk, { signal }),
|
|
181
|
+
})
|
|
250
182
|
|
|
251
183
|
const bamFh = resolveFilehandle(bamFilehandle, bamPath, bamUrl)
|
|
252
184
|
if (bamFh) {
|
|
@@ -355,14 +287,70 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
355
287
|
return samHeader
|
|
356
288
|
}
|
|
357
289
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
290
|
+
/**
|
|
291
|
+
* Parse the header, or join the parse already running.
|
|
292
|
+
*
|
|
293
|
+
* The header is parsed once for the life of this object and every query goes
|
|
294
|
+
* through it — `getSeqId` awaits it before anything else — so it is a read
|
|
295
|
+
* shared between queries, and the third place in this file where a
|
|
296
|
+
* cancellation could leak from the query that asked for it to a query that
|
|
297
|
+
* did not. `getHeaderPre` threads `opts` into both the index parse and the
|
|
298
|
+
* BAM read, so without this the first query to arrive owns a read every other
|
|
299
|
+
* query depends on: when it pans away, every concurrent query fails with its
|
|
300
|
+
* abort even though its own signal is untouched.
|
|
301
|
+
*
|
|
302
|
+
* Same bounded retry as `IndexFile.parse`, for the same reason — the header
|
|
303
|
+
* is parsed once, so there is no repeated waste to recover — and bounded at
|
|
304
|
+
* one attempt so the pathological case is a duplicate parse rather than a
|
|
305
|
+
* recursion whose depth depends on how the aborts interleave.
|
|
306
|
+
*
|
|
307
|
+
* SYNC: ~/src/gmod/tabix-js/src/tabixIndexedFile.ts getParsedHeader — same
|
|
308
|
+
* shape for the same reason.
|
|
309
|
+
*/
|
|
310
|
+
async getHeader(
|
|
311
|
+
opts?: BaseOpts,
|
|
312
|
+
retried = false,
|
|
313
|
+
): Promise<Awaited<ReturnType<BamFile<T>['getHeaderPre']>>> {
|
|
314
|
+
throwIfAborted(opts?.signal)
|
|
315
|
+
const pending = this.headerP
|
|
316
|
+
if (!pending) {
|
|
317
|
+
return this.startHeaderParse(opts)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// read before awaiting: the owner is forgotten as soon as the parse settles
|
|
321
|
+
const ownerSignal = this.headerSignal
|
|
322
|
+
try {
|
|
323
|
+
return await pending
|
|
324
|
+
} catch (e) {
|
|
325
|
+
if (retried || !ownerSignal?.aborted || opts?.signal?.aborted) {
|
|
362
326
|
throw e
|
|
363
|
-
}
|
|
327
|
+
}
|
|
328
|
+
return this.getHeader(opts, true)
|
|
364
329
|
}
|
|
365
|
-
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
private startHeaderParse(opts?: BaseOpts) {
|
|
333
|
+
const pending = this.getHeaderPre(opts)
|
|
334
|
+
this.headerP = pending
|
|
335
|
+
this.headerSignal = opts?.signal
|
|
336
|
+
// Drop a rejection rather than keeping it, so one transient failure does not
|
|
337
|
+
// poison the header for the lifetime of the file. Both branches are
|
|
338
|
+
// identity-checked so a retry started after this settles is not cleared by
|
|
339
|
+
// the attempt it already replaced.
|
|
340
|
+
pending.then(
|
|
341
|
+
() => {
|
|
342
|
+
if (this.headerP === pending) {
|
|
343
|
+
this.headerSignal = undefined
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
() => {
|
|
347
|
+
if (this.headerP === pending) {
|
|
348
|
+
this.headerP = undefined
|
|
349
|
+
this.headerSignal = undefined
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
)
|
|
353
|
+
return pending
|
|
366
354
|
}
|
|
367
355
|
|
|
368
356
|
async getHeaderText(opts: BaseOpts = {}) {
|
|
@@ -392,6 +380,7 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
392
380
|
max: number,
|
|
393
381
|
opts?: BamOpts,
|
|
394
382
|
) {
|
|
383
|
+
throwIfAborted(opts?.signal)
|
|
395
384
|
const chrId = await this.getSeqId(chr, opts)
|
|
396
385
|
if (chrId === undefined || !this.index) {
|
|
397
386
|
return []
|
|
@@ -400,27 +389,6 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
400
389
|
return this._fetchChunkFeatures(chunks, chrId, min, max, opts)
|
|
401
390
|
}
|
|
402
391
|
|
|
403
|
-
// Read a chunk, publish it to the cache, and keep the in-flight promise
|
|
404
|
-
// discoverable while it runs.
|
|
405
|
-
private _startChunkRead(cacheKey: string, chunk: Chunk, opts: BaseOpts) {
|
|
406
|
-
const promise = this._readChunkFeatures(chunk, opts).then(entry => {
|
|
407
|
-
this.chunkFeatureCache.set(cacheKey, entry)
|
|
408
|
-
return entry
|
|
409
|
-
})
|
|
410
|
-
const inFlight: InFlightChunk<T> = { promise, signal: opts.signal }
|
|
411
|
-
this.inFlightChunks.set(cacheKey, inFlight)
|
|
412
|
-
// Only clear our own entry: a retry may already have replaced it. `.then(f,
|
|
413
|
-
// f)` rather than `.finally(f)` so the handler's own promise never carries
|
|
414
|
-
// an unhandled rejection.
|
|
415
|
-
const clear = () => {
|
|
416
|
-
if (this.inFlightChunks.get(cacheKey) === inFlight) {
|
|
417
|
-
this.inFlightChunks.delete(cacheKey)
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
promise.then(clear, clear)
|
|
421
|
-
return promise
|
|
422
|
-
}
|
|
423
|
-
|
|
424
392
|
// Parsed records for a chunk, reading and decompressing it only on a miss.
|
|
425
393
|
// Every path that wants a chunk's features goes through here — mate lookups
|
|
426
394
|
// included, since a viewAsPairs query revisits the same mate chunks each time
|
|
@@ -435,35 +403,11 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
435
403
|
chunk: Chunk,
|
|
436
404
|
opts: BaseOpts,
|
|
437
405
|
): Promise<T[]> {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
// Join a read already running for this chunk rather than decompressing it a
|
|
445
|
-
// second time. jbrowse fetches a row of adjacent blocks concurrently and
|
|
446
|
-
// they collapse onto very few chunk keys, so without this a query pays for
|
|
447
|
-
// the same inflate several times over — the dominant cost of a cold query
|
|
448
|
-
// (ADR 0003).
|
|
449
|
-
const pending = this.inFlightChunks.get(cacheKey)
|
|
450
|
-
if (!pending) {
|
|
451
|
-
return (await this._startChunkRead(cacheKey, chunk, opts)).features
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
try {
|
|
455
|
-
return (await pending.promise).features
|
|
456
|
-
} catch (e) {
|
|
457
|
-
// The read we joined was started by another caller. If that caller
|
|
458
|
-
// aborted and we did not, the failure is theirs and says nothing about
|
|
459
|
-
// our query, so start over — which picks up the cache, joins a sibling's
|
|
460
|
-
// retry, or reads under our own signal. Any other failure (and our own
|
|
461
|
-
// abort) propagates as it would have without sharing.
|
|
462
|
-
if (!pending.signal?.aborted || opts.signal?.aborted) {
|
|
463
|
-
throw e
|
|
464
|
-
}
|
|
465
|
-
return this._cachedChunkFeatures(chunk, opts)
|
|
466
|
-
}
|
|
406
|
+
// The cache does the rest: one read per chunk shared by every caller that
|
|
407
|
+
// asks for it while it is in flight, cancelled only once every one of them
|
|
408
|
+
// has given up (ADR 0007), and bounded by decompressed bytes.
|
|
409
|
+
const entry = await this.chunkFeatureCache.get(chunk, opts.signal)
|
|
410
|
+
return entry.features
|
|
467
411
|
}
|
|
468
412
|
|
|
469
413
|
private async _fetchChunkFeatures(
|
|
@@ -669,6 +613,21 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
669
613
|
signal: opts.signal,
|
|
670
614
|
},
|
|
671
615
|
)
|
|
616
|
+
// The last chance to bail before the expensive part, and the reason it is
|
|
617
|
+
// worth having: honouring the signal is optional in the filehandle.
|
|
618
|
+
// `RemoteFile` hands it to `fetch`, but `LocalFile.read(length, position)`
|
|
619
|
+
// does not even take an options argument, so every read under it runs to
|
|
620
|
+
// completion and arrives here with the cancellation unnoticed. Without this
|
|
621
|
+
// a fully abandoned chunk still gets inflated and decoded — measured at 6
|
|
622
|
+
// chunks for one 20kb query on out.bam — which is the dominant cost of a
|
|
623
|
+
// cold query (ADR 0003), spent on records nobody will ever look at.
|
|
624
|
+
//
|
|
625
|
+
// Safe precisely because this is the SHARED signal, not a caller's: it
|
|
626
|
+
// fires only once every waiter has given up, so there is never a live
|
|
627
|
+
// caller left to be denied the result. @gmod/cram checks in the same place
|
|
628
|
+
// and for the same reason, before the decode loop in `_fetchRecords`.
|
|
629
|
+
throwIfAborted(opts.signal)
|
|
630
|
+
|
|
672
631
|
const {
|
|
673
632
|
buffer: data,
|
|
674
633
|
cpositions,
|
package/src/indexFile.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import QuickLRU from '@jbrowse/quick-lru'
|
|
2
2
|
|
|
3
|
-
import { optimizeChunks } from './util.ts'
|
|
3
|
+
import { optimizeChunks, throwIfAborted } from './util.ts'
|
|
4
4
|
|
|
5
5
|
import type Chunk from './chunk.ts'
|
|
6
6
|
import type { BaseOpts } from './util.ts'
|
|
@@ -53,7 +53,14 @@ export default abstract class IndexFile<
|
|
|
53
53
|
public filehandle: GenericFilehandle
|
|
54
54
|
public renameRefSeq: (s: string) => string
|
|
55
55
|
|
|
56
|
-
private
|
|
56
|
+
private parseP?: Promise<TParsed>
|
|
57
|
+
/**
|
|
58
|
+
* The signal `parseP` was started under, while it is still in flight. The
|
|
59
|
+
* index is parsed once and shared by every query against the file, so without
|
|
60
|
+
* this the first query to arrive would own a read all the others depend on —
|
|
61
|
+
* see {@link parse}.
|
|
62
|
+
*/
|
|
63
|
+
private parseSignal?: AbortSignal
|
|
57
64
|
|
|
58
65
|
constructor({
|
|
59
66
|
filehandle,
|
|
@@ -121,14 +128,72 @@ export default abstract class IndexFile<
|
|
|
121
128
|
return optimizeChunks(chunks, this.getLowestChunk(ba, min))
|
|
122
129
|
}
|
|
123
130
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
131
|
+
// SYNC: ~/src/gmod/tabix-js/src/indexFile.ts parse — same owner-signal
|
|
132
|
+
// tracking and one-attempt retry, and the same reasoning below.
|
|
133
|
+
/**
|
|
134
|
+
* Parse the index, or join the parse already running.
|
|
135
|
+
*
|
|
136
|
+
* The index is downloaded and parsed once for the life of this object, so it
|
|
137
|
+
* is the one read here that is shared between queries — and therefore the one
|
|
138
|
+
* place a cancellation can leak from the query that asked for it to a query
|
|
139
|
+
* that did not. `_parse` hands `opts` straight to `filehandle.readFile`, so
|
|
140
|
+
* without this the first query to arrive owns a read every other query
|
|
141
|
+
* depends on: when it pans away, every concurrent query fails with its abort.
|
|
142
|
+
*
|
|
143
|
+
* A caller that joined someone else's parse and saw it fail because *they*
|
|
144
|
+
* aborted starts over rather than inheriting the failure — once, then
|
|
145
|
+
* propagates. Bounding it at one attempt is what jbrowse's
|
|
146
|
+
* `RemoteFileWithRangeCache.joinChunk` does with the same retry one layer
|
|
147
|
+
* down, and for the reason it gives: the pathological case becomes one
|
|
148
|
+
* duplicate parse rather than a recursion whose depth depends on how the
|
|
149
|
+
* aborts interleave.
|
|
150
|
+
*
|
|
151
|
+
* A retry rather than the reference count `_cachedChunkFeatures` uses, for
|
|
152
|
+
* the reason `@gmod/cram` gives for the same split in `CraiIndex`: the index
|
|
153
|
+
* is parsed once for the life of the object, so there is no repeated waste to
|
|
154
|
+
* recover, and this is a dozen lines against restructuring the memo.
|
|
155
|
+
*/
|
|
156
|
+
async parse(opts: BaseOpts = {}, retried = false): Promise<TParsed> {
|
|
157
|
+
throwIfAborted(opts.signal)
|
|
158
|
+
const pending = this.parseP
|
|
159
|
+
if (!pending) {
|
|
160
|
+
return this.startParse(opts)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// read before awaiting: the owner is forgotten as soon as the parse settles
|
|
164
|
+
const ownerSignal = this.parseSignal
|
|
165
|
+
try {
|
|
166
|
+
return await pending
|
|
167
|
+
} catch (e) {
|
|
168
|
+
if (retried || !ownerSignal?.aborted || opts.signal?.aborted) {
|
|
128
169
|
throw e
|
|
129
|
-
}
|
|
170
|
+
}
|
|
171
|
+
return this.parse(opts, true)
|
|
130
172
|
}
|
|
131
|
-
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private startParse(opts: BaseOpts) {
|
|
176
|
+
const pending = this._parse(opts)
|
|
177
|
+
this.parseP = pending
|
|
178
|
+
this.parseSignal = opts.signal
|
|
179
|
+
// Drop a rejection rather than keeping it, so one transient failure does not
|
|
180
|
+
// poison the index for the lifetime of the file. Both branches are
|
|
181
|
+
// identity-checked so a retry started after this settles is not cleared by
|
|
182
|
+
// the attempt it already replaced.
|
|
183
|
+
pending.then(
|
|
184
|
+
() => {
|
|
185
|
+
if (this.parseP === pending) {
|
|
186
|
+
this.parseSignal = undefined
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
() => {
|
|
190
|
+
if (this.parseP === pending) {
|
|
191
|
+
this.parseP = undefined
|
|
192
|
+
this.parseSignal = undefined
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
)
|
|
196
|
+
return pending
|
|
132
197
|
}
|
|
133
198
|
|
|
134
199
|
async lineCount(refId: number, opts?: BaseOpts) {
|
package/src/util.ts
CHANGED
|
@@ -39,6 +39,11 @@ export interface BaseOpts {
|
|
|
39
39
|
* underneath you. (The Chunk objects themselves are never mutated; a merged
|
|
40
40
|
* span produces a new instance.)
|
|
41
41
|
*/
|
|
42
|
+
// Re-exported so the internal import path stays './util.ts'. The
|
|
43
|
+
// implementation moved to @gmod/shared-read-cache, which needs it anyway --
|
|
44
|
+
// every consumer of that package was carrying an identical copy.
|
|
45
|
+
export { throwIfAborted } from '@gmod/shared-read-cache'
|
|
46
|
+
|
|
42
47
|
export function optimizeChunks(chunks: Chunk[], lowest?: OffsetCoords) {
|
|
43
48
|
const n = chunks.length
|
|
44
49
|
if (n === 0) {
|