GitHub
07/13/2026, 3:08 AMmeltano run (on Unix at least) delivers SIGINT to the entire foreground process group.
So Meltano, the tap, and the target each get their own SIGINT copy simultaneously. Then Meltano's SIGINT handling sends SIGTERM explicitly to each plugin subprocess, so plugins receive two signals.
This change avoids re-entry when we're already dealing with a cancellation signal.
Links
• meltano/meltano#10155
Summary by Sourcery
Make plugin and target termination handling idempotent to avoid duplicate shutdown on multiple signals.
Bug Fixes:
• Ignore duplicate termination signals during plugin shutdown to prevent repeated graceful exits.
• Ignore duplicate termination signals during target sink draining to avoid re-running the drain process.
Tests:
• Add tests ensuring plugin termination handler exits once and is no-op on subsequent signals.
• Add tests ensuring target drains sinks only once when multiple termination signals are received.
Summary by Sourcery
Make plugin and target termination handling idempotent so duplicate OS and orchestrator signals do not trigger repeated shutdown or drain operations.
Bug Fixes:
• Prevent plugins from re-running shutdown logic when multiple termination signals are received.
• Prevent targets from re-draining sinks when duplicate termination signals arrive mid-drain.
Tests:
• Add tests verifying plugin termination handler exits once and is a no-op on subsequent signals.
• Add tests verifying targets drain sinks only once when multiple termination signals are delivered during shutdown.
meltano/sdkGitHub
07/13/2026, 3:08 AMGitHub
07/13/2026, 4:56 PM