





















@@ -36,6 +36,7 @@ let lastRestartEmittedAt = 0;
3636let pendingRestartTimer: ReturnType<typeof setTimeout> | null = null;
3737let pendingRestartDueAt = 0;
3838let pendingRestartReason: string | undefined;
39+let pendingRestartEmitHooks: RestartEmitHooks | undefined;
3940const activeDeferralPolls = new Set<ReturnType<typeof setInterval>>();
40414142function hasUnconsumedRestartSignal(): boolean {
@@ -49,6 +50,7 @@ function clearPendingScheduledRestart(): void {
4950pendingRestartTimer = null;
5051pendingRestartDueAt = 0;
5152pendingRestartReason = undefined;
53+pendingRestartEmitHooks = undefined;
5254}
53555456function clearActiveDeferralPolls(): void {
@@ -202,6 +204,12 @@ export type RestartEmitHooks = {
202204afterEmitRejected?: () => Promise<void>;
203205};
204206207+function updatePendingRestartEmitHooks(hooks?: RestartEmitHooks): void {
208+if (hooks) {
209+pendingRestartEmitHooks = hooks;
210+}
211+}
212+205213async function emitPreparedGatewayRestart(hooks?: RestartEmitHooks): Promise<void> {
206214try {
207215await hooks?.beforeEmit?.();
@@ -482,6 +490,7 @@ export function scheduleGatewaySigusr1Restart(opts?: {
482490restartLog.warn(
483491`restart request coalesced (already scheduled) reason=${reason ?? "unspecified"} pendingReason=${pendingRestartReason ?? "unspecified"} delayMs=${remainingMs} ${formatRestartAudit(opts?.audit)}`,
484492);
493+updatePendingRestartEmitHooks(opts?.emitHooks);
485494return {
486495ok: true,
487496pid: process.pid,
@@ -497,21 +506,24 @@ export function scheduleGatewaySigusr1Restart(opts?: {
497506498507pendingRestartDueAt = requestedDueAt;
499508pendingRestartReason = reason;
509+pendingRestartEmitHooks = opts?.emitHooks;
500510pendingRestartTimer = setTimeout(
501511() => {
502512pendingRestartTimer = null;
503513pendingRestartDueAt = 0;
504514pendingRestartReason = undefined;
515+const emitHooks = pendingRestartEmitHooks;
516+pendingRestartEmitHooks = undefined;
505517const pendingCheck = preRestartCheck;
506518if (!pendingCheck) {
507-void emitPreparedGatewayRestart(opts?.emitHooks);
519+void emitPreparedGatewayRestart(emitHooks);
508520return;
509521}
510522const cfg = getRuntimeConfig();
511523deferGatewayRestartUntilIdle({
512524getPendingCount: pendingCheck,
513525maxWaitMs: cfg.gateway?.reload?.deferralTimeoutMs,
514-emitHooks: opts?.emitHooks,
526+ emitHooks,
515527});
516528},
517529Math.max(0, requestedDueAt - nowMs),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。