Skip to content

Fix server crash when File-Based Debug Logger is enabled#602

Open
Copilot wants to merge 2 commits intomasterfrom
copilot/fix-server-crash-file-debug-logger
Open

Fix server crash when File-Based Debug Logger is enabled#602
Copilot wants to merge 2 commits intomasterfrom
copilot/fix-server-crash-file-debug-logger

Conversation

Copy link
Copy Markdown

Copilot AI commented Mar 30, 2026

Enabling the File-Based Debug Logger causes an immediate server crash via ClassCastException in Grizzly's FilterChainContext.toString(), which propagates through the RxJava pipeline as OnErrorNotImplementedException.

Root Cause

LoggerConfigManager sets the root JUL level to FINEST when the debug logger is enabled. This causes Grizzly's DefaultFilterChain.executeFilter() to enter its logging branch (isLoggable(FINEST) == true) and log the FilterChainContext via SLF4JBridgeHandlerMessageFormatFilterChainContext.toString().

In Grizzly 3.0.1, FilterChainContext.toString() has a bytecode-level bug — decompiling the JAR reveals it emits a checkcast [C (char array cast) on the context message field:

67: invokevirtual #144  // Method getMessage:()Ljava/lang/Object;
70: checkcast     #145  // class "[C"   ← ClassCastException here
73: invokestatic  #146  // Method java/lang/String.valueOf:([C)Ljava/lang/String;

During LDAP write operations, message is a LdapResponseMessage, not a char[] — the cast fails.

Changes

  • LoggerConfigManager.changeJulLogLevel(): Append org.glassfish.grizzly.level=FINE to the JUL config string. This caps Grizzly's effective JUL level at FINE, making isLoggable(FINEST) return false for all Grizzly loggers and bypassing the broken toString() path. Grizzly FINE/WARNING/SEVERE messages continue to flow normally.

  • LdapMessages.LdapResponseMessage: Add toString() override for meaningful diagnostic output when the object appears in log messages.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 1.0.17.172.in-addr.arpa
    • Triggering command: `/usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.forgerock.opendj.gendoc=true -Dorg.opends.server.ServerRoot=/tmp -Dorg.opends.quicksetup.Root=/path/to/opendj -Dcom.forgerock.opendj.ldap.tools.scriptName=control-panel -Dorg.forgerock.opendj.gendoc.trailing=include::./_exit-codes-0-gt0.adoc[]

include::./_control-panel-examples.adoc[]

-classpath /home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/opendj/lib/bootstrap.jar:/home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/dependency/freemarker-2.3.34.jar org.opends.guitools.controlpanel.ControlPanelLauncher --help /work/OpenDJ/Ope352:353:355 r --no�� --noprofile jar ndor/bin/git orting-api/3.0/m/usr/lib/jvm/temurin-17-jdk-amd64/lib/jspawnhelper` (dns block)

  • Triggering command: `/usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.forgerock.opendj.gendoc=true -Dorg.opends.server.ServerRoot=/tmp -Dorg.opends.quicksetup.Root=/path/to/opendj -Dcom.forgerock.opendj.ldap.tools.scriptName=setup -Dorg.forgerock.opendj.gendoc.trailing=include::./_exit-codes-0-gt0.adoc[]

include::./_setup-examples.adoc[]

-classpath /home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/opendj/lib/bootstrap.jar:/home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/dependency/freemarker-2.3.34.jar org.opends.quicksetup.installer.SetupLauncher --help cal/bin/jar head mpil��` (dns block)

  • Triggering command: `/usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.forgerock.opendj.gendoc=true -Dorg.opends.server.ServerRoot=/tmp -Dorg.opends.quicksetup.Root=/path/to/opendj -Dcom.forgerock.opendj.ldap.tools.scriptName=uninstall -Dorg.forgerock.opendj.gendoc.trailing=include::./_exit-codes-0-gt0.adoc[]

include::./_uninstall-examples.adoc[]

-classpath /home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/opendj/lib/bootstrap.jar:/home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/dependency/freemarker-2.3.34.jar org.opends.guitools.uninstaller.UninstallLauncher --help /usr/bin/jar er e-ma�� --noprofile refirebooter-20260330092139437_359.jar er .0.jar` (dns block)

  • 6.0.a.9.d.a.e.f.f.f.2.5.e.1.e.7.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa
    • Triggering command: `/usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.forgerock.opendj.gendoc=true -Dorg.opends.server.ServerRoot=/tmp -Dorg.opends.quicksetup.Root=/path/to/opendj -Dcom.forgerock.opendj.ldap.tools.scriptName=control-panel -Dorg.forgerock.opendj.gendoc.trailing=include::./_exit-codes-0-gt0.adoc[]

include::./_control-panel-examples.adoc[]

-classpath /home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/opendj/lib/bootstrap.jar:/home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/dependency/freemarker-2.3.34.jar org.opends.guitools.controlpanel.ControlPanelLauncher --help /work/OpenDJ/Ope352:353:355 r --no�� --noprofile jar ndor/bin/git orting-api/3.0/m/usr/lib/jvm/temurin-17-jdk-amd64/lib/jspawnhelper` (dns block)

  • Triggering command: `/usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.forgerock.opendj.gendoc=true -Dorg.opends.server.ServerRoot=/tmp -Dorg.opends.quicksetup.Root=/path/to/opendj -Dcom.forgerock.opendj.ldap.tools.scriptName=setup -Dorg.forgerock.opendj.gendoc.trailing=include::./_exit-codes-0-gt0.adoc[]

include::./_setup-examples.adoc[]

-classpath /home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/opendj/lib/bootstrap.jar:/home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/dependency/freemarker-2.3.34.jar org.opends.quicksetup.installer.SetupLauncher --help cal/bin/jar head mpil��` (dns block)

  • Triggering command: `/usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.forgerock.opendj.gendoc=true -Dorg.opends.server.ServerRoot=/tmp -Dorg.opends.quicksetup.Root=/path/to/opendj -Dcom.forgerock.opendj.ldap.tools.scriptName=uninstall -Dorg.forgerock.opendj.gendoc.trailing=include::./_exit-codes-0-gt0.adoc[]

include::./_uninstall-examples.adoc[]

-classpath /home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/opendj/lib/bootstrap.jar:/home/REDACTED/work/OpenDJ/OpenDJ/opendj-doc-generated-ref/target/dependency/freemarker-2.3.34.jar org.opends.guitools.uninstaller.UninstallLauncher --help /usr/bin/jar er e-ma�� --noprofile refirebooter-20260330092139437_359.jar er .0.jar` (dns block)

  • central.sonatype.com
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.14/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.14/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.14 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.14/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenDJ/OpenDJ org.codehaus.plexus.classworlds.launcher.Launcher dependency:resolve -pl opendj-grizzly -Dclassifier=sources -q (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.14/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.14/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.14 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.14/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenDJ/OpenDJ org.codehaus.plexus.classworlds.launcher.Launcher compile -pl opendj-core,opendj-server-legacy -am -q (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.14/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.14/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.14 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.14/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenDJ/OpenDJ org.codehaus.plexus.classworlds.launcher.Launcher install -pl opendj-maven-plugin -q ork/4.0.2/grizzly-framework-4.0.2-sources.jar (dns block)
  • https://api.github.com/repos/OpenIdentityPlatform/OpenDJ/releases/latest
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.14/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.14/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.14 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.14/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenDJ/OpenDJ org.codehaus.plexus.classworlds.launcher.Launcher install -DskipTests --no-transfer-progress -q /home/REDACTED/.m2java.base/java.lang.reflect=ALL-UNNAMED 60330092139437_341.jar p/bin/bash (http block)

If you need me to access, download, or install something from one of these locations, you can either:


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

When the debug logger is enabled, LoggerConfigManager sets root JUL level
to FINEST which makes Grizzly's DefaultFilterChain.executeFilter() check
isLoggable(FINEST)=true and log the FilterChainContext object.

In Grizzly 3.0.1, FilterChainContext.toString() has a bytecode bug where
it does a checkcast to char[] on the message field. When the message is
a LdapResponseMessage, the cast fails with ClassCastException that
propagates through the RxJava pipeline causing a server crash.

Fix: Limit org.glassfish.grizzly JUL logging to FINE level so that
isLoggable(FINEST) returns false, preventing the broken code path.

Also add toString() to LdapResponseMessage for better diagnostics.

Agent-Logs-Url: https://github.com/OpenIdentityPlatform/OpenDJ/sessions/73a4bf17-653a-4ea6-b379-6a220c9059db

Co-authored-by: vharseko <6818498+vharseko@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix server crash when file-based debug logger is enabled Fix server crash when File-Based Debug Logger is enabled Mar 30, 2026
Copilot AI requested a review from vharseko March 30, 2026 09:33
@vharseko vharseko requested a review from maximthomas March 30, 2026 09:35
@vharseko vharseko marked this pull request as ready for review March 30, 2026 09:35
Copy link
Copy Markdown
Contributor

@maximthomas maximthomas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested locally, works fine with File-Based Debug Logger enabled

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ver 5.x Server Crash When File-Based Debug Logger is enabled

3 participants