diff --git a/lib/modules/platform/github/index.spec.ts b/lib/modules/platform/github/index.spec.ts index 0c615eb6909d332920e1a7edf6b8afd2983b06d1..696919b49b42715645d41a5a2e7506b9733cccd5 100644 --- a/lib/modules/platform/github/index.spec.ts +++ b/lib/modules/platform/github/index.spec.ts @@ -22,6 +22,7 @@ const githubApiHost = 'https://api.github.com'; jest.mock('delay'); jest.mock('../../../util/host-rules'); +jest.mock('../../../util/http/queue'); const hostRules: jest.Mocked<typeof _hostRules> = mocked(_hostRules); jest.mock('../../../util/git'); diff --git a/lib/util/http/queue.ts b/lib/util/http/queue.ts index e24a588a6a7fa32a5b88068d958c9f47811a5f8d..71b387a93be0d819e27b0d195ce4874ab25a5ce2 100644 --- a/lib/util/http/queue.ts +++ b/lib/util/http/queue.ts @@ -1,12 +1,15 @@ import PQueue from 'p-queue'; +import { logger } from '../../logger'; import { parseUrl } from '../url'; import { getRequestLimit } from './host-rules'; -const hostQueues = new Map<string | null, PQueue | null>(); +const hostQueues = new Map<string, PQueue | null>(); export function getQueue(url: string): PQueue | null { const host = parseUrl(url)?.host; if (!host) { + // should never happen + logger.debug({ url }, 'No host'); return null; } @@ -15,7 +18,10 @@ export function getQueue(url: string): PQueue | null { queue = null; // null represents "no queue", as opposed to undefined const concurrency = getRequestLimit(url); if (concurrency) { + logger.debug({ concurrency, host }, 'Using queue'); queue = new PQueue({ concurrency }); + } else { + logger.debug({ host }, 'No concurency limits'); } } hostQueues.set(host, queue); diff --git a/lib/workers/global/index.ts b/lib/workers/global/index.ts index 1ca3dfce70d694837f50ab322e75fbce44612fe0..75a0daf0728f8b8519f6be736151b0ef7283bc72 100644 --- a/lib/workers/global/index.ts +++ b/lib/workers/global/index.ts @@ -17,6 +17,7 @@ import { CONFIG_PRESETS_INVALID } from '../../constants/error-messages'; import { pkg } from '../../expose.cjs'; import { getProblems, logger, setMeta } from '../../logger'; import * as hostRules from '../../util/host-rules'; +import * as queue from '../../util/http/queue'; import * as repositoryWorker from '../repository'; import { autodiscoverRepositories } from './autodiscover'; import { parseConfigs } from './config/parse'; @@ -152,6 +153,10 @@ export async function start(): Promise<number> { repoConfig.hostRules.forEach((rule) => hostRules.add(rule)); repoConfig.hostRules = []; } + + // host rules can change concurrency + queue.clear(); + await repositoryWorker.renovateRepository(repoConfig); setMeta({}); } diff --git a/lib/workers/repository/init/merge.ts b/lib/workers/repository/init/merge.ts index d7b3a52ab0a6ba7fe8743c1e88150428c3b99e63..2973e41c26de8d6cac1865cce61c7f9d9963e549 100644 --- a/lib/workers/repository/init/merge.ts +++ b/lib/workers/repository/init/merge.ts @@ -21,6 +21,7 @@ import { getCache } from '../../../util/cache/repository'; import { readLocalFile } from '../../../util/fs'; import { getFileList } from '../../../util/git'; import * as hostRules from '../../../util/host-rules'; +import * as queue from '../../../util/http/queue'; import type { RepoFileConfig } from './types'; async function detectConfigFile(): Promise<string | null> { @@ -255,6 +256,8 @@ export async function mergeRenovateConfig( ); } } + // host rules can change concurrency + queue.clear(); delete resolvedConfig.hostRules; } returnConfig = mergeChildConfig(returnConfig, resolvedConfig);