Skip to content

[BUG] Logging client shutdown hooks throw before invoking close0 #7686

Closed

Description

@Aias00

Current behavior

AbstractLogConsumeClient.initClient() registers new Thread(this::close) as a JVM shutdown hook. close() first calls Runtime.removeShutdownHook(...), outside its exception handler. Once JVM shutdown has begun, removing a hook throws IllegalStateException: Shutdown in progress; execution never reaches close0().

Location

Impact and priority

P2 / Medium. The fallback JVM-shutdown cleanup path is broken for logging clients using this base class. Backend cleanup and any flushing implemented in close0() are skipped. Other framework cleanup may run first in a particular deployment, so the report does not claim every shutdown loses logs.

Reproduction and evidence

Compile the current base class with a minimal subclass whose initClient0() returns true, and whose close0() prints a marker. Call initClient(new GenericGlobalConfig()), then System.exit(0) in a child JVM.

Observed output on Java 17:

INITIALIZED
EXITING
Exception in thread "Thread-0" java.lang.IllegalStateException: Shutdown in progress
    at java.base/java.lang.ApplicationShutdownHooks.remove(ApplicationShutdownHooks.java:82)
    at java.base/java.lang.Runtime.removeShutdownHook(Runtime.java:245)
    at org.apache.shenyu.plugin.logging.common.client.AbstractLogConsumeClient.close(AbstractLogConsumeClient.java:87)

The close0() marker is never printed. This is an executable reproduction of the current base-class lifecycle, not an assertion about every external logging backend.

Expected behavior / suggested fix

Shutdown-hook removal must not prevent resource cleanup. Handle the JVM-shutdown case separately or tolerate IllegalStateException around hook removal, and make cleanup idempotent across explicit close and the hook.

Related existing work

Searched all 3,074 existing issue titles and targeted live searches. #6886 and #6768 concern extra/untracked hooks; #6763 concerns buffered records in the collector. This report is the independent base-client exception that prevents its own hook from reaching cleanup.

Environment

Apache ShenYu 2.7.2-SNAPSHOT, master@66d7d954ca37d651a5ad916f988a8081157a7ab4; Java 17. Unit-test and CI issue categories excluded.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions