Designer and client freeze when opening particular popup

We’re still working on our upgrade from Ignition 7.9 to 8.0.

But there’s one particular popup that causes the client to freeze when opened. It causes a high CPU usage, and even the error popup and diagnostics freeze.

When opening it in the designer, the designer also freezes.

It’s a very simple popup. 3 buttons (one to open a different popup, one to write a tag, and one to close the popup), 6 numeric text fields linked to tags, and one dropdown where the dataset and selected value are linked to tags.

I don’t get how there can be anything wrong with it, and I don’t know how to investigate this issue.

A thread dump would be the way to diagnose. You’ll need to have a JDK installed, somewhere on your machine, so you can use the jstack executable.

Thank you for the hint.

I let it run two times (2 minutes apart), so I could easily compare what was staying the same or what was taking more time.

This thread was the one taking the most CPU time (7 CPU seconds in 2 minutes). With very different stack traces.

Apart from that, most differences I see come from threads going from “Timed waiting” state to “Runnable”. Which should at least mean they don’t use up too much CPU time.

The complete traces are included as attachement.

"AWT-EventQueue-0" #20 prio=6 os_prio=0 cpu=41375.00ms elapsed=437.98s tid=0x000001bcd7e05800 nid=0x62c runnable  [0x000000adf4efc000]
   java.lang.Thread.State: RUNNABLE
        at java.security.AccessController.getStackAccessControlContext(java.base@11.0.6/Native Method)
        at java.security.AccessController.getContext(java.base@11.0.6/Unknown Source)
        at java.awt.AWTEvent.<init>(java.desktop@11.0.6/Unknown Source)
        at java.awt.event.InvocationEvent.<init>(java.desktop@11.0.6/Unknown Source)
        at java.awt.event.InvocationEvent.<init>(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue.invokeLater(java.desktop@11.0.6/Unknown Source)
        at com.inductiveautomation.ignition.client.util.EDTUtil.coalescingInvokeLater(EDTUtil.java:170)
        - locked <0x00000000d63988e0> (a java.lang.Object)
        at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter.childInteractionUpdated(ExpressionPropertyAdapter.java:52)
        at com.inductiveautomation.factorypmi.application.binding.PropertyListenerDescriptor.propertyChange(PropertyListenerDescriptor.java:74)
        at java.beans.PropertyChangeSupport.fire(java.desktop@11.0.6/Unknown Source)
        at java.beans.PropertyChangeSupport.firePropertyChange(java.desktop@11.0.6/Unknown Source)
        at java.beans.PropertyChangeSupport.firePropertyChange(java.desktop@11.0.6/Unknown Source)
        at java.awt.Component.firePropertyChange(java.desktop@11.0.6/Unknown Source)
        at jdk.internal.reflect.GeneratedMethodAccessor44.invoke(java.base@11.0.6/Unknown Source)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.6/Unknown Source)
        at java.lang.reflect.Method.invoke(java.base@11.0.6/Unknown Source)
        at com.inductiveautomation.factorypmi.application.binding.util.DynamicPropertyUtil.firePropertyChange(DynamicPropertyUtil.java:291)
        at com.inductiveautomation.factorypmi.application.binding.util.DynamicPropertyUtil.setPropertyValue(DynamicPropertyUtil.java:282)
        at com.inductiveautomation.vision.api.client.components.model.AbstractVisionPanel.setPropertyValue(AbstractVisionPanel.java:165)
        at com.inductiveautomation.factorypmi.application.binding.AbstractPropertyAdapter.updateTarget(AbstractPropertyAdapter.java:302)
        at com.inductiveautomation.factorypmi.application.binding.AbstractPropertyAdapter.updateValue(AbstractPropertyAdapter.java:266)
        at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter.runExpression(ExpressionPropertyAdapter.java:89)
        at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter$1.run(ExpressionPropertyAdapter.java:59)
        at com.inductiveautomation.ignition.client.util.EDTUtil$ProcessQueue.run(EDTUtil.java:127)
        at java.awt.event.InvocationEvent.dispatch(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue$4.run(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue$4.run(java.desktop@11.0.6/Unknown Source)
        at java.security.AccessController.doPrivileged(java.base@11.0.6/Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@11.0.6/Unknown Source)
        at java.awt.EventQueue.dispatchEvent(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.run(java.desktop@11.0.6/Unknown Source)

   Locked ownable synchronizers:
        - None
"AWT-EventQueue-0" #20 prio=6 os_prio=0 cpu=48765.63ms elapsed=556.67s tid=0x000001bcd7e05800 nid=0x62c runnable  [0x000000adf4efc000]
   java.lang.Thread.State: RUNNABLE
        at jdk.internal.misc.Unsafe.unpark(java.base@11.0.6/Native Method)
        at java.util.concurrent.locks.LockSupport.unpark(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.ForkJoinPool.signalWork(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.ForkJoinPool.externalPush(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.ForkJoinPool.externalSubmit(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.ForkJoinPool.execute(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.CompletableFuture.asyncSupplyStage(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.CompletableFuture.supplyAsync(java.base@11.0.6/Unknown Source)
        at com.inductiveautomation.ignition.client.sqltags.impl.SubManagerAdapter.readAsync(SubManagerAdapter.java:134)
        at com.inductiveautomation.ignition.client.tags.impl.ClientTagManagerImpl.lambda$readAsync$0(ClientTagManagerImpl.java:174)
        at com.inductiveautomation.ignition.client.tags.impl.ClientTagManagerImpl$$Lambda$465/0x0000000100bb5840.map(Unknown Source)
        at com.inductiveautomation.ignition.gateway.util.GroupMapCollate.lambda$groupMapCollate$0(GroupMapCollate.java:25)
        at com.inductiveautomation.ignition.gateway.util.GroupMapCollate$$Lambda$466/0x0000000100bb5c40.map(Unknown Source)
        at com.inductiveautomation.ignition.gateway.util.GroupMapCollate.lambda$groupMapCollateIndexed$5(GroupMapCollate.java:53)
        at com.inductiveautomation.ignition.gateway.util.GroupMapCollate$$Lambda$464/0x0000000100bb6440.apply(Unknown Source)
        at java.util.stream.ReferencePipeline$3$1.accept(java.base@11.0.6/Unknown Source)
        at java.util.HashMap$EntrySpliterator.forEachRemaining(java.base@11.0.6/Unknown Source)
        at java.util.stream.AbstractPipeline.copyInto(java.base@11.0.6/Unknown Source)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@11.0.6/Unknown Source)
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@11.0.6/Unknown Source)
        at java.util.stream.AbstractPipeline.evaluate(java.base@11.0.6/Unknown Source)
        at java.util.stream.ReferencePipeline.collect(java.base@11.0.6/Unknown Source)
        at com.inductiveautomation.ignition.common.util.Futures.sequence(Futures.java:26)
        at com.inductiveautomation.ignition.gateway.util.GroupMapCollate.groupMapCollateIndexed(GroupMapCollate.java:62)
        at com.inductiveautomation.ignition.gateway.util.GroupMapCollate.groupMapCollate(GroupMapCollate.java:28)
        at com.inductiveautomation.ignition.client.tags.impl.ClientTagManagerImpl.readAsync(ClientTagManagerImpl.java:172)
        at com.inductiveautomation.ignition.common.tags.model.TagManager.readAsync(TagManager.java:56)
        at com.inductiveautomation.ignition.client.script.LegacyClientTagUtilities.read(LegacyClientTagUtilities.java:143)
        at com.inductiveautomation.ignition.common.script.builtin.LegacyTagUtilities.read(LegacyTagUtilities.java:168)
        at jdk.internal.reflect.GeneratedMethodAccessor163.invoke(Unknown Source)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.6/Unknown Source)
        at java.lang.reflect.Method.invoke(java.base@11.0.6/Unknown Source)
        at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:188)
        at com.inductiveautomation.ignition.common.script.ScriptManager$ReflectedInstanceFunction.__call__(ScriptManager.java:521)
        at org.python.core.PyObject.__call__(PyObject.java:480)
        at org.python.core.PyObject.__call__(PyObject.java:484)
        at org.python.pycode._pyx16.GetNavigationText_RT$2(<module:shared.navigation>:64)
        at org.python.pycode._pyx16.call_function(<module:shared.navigation>)
        at org.python.core.PyTableCode.call(PyTableCode.java:171)
        at org.python.core.PyBaseCode.call(PyBaseCode.java:308)
        at org.python.core.PyFunction.function___call__(PyFunction.java:471)
        at org.python.core.PyFunction.__call__(PyFunction.java:466)
        at org.python.core.PyFunction.__call__(PyFunction.java:456)
        at org.python.core.PyFunction.__call__(PyFunction.java:451)
        at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:815)
        at com.inductiveautomation.ignition.common.expressions.functions.ScriptFunction.execute(ScriptFunction.java:91)
        at com.inductiveautomation.ignition.common.expressions.FunctionExpression.execute(FunctionExpression.java:69)
        at com.inductiveautomation.ignition.client.expressions.ClientFunctionFactory$TranslateFunction.execute(ClientFunctionFactory.java:320)
        at com.inductiveautomation.ignition.client.expressions.ClientDynamicDispatchFunction.execute(ClientDynamicDispatchFunction.java:43)
        at com.inductiveautomation.ignition.client.expressions.ClientDynamicDispatchFunction.execute(ClientDynamicDispatchFunction.java:43)
        at com.inductiveautomation.ignition.common.expressions.FunctionExpression.execute(FunctionExpression.java:69)
        at com.inductiveautomation.ignition.common.expressions.ArithmeticExpression.execute(ArithmeticExpression.java:60)
        at com.inductiveautomation.ignition.common.expressions.ArithmeticExpression.execute(ArithmeticExpression.java:59)
        at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter.runExpression(ExpressionPropertyAdapter.java:83)
        at com.inductiveautomation.factorypmi.application.binding.ExpressionPropertyAdapter$1.run(ExpressionPropertyAdapter.java:59)
        at com.inductiveautomation.ignition.client.util.EDTUtil$ProcessQueue.run(EDTUtil.java:127)
        at java.awt.event.InvocationEvent.dispatch(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue$4.run(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventQueue$4.run(java.desktop@11.0.6/Unknown Source)
        at java.security.AccessController.doPrivileged(java.base@11.0.6/Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@11.0.6/Unknown Source)
        at java.awt.EventQueue.dispatchEvent(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(java.desktop@11.0.6/Unknown Source)
        at java.awt.EventDispatchThread.run(java.desktop@11.0.6/Unknown Source)

   Locked ownable synchronizers:
        - None

stacktrace1.txt (52.8 KB) stacktrace2.txt (63.6 KB)

I found the issue.

Apparently there was a recursive property binding that wasn’t used anymore (the expression even contained a tag that has been removed).

It was basically something like:

Property A binding: if({non/existing/tag}, {property B}, {property A})

2 Likes