Skip to content

Supress JavaFX VirtualFlow Info log noise for large libraries (10k+).#15298

Merged
Siedlerchr merged 4 commits into
JabRef:mainfrom
faneeshh:fix-12534
Mar 9, 2026
Merged

Supress JavaFX VirtualFlow Info log noise for large libraries (10k+).#15298
Siedlerchr merged 4 commits into
JabRef:mainfrom
faneeshh:fix-12534

Conversation

@faneeshh

@faneeshh faneeshh commented Mar 9, 2026

Copy link
Copy Markdown
Collaborator

Related issues and pull requests

Closes #12534

PR Description

When we opened any large library with around 10k entries, console ListView triggers an info level log message from JavaFX's VirtualFlow ("index exceeds maxCellCount") due to a known upstream JavaFX bug (JDK-8089472, JDK-8296871) that occurs when scrollTo is called while the list is still being populated. Since this cannot be fixed in JabRef itself this PR suppresses the noisy log message by adding a single line to tinylog.properties to set VirtualFlow's log level to warn.

Steps to test

  1. Open JabRef
  2. Load a .bib file with 10k+ entries ( You can generate one using a python script )
  3. Notice that no "index exceeds maxCellCount" message appears in the console output

Checklist

  • I own the copyright of the code submitted and I license it under the MIT license
  • I manually tested my changes in running JabRef (always required)
  • [/] I added JUnit tests for changes (if applicable)
  • [/] I added screenshots in the PR description (if change is visible to the user)
  • [/] I added a screenshot in the PR description showing a library with a single entry with me as author and as title the issue number
  • [/] I described the change in CHANGELOG.md in a way that can be understood by the average user (if change is visible to the user)
  • I checked the user documentation for up to dateness and submitted a pull request to our user documentation repository

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Suppress JavaFX VirtualFlow log noise for large libraries

🐞 Bug fix

Grey Divider

Walkthroughs

Description
• Suppress JavaFX VirtualFlow log noise for large libraries
• Prevents "index exceeds maxCellCount" warnings from upstream JavaFX bug
• Avoids StackOverflowError when error console is open
• Updated changelog with user-facing change description
Diagram
flowchart LR
  A["JavaFX VirtualFlow<br/>Info Log Messages"] -- "Set log level to warn" --> B["tinylog.properties<br/>Configuration"]
  B --> C["Reduced Console<br/>Noise"]
  C --> D["No StackOverflowError<br/>in Error Console"]
Loading

Grey Divider

File Changes

1. jabgui/src/main/resources/tinylog.properties ⚙️ Configuration changes +1/-0

Configure VirtualFlow log level to warn

• Added log level configuration for javafx.scene.control.skin.VirtualFlow set to warn
• Suppresses info-level log messages from JavaFX's VirtualFlow that occur when scrolling large lists
• Addresses known upstream JavaFX bug (JDK-8089472, JDK-8296871)

jabgui/src/main/resources/tinylog.properties


2. CHANGELOG.md 📝 Documentation +1/-0

Document VirtualFlow log suppression change

• Added entry documenting suppression of JavaFX internal 'index exceeds maxCellCount' warnings
• Explains that warnings stem from known upstream JavaFX bug
• Notes that suppression prevents StackOverflowError in error console
• References issue #12534

CHANGELOG.md


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (1) 📎 Requirement gaps (0)

Grey Divider


Remediation recommended

1. Changelog too technical📘 Rule violation ✓ Correctness
Description
The new CHANGELOG.md entry includes highly technical/internal terms (index exceeds maxCellCount,
StackOverflowError) and may be imprecise about the log level/wording (“warnings”), reducing
clarity for end users. This risks violating the requirement that release notes be end-user focused
and precisely worded.
Code

CHANGELOG.md[19]

+- We no longer show JavaFX internal 'index exceeds maxCellCount' warnings in the error console as these stem from a known upstream JavaFX bug and were causing a StackOverflowError when the error console was open. [#12534](https://github.com/JabRef/jabref/issues/12534)
Evidence
PR Compliance ID 28 requires end-user focused changelog entries, and PR Compliance ID 32 requires
user-facing text to be precise and professional; the added line contains internal JavaFX message
text and a Java exception name that are likely too technical and potentially imprecise for typical
release notes.

AGENTS.md
CHANGELOG.md[19-19]
Best Practice: Learned patterns

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new `CHANGELOG.md` entry is likely too technical for end users (mentions internal JavaFX message text and `StackOverflowError`) and may be imprecise about what was suppressed.
## Issue Context
Changelog entries should be understandable by average users and use precise wording.
## Fix Focus Areas
- CHANGELOG.md[19-19]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Warn threshold may not suppress🐞 Bug ⛯ Reliability
Description
The CHANGELOG describes suppressing JavaFX VirtualFlow “warnings”, but the added tinylog rule sets
the logger threshold to WARN, which will still allow WARNING/WARN logs through. If the upstream
message is logged at WARNING on some JavaFX versions/configurations, this change won’t actually
suppress it.
Code

jabgui/src/main/resources/tinylog.properties[17]

+level@javafx.scene.control.skin.VirtualFlow = warn
Evidence
The PR claims “warnings” are being hidden, but the implemented configuration only suppresses
messages below WARN. Therefore, if the upstream message is indeed a warning-level record (as implied
by the CHANGELOG), it would not be filtered by this rule. The codebase already uses a JUL filter for
noisy JavaFX logs, which would be a more robust way to suppress a specific message regardless of its
level.

CHANGELOG.md[17-21]
jabgui/src/main/resources/tinylog.properties[10-21]
jabgui/src/main/java/org/jabref/Launcher.java[115-128]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The current change uses a tinylog logger threshold (`level@... = warn`). This only suppresses messages below WARN and may not suppress the targeted VirtualFlow message if it is emitted as a warning (as implied by the CHANGELOG).
## Issue Context
JabRef already installs a `java.util.logging.Filter` to suppress known-noisy JavaFX CSS warnings early in startup. A similar approach can precisely suppress `&amp;amp;quot;index exceeds maxCellCount&amp;amp;quot;` regardless of whether JavaFX logs it at INFO or WARNING, and without suppressing other VirtualFlow diagnostics.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/Launcher.java[115-128]
- jabgui/src/main/java/org/jabref/gui/logging/JavaFxCssLogFilter.java[8-62]
- jabgui/src/main/resources/tinylog.properties[10-21]
- CHANGELOG.md[17-21]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Suppression is global & broad 🐞 Bug ✓ Correctness
Description
Raising VirtualFlow’s logger threshold to WARN suppresses all INFO logs from that logger across all
sinks (error console, console output, and the rolling log file). This is broader than “hide one
noisy message” and can remove potentially useful JavaFX diagnostics from bug reports.
Code

jabgui/src/main/resources/tinylog.properties[17]

+level@javafx.scene.control.skin.VirtualFlow = warn
Evidence
The GUI uses a tinylog Writer (GuiWriter) to feed the Error Console via a shared LogMessages
buffer, and startup config adds a rolling file writer; tinylog logger thresholds apply before
messages reach any writer. Therefore this change affects the error console and persisted logs, and
it suppresses all INFO for the VirtualFlow logger (not only the specific message).

jabgui/src/main/resources/tinylog.properties[1-21]
jabgui/src/main/java/org/jabref/gui/logging/GuiWriter.java[21-29]
jabgui/src/main/java/org/jabref/Launcher.java[149-158]
jabgui/src/main/java/org/jabref/gui/errorconsole/LogEventViewModel.java[25-45]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The tinylog rule suppresses *all* INFO logs from `javafx.scene.control.skin.VirtualFlow` globally. This can hide other potentially useful diagnostics and removes them from on-disk logs used for troubleshooting.
## Issue Context
The error console is populated via `GuiWriter -&amp;amp;gt; LogMessages`, and JabRef also configures a rolling log file writer at startup. Logger-threshold changes apply before events reach any writer.
## Fix Focus Areas
- jabgui/src/main/resources/tinylog.properties[1-21]
- jabgui/src/main/java/org/jabref/gui/logging/GuiWriter.java[21-29]
- jabgui/src/main/java/org/jabref/Launcher.java[115-128]
- jabgui/src/main/java/org/jabref/gui/logging/JavaFxCssLogFilter.java[8-62]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@testlens-app

This comment has been minimized.

koppor
koppor previously requested changes Mar 9, 2026
Comment thread CHANGELOG.md Outdated

### Changed

- We no longer show JavaFX internal 'index exceeds maxCellCount' warnings in the error console as these stem from a known upstream JavaFX bug and were causing a StackOverflowError when the error console was open. [#12534](https://github.com/JabRef/jabref/issues/12534)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Which "StackOverflowerror"? I did not see in the bug report.

Please shorten the text.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think the SO error was in the logs from @ThiloteE

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It was a link to StackOverflow. Thus, this CHANGELOG.md entry seems to be AI-generated.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Before @calixtus added the hotfix at #15288 it was leading to a StackOverflow error considering the logs from @ThiloteE whenever a broken PDF was linked. I was honestly just working on 3-4 interconnected problems at once so I got that part wrong but yeah since the error isn't happening anymore I'll take it off the CHANGELOG.

level@ai.djl = info
level@io.zonky.test.db.postgres.embedded = warn
level@org.freedesktop.dbus.connections.transports.TransportBuilder = warn
level@javafx.scene.control.skin.VirtualFlow = warn

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please sort this group of "level@" alphabetically.

@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: no-bot-comments labels Mar 9, 2026
@calixtus

calixtus commented Mar 9, 2026

Copy link
Copy Markdown
Member

Does the actual log message appear somewhere to the user or is this a developer console thing?

If not user facing: remove changelog entry at all

@ThiloteE

ThiloteE commented Mar 9, 2026

Copy link
Copy Markdown
Member

Somebody mentioned that fixed-cell-size gets rid of the warnings: https://stackoverflow.com/a/54349820, but that's probably a no go for us?

@faneeshh

faneeshh commented Mar 9, 2026

Copy link
Copy Markdown
Collaborator Author

Does the actual log message appear somewhere to the user or is this a developer console thing?

If not user facing: remove changelog entry at all

It's a developer console thing, should I remove the entry then? @koppor

@calixtus

calixtus commented Mar 9, 2026

Copy link
Copy Markdown
Member

Im not @koppor, but im a maintainer as well. Yes, remove it. Changelog is only for user facing changes.

@testlens-app

testlens-app Bot commented Mar 9, 2026

Copy link
Copy Markdown

✅ All tests passed ✅

🏷️ Commit: 7fc510e
▶️ Tests: 10126 executed
⚪️ Checks: 61/61 completed


Learn more about TestLens at testlens.app.

@faneeshh

faneeshh commented Mar 9, 2026

Copy link
Copy Markdown
Collaborator Author

Im not @koppor, but im a maintainer as well. Yes, remove it. Changelog is only for user facing changes.

Noted. I've removed it. Also when I open CHANGELOG in my InteliJ it opens some different Changelog file with the title Unreleased : 2025-01-07. But when I run the command code CHANGELOG.md this opens the correct file in VS Code. Do you have any clue why this is happening?

@github-actions github-actions Bot added status: no-bot-comments and removed status: changes-required Pull requests that are not yet complete labels Mar 9, 2026
@koppor

koppor commented Mar 9, 2026

Copy link
Copy Markdown
Member

Noted. I've removed it. Also when I open CHANGELOG in my InteliJ it opens some different Changelog file with the title Unreleased : 2025-01-07. But when I run the command code CHANGELOG.md this opens the correct file in VS Code. Do you have any clue why this is happening?

Wrong path maybe?

@Siedlerchr Siedlerchr added this pull request to the merge queue Mar 9, 2026
@github-actions github-actions Bot added the status: to-be-merged PRs which are accepted and should go into the merge-queue. label Mar 9, 2026
Merged via the queue into JabRef:main with commit a4ecec8 Mar 9, 2026
60 of 61 checks passed
Siedlerchr added a commit to statxc/jabref that referenced this pull request Mar 10, 2026
* upstream/main: (59 commits)
  Fix 15000 identifier (JabRef#15286)
  Chore(deps): Bump dev.langchain4j:langchain4j-bom in /versions (JabRef#15305)
  Supress JavaFX VirtualFlow Info log noise for large libraries (10k+). (JabRef#15298)
  Chore(deps): Bump commons-logging:commons-logging in /versions (JabRef#15304)
  Fix merge dialog closing immediately when only one PDF importer returns metadata (JabRef#15127) (JabRef#15287)
  Fixed nullable eventhandlers (JabRef#15288)
  New Crowdin updates (JabRef#15285)
  Fix the ESC key for GlobalSearchResultDialog (JabRef#15259)
  Remove jbang plugin banner (JabRef#15282)
  Chore(deps): Bump org.apache.httpcomponents.core5:httpcore5 in /versions (JabRef#15281)
  Udpate to latest gradle master (JabRef#15279)
  Migrate to GemsFX Notifications (JabRef#14762)
  Chore(deps): Bump JetBrains/junie-github-action from 0 to 1 (JabRef#15272)
  Chore(deps): Bump docker/setup-qemu-action from 3 to 4 (JabRef#15269)
  Feature/citation count dropdown (JabRef#15216)
  Update dependency org.apache.maven.plugins:maven-resources-plugin to v3.5.0 (JabRef#15275)
  Chore(deps): Bump jablib/src/main/resources/csl-styles (JabRef#15273)
  Fix more security
  Fix pr_body leakage
  Chore: add dependency-management.md (JabRef#15278)
  ...
FynnianB pushed a commit to FynnianB/jabref that referenced this pull request Mar 14, 2026
…JabRef#15298)

* Supress JavaFX VirtualFlow Info log noise for large libraries.

* Changelog

* Arranged tinylog alphabetically

* Removed changelog entry
FynnianB pushed a commit to FynnianB/jabref that referenced this pull request Mar 19, 2026
…JabRef#15298)

* Supress JavaFX VirtualFlow Info log noise for large libraries.

* Changelog

* Arranged tinylog alphabetically

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

Labels

status: no-bot-comments status: to-be-merged PRs which are accepted and should go into the merge-queue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

index exceeds cell count

5 participants