Raise proxy connection limit to 80
This commit is contained in:
@@ -9,6 +9,11 @@ All notable changes to Multi-Debrid Downloader are documented in this file.
|
|||||||
- Create missing configured work folders immediately when the enabled startup-folder setting is saved, without requiring an application restart.
|
- Create missing configured work folders immediately when the enabled startup-folder setting is saved, without requiring an application restart.
|
||||||
- Preserve existing contents and continue isolating an unavailable target from the remaining configured folders.
|
- Preserve existing contents and continue isolating an unavailable target from the remaining configured folders.
|
||||||
|
|
||||||
|
### Proxy connection range
|
||||||
|
|
||||||
|
- Raise the configurable global proxy-segment connection maximum from 40 to 80 for high-capacity testing while keeping 32 as the default for new settings.
|
||||||
|
- Keep the existing fair cross-download budget, proxy scoring, cooldowns, and adaptive 429/503 backoff unchanged.
|
||||||
|
|
||||||
## [2.0.83] - 2026-09-01
|
## [2.0.83] - 2026-09-01
|
||||||
|
|
||||||
### Bounded CRC recovery
|
### Bounded CRC recovery
|
||||||
|
|||||||
+4
-1
@@ -198,6 +198,8 @@ Diese Datei hält den verifizierten technischen Arbeitsstand fest. Sie enthält
|
|||||||
|
|
||||||
- Ist „Fehlende Arbeitsordner beim Start anlegen“ aktiviert, werden fehlende konfigurierte Arbeitsordner nun bereits unmittelbar beim Speichern angelegt; ein Neustart ist dafür nicht mehr erforderlich.
|
- Ist „Fehlende Arbeitsordner beim Start anlegen“ aktiviert, werden fehlende konfigurierte Arbeitsordner nun bereits unmittelbar beim Speichern angelegt; ein Neustart ist dafür nicht mehr erforderlich.
|
||||||
- Derselbe bestehende Ordnerpfad bleibt für Programmstart und Speichern zuständig. Optionale Ziele, vorhandene Inhalte und die Fehlerisolation zwischen mehreren Zielpfaden behalten ihr bisheriges Verhalten.
|
- Derselbe bestehende Ordnerpfad bleibt für Programmstart und Speichern zuständig. Optionale Ziele, vorhandene Inhalte und die Fehlerisolation zwischen mehreren Zielpfaden behalten ihr bisheriges Verhalten.
|
||||||
|
- Das einstellbare globale Proxy-Segmentlimit steigt von 40 auf 80 Verbindungen. Der Standardwert für neue und bisher nicht gesetzte Konfigurationen bleibt 32; vorhandene Werte bleiben erhalten und werden erst oberhalb von 80 begrenzt.
|
||||||
|
- Faire Verteilung zwischen gleichzeitigen Downloads, Proxy-Bewertung, Cooldowns und adaptives 429/503-Backoff bleiben unverändert.
|
||||||
- Download-, Entpack-, Passwort- und Nachbearbeitungslogik wurden nicht verändert.
|
- Download-, Entpack-, Passwort- und Nachbearbeitungslogik wurden nicht verändert.
|
||||||
|
|
||||||
## Start-, Build- und Testbefehle
|
## Start-, Build- und Testbefehle
|
||||||
@@ -231,6 +233,7 @@ npm exec -- tsc --noEmit
|
|||||||
|
|
||||||
## Verifizierungen vom 1. September 2026
|
## Verifizierungen vom 1. September 2026
|
||||||
|
|
||||||
|
- Unveröffentlichte 32/80-Limitanpassung: 256 von 256 fokussierten Proxy-Segment-, Storage-, AppController-, Arbeitsordner- und Einstellungsansichtstests erfolgreich. Die Grenzwerttests bestätigen Minimum 2, Standard 32, Maximum 80 und die Begrenzung höherer Werte auf 80. TypeScript ist erfolgreich.
|
||||||
- Unveröffentlichte Sofortanlage der Arbeitsordner: 344 von 344 fokussierten AppController-, Ordner-, Einstellungsansichts- und Übersetzungstests erfolgreich. Abgedeckt sind die unmittelbare Anlage aller aktivierten Ziele beim Speichern, ein erneuter unveränderter Speichervorgang bei bereits aktiver Option und das Ausbleiben der Ordneranlage, wenn die Einstellungen nicht persistiert werden können. TypeScript, Main-Build, Renderer-Produktionsbuild und Node-Self-Check sind erfolgreich; die bekannte Vite-Warnung betrifft den rund 581 KiB großen Renderer-Chunk.
|
- Unveröffentlichte Sofortanlage der Arbeitsordner: 344 von 344 fokussierten AppController-, Ordner-, Einstellungsansichts- und Übersetzungstests erfolgreich. Abgedeckt sind die unmittelbare Anlage aller aktivierten Ziele beim Speichern, ein erneuter unveränderter Speichervorgang bei bereits aktiver Option und das Ausbleiben der Ordneranlage, wenn die Einstellungen nicht persistiert werden können. TypeScript, Main-Build, Renderer-Produktionsbuild und Node-Self-Check sind erfolgreich; die bekannte Vite-Warnung betrifft den rund 581 KiB großen Renderer-Chunk.
|
||||||
- Vollständiger Clientlauf nach der Sofortanlage: 143 Testdateien erfolgreich, 1 optionale JVM-Testdatei übersprungen; 2.728 Tests erfolgreich und 4 übersprungen. Ausschließlich die zwei bekannten Windows-Symlink-Fixtures scheiterten mangels Berechtigung vor ihrer Produktassertion mit `EPERM`. Alle 265 Download-Manager- und 84 Extractor-Tests sind weiterhin vollständig grün.
|
- Vollständiger Clientlauf nach der Sofortanlage: 143 Testdateien erfolgreich, 1 optionale JVM-Testdatei übersprungen; 2.728 Tests erfolgreich und 4 übersprungen. Ausschließlich die zwei bekannten Windows-Symlink-Fixtures scheiterten mangels Berechtigung vor ihrer Produktassertion mit `EPERM`. Alle 265 Download-Manager- und 84 Extractor-Tests sind weiterhin vollständig grün.
|
||||||
- Kandidat für `v2.0.83`: 392 von 392 fokussierten Download-Manager- und Storage-Tests erfolgreich. Die neuen Regressionen beweisen den einmaligen Neudownload bei CRC trotz gültiger RAR-Signatur, den persistenten Schutz vor einem zweiten automatischen Neudownload, die unveränderte Passwortfehler-Abgrenzung sowie das Löschen des Schutzes beim manuellen Reset.
|
- Kandidat für `v2.0.83`: 392 von 392 fokussierten Download-Manager- und Storage-Tests erfolgreich. Die neuen Regressionen beweisen den einmaligen Neudownload bei CRC trotz gültiger RAR-Signatur, den persistenten Schutz vor einem zweiten automatischen Neudownload, die unveränderte Passwortfehler-Abgrenzung sowie das Löschen des Schutzes beim manuellen Reset.
|
||||||
@@ -343,7 +346,7 @@ npm exec -- tsc --noEmit
|
|||||||
- Die Account-Übersicht unterstützt `Strg+A`; Proxy-only-Accountfehler werden verständlich aufgelöst und Online-Sicherungen können die Proxy-Liste verschlüsselt portieren. `v2.0.81` ist auf GitHub und Forgejo veröffentlicht. Eine produktive Installation oder ein Neustart wurde nicht vorgenommen.
|
- Die Account-Übersicht unterstützt `Strg+A`; Proxy-only-Accountfehler werden verständlich aufgelöst und Online-Sicherungen können die Proxy-Liste verschlüsselt portieren. `v2.0.81` ist auf GitHub und Forgejo veröffentlicht. Eine produktive Installation oder ein Neustart wurde nicht vorgenommen.
|
||||||
- Die optionale Arbeitsordner-Erstellung, der neue Kategoriename und die feinere TiB-Restanzeige sind als `v2.0.82` auf GitHub und Forgejo veröffentlicht. Eine produktive Installation oder ein Neustart ist nicht Bestandteil des Releases.
|
- Die optionale Arbeitsordner-Erstellung, der neue Kategoriename und die feinere TiB-Restanzeige sind als `v2.0.82` auf GitHub und Forgejo veröffentlicht. Eine produktive Installation oder ein Neustart ist nicht Bestandteil des Releases.
|
||||||
- Die einmalige CRC-Neudownload-Wiederherstellung ist als `v2.0.83` auf GitHub und Forgejo veröffentlicht. Entpack-, Passwort- und Extractor-Fallbacklogik blieben unverändert; eine produktive Installation oder ein Neustart ist nicht Bestandteil des Releases.
|
- Die einmalige CRC-Neudownload-Wiederherstellung ist als `v2.0.83` auf GitHub und Forgejo veröffentlicht. Entpack-, Passwort- und Extractor-Fallbacklogik blieben unverändert; eine produktive Installation oder ein Neustart ist nicht Bestandteil des Releases.
|
||||||
- Die unmittelbare Arbeitsordner-Anlage beim Speichern ist auf `fix/work-directories-on-save` implementiert und verifiziert, aber noch nicht veröffentlicht.
|
- Die unmittelbare Arbeitsordner-Anlage beim Speichern und der Proxybereich mit Standard 32 sowie Maximum 80 sind auf `fix/work-directories-on-save` implementiert und fokussiert verifiziert, aber noch nicht veröffentlicht.
|
||||||
|
|
||||||
## Nächste sinnvolle Schritte
|
## Nächste sinnvolle Schritte
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const DEFAULT_MAX_CHUNK_BYTES = 16 * 1024 * 1024;
|
|||||||
const DEFAULT_CHUNKS_PER_CONNECTION = 8;
|
const DEFAULT_CHUNKS_PER_CONNECTION = 8;
|
||||||
const DEFAULT_PROXY_ATTEMPTS = 3;
|
const DEFAULT_PROXY_ATTEMPTS = 3;
|
||||||
const DEFAULT_CONNECTION_LIMIT = 32;
|
const DEFAULT_CONNECTION_LIMIT = 32;
|
||||||
const MAX_CONNECTION_LIMIT = 40;
|
const MAX_CONNECTION_LIMIT = 80;
|
||||||
const PROXY_PROBE_END = 1;
|
const PROXY_PROBE_END = 1;
|
||||||
const MAX_REDIRECTS = 5;
|
const MAX_REDIRECTS = 5;
|
||||||
const MAX_SEGMENTS = 4_096;
|
const MAX_SEGMENTS = 4_096;
|
||||||
|
|||||||
+1
-1
@@ -618,7 +618,7 @@ export function normalizeSettings(settings: AppSettings): AppSettings {
|
|||||||
proxyDownloadEnabled: Boolean(settings.proxyDownloadEnabled),
|
proxyDownloadEnabled: Boolean(settings.proxyDownloadEnabled),
|
||||||
proxyListPath: asText(settings.proxyListPath).slice(0, 4096),
|
proxyListPath: asText(settings.proxyListPath).slice(0, 4096),
|
||||||
proxyApiProxyIndex: clampNumber(settings.proxyApiProxyIndex, defaults.proxyApiProxyIndex, 1, 100000),
|
proxyApiProxyIndex: clampNumber(settings.proxyApiProxyIndex, defaults.proxyApiProxyIndex, 1, 100000),
|
||||||
proxyConnectionsPerDownload: clampNumber(settings.proxyConnectionsPerDownload, defaults.proxyConnectionsPerDownload, 2, 40),
|
proxyConnectionsPerDownload: clampNumber(settings.proxyConnectionsPerDownload, defaults.proxyConnectionsPerDownload, 2, 80),
|
||||||
autoUpdateCheck: Boolean(settings.autoUpdateCheck),
|
autoUpdateCheck: Boolean(settings.autoUpdateCheck),
|
||||||
updateRepo: migrateUpdateRepo(asText(settings.updateRepo), defaults.updateRepo),
|
updateRepo: migrateUpdateRepo(asText(settings.updateRepo), defaults.updateRepo),
|
||||||
clipboardWatch: Boolean(settings.clipboardWatch),
|
clipboardWatch: Boolean(settings.clipboardWatch),
|
||||||
|
|||||||
@@ -6080,7 +6080,7 @@ export function App(): ReactElement {
|
|||||||
maxParallelExtract: [1, 8, 2],
|
maxParallelExtract: [1, 8, 2],
|
||||||
reconnectWaitSeconds: [10, 600, 45],
|
reconnectWaitSeconds: [10, 600, 45],
|
||||||
proxyApiProxyIndex: [1, 100000, 1],
|
proxyApiProxyIndex: [1, 100000, 1],
|
||||||
proxyConnectionsPerDownload: [2, 40, 32]
|
proxyConnectionsPerDownload: [2, 80, 32]
|
||||||
};
|
};
|
||||||
const bounds = numericLimits[fieldId as keyof RendererSettingsDraft];
|
const bounds = numericLimits[fieldId as keyof RendererSettingsDraft];
|
||||||
if (bounds) {
|
if (bounds) {
|
||||||
|
|||||||
@@ -460,9 +460,9 @@ export function buildSettingsFormViewModel({
|
|||||||
label: "Proxy-Verbindungen insgesamt",
|
label: "Proxy-Verbindungen insgesamt",
|
||||||
value: String(settings.proxyConnectionsPerDownload),
|
value: String(settings.proxyConnectionsPerDownload),
|
||||||
min: 2,
|
min: 2,
|
||||||
max: 40,
|
max: 80,
|
||||||
disabled: !settings.proxyDownloadEnabled,
|
disabled: !settings.proxyDownloadEnabled,
|
||||||
help: `Dieses Gesamtlimit wird fair zwischen allen gleichzeitigen Segmentdownloads geteilt. Bei ${settings.maxParallel} aktiven Downloads laufen zusammen höchstens ${settings.proxyConnectionsPerDownload} Segmentverbindungen; 32 ist der Standardwert, 40 das Maximum. Langsame und ausgefallene Proxys werden automatisch zurückgestuft. Kleine Dateien, Teil-Downloads und aktive Geschwindigkeitslimits laufen über den festen API-Proxy.`
|
help: `Dieses Gesamtlimit wird fair zwischen allen gleichzeitigen Segmentdownloads geteilt. Bei ${settings.maxParallel} aktiven Downloads laufen zusammen höchstens ${settings.proxyConnectionsPerDownload} Segmentverbindungen; 32 ist der Standardwert, 80 das Maximum. Langsame und ausgefallene Proxys werden automatisch zurückgestuft. Kleine Dateien, Teil-Downloads und aktive Geschwindigkeitslimits laufen über den festen API-Proxy.`
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -129,10 +129,10 @@ async function createTempDirectory(): Promise<string> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe("proxy segmented download", () => {
|
describe("proxy segmented download", () => {
|
||||||
it("uses 32 connections by default and clamps the configurable maximum to 40", () => {
|
it("uses 32 connections by default and clamps the configurable maximum to 80", () => {
|
||||||
expect(normalizeProxyConnectionLimit(0)).toBe(32);
|
expect(normalizeProxyConnectionLimit(0)).toBe(32);
|
||||||
expect(normalizeProxyConnectionLimit(40)).toBe(40);
|
expect(normalizeProxyConnectionLimit(80)).toBe(80);
|
||||||
expect(normalizeProxyConnectionLimit(999)).toBe(40);
|
expect(normalizeProxyConnectionLimit(999)).toBe(80);
|
||||||
expect(normalizeProxyConnectionLimit(1)).toBe(2);
|
expect(normalizeProxyConnectionLimit(1)).toBe(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -701,7 +701,7 @@ describe("settings views", () => {
|
|||||||
label: "Proxy-Verbindungen insgesamt",
|
label: "Proxy-Verbindungen insgesamt",
|
||||||
value: "16",
|
value: "16",
|
||||||
min: 2,
|
min: 2,
|
||||||
max: 40,
|
max: 80,
|
||||||
help: expect.stringContaining("zusammen höchstens 16 Segmentverbindungen")
|
help: expect.stringContaining("zusammen höchstens 16 Segmentverbindungen")
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -620,7 +620,7 @@ describe("settings storage", () => {
|
|||||||
expect(normalized.proxyDownloadEnabled).toBe(true);
|
expect(normalized.proxyDownloadEnabled).toBe(true);
|
||||||
expect(normalized.proxyListPath).toBe("C:\\proxies.txt");
|
expect(normalized.proxyListPath).toBe("C:\\proxies.txt");
|
||||||
expect(normalized.proxyApiProxyIndex).toBe(100000);
|
expect(normalized.proxyApiProxyIndex).toBe(100000);
|
||||||
expect(normalized.proxyConnectionsPerDownload).toBe(40);
|
expect(normalized.proxyConnectionsPerDownload).toBe(80);
|
||||||
expect(normalized.outputDir).toBe(defaultSettings().outputDir);
|
expect(normalized.outputDir).toBe(defaultSettings().outputDir);
|
||||||
expect(normalized.extractDir).toBe(defaultSettings().extractDir);
|
expect(normalized.extractDir).toBe(defaultSettings().extractDir);
|
||||||
expect(normalized.mkvLibraryDir).toBe(defaultSettings().mkvLibraryDir);
|
expect(normalized.mkvLibraryDir).toBe(defaultSettings().mkvLibraryDir);
|
||||||
|
|||||||
Reference in New Issue
Block a user