{"record":{"id":"d46ca1a85887cdce","repo":"apache/hadoop","slug":"can-t-re-install-the-signal-handlers","errorCode":null,"errorMessage":"Can't re-install the signal handlers.","messagePattern":"Can't re-install the signal handlers\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java","lineNumber":70,"sourceCode":"     * Handle an incoming signal.\n     *\n     * @param signal    The incoming signal\n     */\n    @Override\n    public void handle(SignalUtil.Signal signal) {\n      log.error(\"RECEIVED SIGNAL {}: SIG{}\", signal.getNumber(), signal.getName());\n      prevHandler.handle(signal);\n    }\n  }\n\n  /**\n   * Register some signal handlers.\n   *\n   * @param log The log4j logfile to use in the signal handlers.\n   */\n  public void register(final Logger log) {\n    if (registered) {\n      throw new IllegalStateException(\"Can't re-install the signal handlers.\");\n    }\n    registered = true;\n    StringBuilder bld = new StringBuilder();\n    bld.append(\"registered UNIX signal handlers for [\");\n    final String[] SIGNALS = {\"TERM\", \"HUP\", \"INT\"};\n    String separator = \"\";\n    for (String signalName : SIGNALS) {\n      try {\n        new Handler(signalName, log);\n        bld.append(separator)\n            .append(signalName);\n        separator = \", \";\n      } catch (Exception e) {\n        log.debug(\"Error: \", e);\n      }\n    }\n    bld.append(\"]\");\n    log.info(bld.toString());","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java#L52-L88","documentation":"SignalLogger.INSTANCE.register(Logger) installs Hadoop's handlers for TERM, HUP and INT (built on sun.misc.Signal) that log received signals and chain to the previous handler. The class keeps a one-shot 'registered' flag and throws IllegalStateException on a second registration, because re-installing would chain duplicate handlers and double-log every signal.","triggerScenarios":"Two components in one JVM each calling SignalLogger.INSTANCE.register(log) — e.g. embedding two Hadoop-based clients, a library that self-registers plus application code that registers again, or test setups that register per test in the same forked JVM.","commonSituations":"JUnit suites where @BeforeEach registers signal handlers without reset; combining HBase/Hadoop/YARN client libs in one process; SDK re-initialization code paths that call register() on every connect.","solutions":["Register once per JVM, at process startup (e.g. in main()), not per component or per test","In tests, use @BeforeAll / one-time fixtures, or fork a JVM per test to get a clean SignalLogger","Catch IllegalStateException and ignore it if a dependency may already have registered handlers","Search dependency stack traces for 'registered UNIX signal handlers' INFO line to see who registered first"],"exampleFix":"// before\npublic void init() {\n  SignalLogger.INSTANCE.register(LOG); // called by every component/test -> second call throws\n}\n\n// after\nprivate static final AtomicBoolean signalLogged = new AtomicBoolean(false);\npublic void init() {\n  if (signalLogged.compareAndSet(false, true)) {\n    SignalLogger.INSTANCE.register(LOG);\n  }\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  SignalLogger.INSTANCE.register(LOG);\n} catch (IllegalStateException alreadyRegistered) {\n  // another component in this JVM already installed the handlers; safe to continue\n}","preventionTips":["Call SignalLogger.INSTANCE.register(log) exactly once per JVM, from main() or a static initializer","In test suites, register in @BeforeAll (not @BeforeEach) or fork a JVM per test","When embedding multiple Hadoop-based libraries, agree on a single owner for signal handler registration","Remember this only works on Sun/Oracle JVMs where sun.misc.Signal exists — guard for other JVMs"],"tags":["hadoop","unix-signals","initialization","illegalstate","singleton"],"backgroundTag":"invalid-object-state","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}