diff --git a/packages/cache/src/internal/downloadUtils.ts b/packages/cache/src/internal/downloadUtils.ts index 9cde1f4f..af2a46f1 100644 --- a/packages/cache/src/internal/downloadUtils.ts +++ b/packages/cache/src/internal/downloadUtils.ts @@ -13,6 +13,8 @@ import {SocketTimeout} from './constants' import {DownloadOptions} from '../options' import {retryHttpClientResponse} from './requestUtils' +import { AbortController } from "@azure/abort-controller"; + /** * Pipes the body of a HTTP response to a stream * @@ -248,7 +250,8 @@ export async function downloadCacheStorageSDK( try { downloadProgress.startDisplayTimer() - + const controller = new AbortController(); + const abortSignal = controller.signal; while (!downloadProgress.isDone()) { const segmentStart = downloadProgress.segmentOffset + downloadProgress.segmentSize @@ -264,14 +267,16 @@ export async function downloadCacheStorageSDK( segmentStart, segmentSize, { + abortSignal: abortSignal, concurrency: options.downloadConcurrency, onProgress: downloadProgress.onProgress() } ), - timer.setTimeout(60 * 60 * 1000, 'timeout')]); + timer.setTimeout(options.abortTimeInMs, 'timeout')]); if(result === 'timeout') { - throw new Error("Segment download timed out"); + controller.abort(); + throw new Error("Download aborted, segment download timed out."); } fs.writeFileSync(fd, result) diff --git a/packages/cache/src/options.ts b/packages/cache/src/options.ts index 94642fd3..bc0c03b7 100644 --- a/packages/cache/src/options.ts +++ b/packages/cache/src/options.ts @@ -45,7 +45,16 @@ export interface DownloadOptions { * * @default 30000 */ - timeoutInMs?: number + timeoutInMs?: number + + + /** + * Time after which download should be aborted if stuck + * + * @default 2700000 + */ + abortTimeInMs?: number + } /** @@ -84,7 +93,8 @@ export function getDownloadOptions(copy?: DownloadOptions): DownloadOptions { const result: DownloadOptions = { useAzureSdk: true, downloadConcurrency: 8, - timeoutInMs: 30000 + timeoutInMs: 30000, + abortTimeInMs: 2700000 } if (copy) { @@ -99,11 +109,16 @@ export function getDownloadOptions(copy?: DownloadOptions): DownloadOptions { if (typeof copy.timeoutInMs === 'number') { result.timeoutInMs = copy.timeoutInMs } + + if (typeof copy.abortTimeInMs === 'number') { + result.abortTimeInMs = copy.abortTimeInMs + } } core.debug(`Use Azure SDK: ${result.useAzureSdk}`) core.debug(`Download concurrency: ${result.downloadConcurrency}`) core.debug(`Request timeout (ms): ${result.timeoutInMs}`) + core.debug(`Abort time (ms): ${result.abortTimeInMs}`) return result }