#21117 closed defect (fixed)
multiple value_templates in one preset make cpu go 100% and exhaust memory
Reported by: | Owned by: | Don-vip | |
---|---|---|---|
Priority: | major | Milestone: | 21.07 |
Component: | Core | Version: | |
Keywords: | template_report | Cc: |
Description (last modified by )
What steps will reproduce the problem?
- Add multiple value_template fields to one preset.
- Type into fields.
What is the expected result?
The preset dialog works.
What happens instead?
CPU usage goes 100% and memory usage increases rapidly and steadily. Program gets very slow, nearly unresponsive. Must kill before it eats up all memory.
Please provide any additional information below. Attach a screenshot if possible.
Similar to #20888. Example preset attached.
Relative:URL: ^/trunk Repository:UUID: 0c6e7542-c601-0410-84e7-c038aed88b3b Last:Changed Date: 2021-07-12 02:41:41 +0200 (Mon, 12 Jul 2021) Revision:18004 Build-Date:2021-07-12 00:42:49 URL:https://josm.openstreetmap.de/svn/trunk Identification: JOSM/1.5 (18004 en) Linux Debian GNU/Linux 11 (bullseye) Memory Usage: 1280 MB / 16060 MB (1054 MB allocated, but free) Java version: 11.0.12-ea+6-post-Debian-1, Debian, OpenJDK 64-Bit Server VM Look and Feel: com.sun.java.swing.plaf.gtk.GTKLookAndFeel Screen: :0.0 3840×2160 (scaling 1.00×1.00) Maximum Screen Size: 3840×2160 Best cursor sizes: 16×16→16×16, 32×32→32×32 Environment variable LANG: en_US.UTF-8 System property file.encoding: UTF-8 System property sun.jnu.encoding: UTF-8 Locale info: en_US Numbers with default locale: 1234567890 -> 1234567890 Desktop environment: X-Cinnamon Java package: openjdk-11-jre:amd64-11.0.12+6-1 Java ATK Wrapper package: libatk-wrapper-java:all-0.38.0-2 libcommons-compress-java: libcommons-compress-java:all-1.20-1 libcommons-logging-java: libcommons-logging-java:all-1.2-2 fonts-noto: fonts-noto:all-20201225-1 liboauth-signpost-java: liboauth-signpost-java:all-1.2.1.2-3 VM arguments: [--add-modules=java.scripting,java.sql, -Djosm.restart=true, -Djava.net.useSystemProxies=true] Plugins: + Mapillary (2.0.0-alpha.26-dirty) + apache-commons (35524) + apache-http (35589) + ejml (35458) + geotools (35458) + graphview (35640) + jaxb (35543) + jna (35662) + jts (35458) + log4j (35458) + opendata (35640) + reverter (35732) + routes (35543) + utilsplugin2 (35691) Tagging presets: + ${HOME}/prj/hikemap/josm/data/defaultpresets.xml + ${HOME}/prj/hikemap/josm/mypresets.xml + ${HOME}/prj/hikemap/josm/hikingroutepreset.xml Map paint styles: + ${HOME}/prj/hikemap/josm/elemstyles.mapcss + https://pasharm.github.io/New_basic_style_for_JOSM/New_basic_style.mapcss + ${HOME}/prj/hikemap/josm/hiking.mapcss + ${HOME}/prj/hikemap/josm/bus.mapcss - ${HOME}/prj/hikemap/josm/mtb.mapcss - ${HOME}/prj/hikemap/josm/piste.mapcss - ${HOME}/prj/hikemap/josm/milestone.mapcss + ${HOME}/prj/hikemap/josm/my_style.mapcss - ${HOME}/prj/hikemap/josm/bicycle.mapcss - https://josm.openstreetmap.de/josmfile?page=Styles/Maxspeed&zip=1 - https://josm.openstreetmap.de/josmfile?page=Styles/HiDPISupport&zip=1
Attachments (1)
Change History (9)
by , 4 years ago
Attachment: | hikingroutepreset.xml added |
---|
comment:1 by , 4 years ago
Description: | modified (diff) |
---|
comment:2 by , 4 years ago
Keywords: | performance added |
---|---|
Priority: | normal → major |
comment:3 by , 4 years ago
Milestone: | → 21.07 |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:5 by , 4 years ago
Keywords: | performance removed |
---|
comment:6 by , 4 years ago
May I propose a simpler and more correct fix.
The root of the problems is that the test if (source != this) {
is insufficient when more than one calculated field is in the dialog. The calculated fields will just fire at each other and bypass the test.
The correct fix is: Do not fire on calculated fields.
private void setupListeners(AutoCompletingTextField textField, TaggingPresetItemGuiSupport support) { if (valueTemplate == null) { // only fire on normal fields textField.getDocument().addDocumentListener(DocumentAdapter.create(event -> support.fireItemValueModified(this, key, textField.getText()))); } else { // only listen on calculated fields textField.setForeground(Color.BLUE); support.addListener((source, key, newValue) -> { String valueTemplateText = valueTemplate.getText(support); Logging.trace("Evaluating value_template {0} for key {1} from {2} with new value {3} => {4}", valueTemplate, key, source, newValue, valueTemplateText); textField.setItem(valueTemplateText); }); } }
This also gets rid of the now superfluous invokeLater()
.
Maybe we could fire on checkBoxes also? Just for completeness.
Example preset that shows bug.