Honor configured parallel extraction slots
This commit is contained in:
parent
ed4baf9240
commit
83640b8f1f
@ -5868,10 +5868,9 @@ export class DownloadManager extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async acquirePostProcessSlot(packageId: string): Promise<void> {
|
private async acquirePostProcessSlot(packageId: string): Promise<void> {
|
||||||
// Extract packages sequentially (one at a time) to focus I/O on finishing
|
// Honor the user-facing "Parallele Entpackungen" setting for package-level
|
||||||
// the earliest package first. maxParallelExtract is reserved for future
|
// post-processing so multiple episodes/packages can extract concurrently.
|
||||||
// intra-package parallelism.
|
const maxConcurrent = Math.max(1, Math.min(8, this.settings.maxParallelExtract || 1));
|
||||||
const maxConcurrent = 1;
|
|
||||||
if (this.packagePostProcessActive < maxConcurrent) {
|
if (this.packagePostProcessActive < maxConcurrent) {
|
||||||
this.packagePostProcessActive += 1;
|
this.packagePostProcessActive += 1;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -243,6 +243,42 @@ describe("download manager", () => {
|
|||||||
expect((manager as any).shouldCollapseQuickPostProcessRequeue(packageId)).toBe(false);
|
expect((manager as any).shouldCollapseQuickPostProcessRequeue(packageId)).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("honors maxParallelExtract for concurrent post-process slots", async () => {
|
||||||
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-postprocess-slots-"));
|
||||||
|
tempDirs.push(root);
|
||||||
|
|
||||||
|
const manager = new DownloadManager(
|
||||||
|
{
|
||||||
|
...defaultSettings(),
|
||||||
|
token: "rd-token",
|
||||||
|
maxParallelExtract: 4
|
||||||
|
},
|
||||||
|
emptySession(),
|
||||||
|
createStoragePaths(path.join(root, "state"))
|
||||||
|
);
|
||||||
|
|
||||||
|
await (manager as any).acquirePostProcessSlot("pkg-1");
|
||||||
|
await (manager as any).acquirePostProcessSlot("pkg-2");
|
||||||
|
await (manager as any).acquirePostProcessSlot("pkg-3");
|
||||||
|
await (manager as any).acquirePostProcessSlot("pkg-4");
|
||||||
|
|
||||||
|
expect((manager as any).packagePostProcessActive).toBe(4);
|
||||||
|
|
||||||
|
let fifthResolved = false;
|
||||||
|
const fifth = (manager as any).acquirePostProcessSlot("pkg-5").then(() => {
|
||||||
|
fifthResolved = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 30));
|
||||||
|
expect(fifthResolved).toBe(false);
|
||||||
|
|
||||||
|
(manager as any).releasePostProcessSlot();
|
||||||
|
await fifth;
|
||||||
|
|
||||||
|
expect(fifthResolved).toBe(true);
|
||||||
|
expect((manager as any).packagePostProcessActive).toBe(4);
|
||||||
|
});
|
||||||
|
|
||||||
it("extractNow only re-arms completed items that are not already extracted", () => {
|
it("extractNow only re-arms completed items that are not already extracted", () => {
|
||||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-extract-now-"));
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-extract-now-"));
|
||||||
tempDirs.push(root);
|
tempDirs.push(root);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user