Fix Save Value to File for large debugger strings (#9452) - #9534
kamilkrzywanski wants to merge 2 commits into
Conversation
Keep shortened-string metadata in a strong map and resolve quoted Variable.getValue() forms so Save can stream the full remote content instead of the truncated 100k+"..." preview.
| public final class ShortenedStrings { | ||
|
|
||
| private static final Map<String, StringInfo> infoStrings = new WeakHashMap<String, StringInfo>(); | ||
| private static final Map<String, StringInfo> infoStrings = new HashMap<String, StringInfo>(); |
There was a problem hiding this comment.
What is the reason to switch from WeakHashMap to HashMap. The full strings are looked up by a string and if the key goes out of scope it makes sense, that the referenced value is removed.
There was a problem hiding this comment.
@matthiasblaesing the WeakHashMap key is the shortened display string. Lookup often uses a different String instance (or a quoted Variable.getValue() form), so the entry can disappear while the UI still shows the truncated value and Save only writes that preview.
HashMap keeps it for the session; we still clear on last session remove. Also added quoted-form lookup.
Explain that WeakHashMap drops entries when the UI holds a different String instance (or quoted Variable.getValue form) than the map key. Signed-off-by: Kamil Krzywanski <kamilkrzywanski01@gmail.com>
|
@kamilkrzywanski sorry for the late reply. I looked into this and while the changes improve the situation, it still felt off to me. The core problem for me is: Using string prefixes as keys for the full string. This is prone to collisions. I stepped back and considered the situation from a different perspective: for short string we don't need special handling as the value itself can be fetched and we are done. Caching the strings can help performance though. Special casing is only needed for the long strings and for these the approach suggested by #9635 is to return a special object Would you mind having a look at #9635 and test that approach? The nightly build is available from: https://github.com/apache/netbeans/suites/97240182404/artifacts/10773115996 (or via the checks page of the PR) |
Summary
HashMapsogetShortenedInfo()still resolves after GC (previously aWeakHashMapcould drop the entry while the truncated...display value was still shown).Variable.getValue()forms ("content...") when looking up shortened info....instead of streaming the full remote string viaStringInfo.getContent().Fixes #9452
Test plan
Stringlarger than 100_000 characters...) and choose Save Value to FileStandalone verification of the lookup failure mode:
WeakHashMap, after GC of the map key, lookup of an equal display string returns null → save would write the truncated previewHashMap, lookup still succeeds → save can usegetContent()