I have some sfc charts running. My colleague is working on it. I do not know much what it does. Anyway, when the gateway is stopped, multiple empty .proto files are created:
2003@ignition-dev:/work(dev)$ ll var/com.inductiveautomation.sfc/
total 0
-rw-rw-r-- 1 2003 2003 0 Feb 18 16:44 5e251674-25e3-41d6-a781-e86bcf1f1103.proto
-rw-rw-r-- 1 2003 2003 0 Feb 18 16:44 89732dac-5de0-44ef-a9b2-37c42890350e.proto
-rw-rw-r-- 1 2003 2003 0 Feb 18 16:44 b05c3de6-ba01-49bb-9e16-21644c2e2a73.proto
When the gateway is started and the files are present, the sfc module fails to start. Which has ‘I do not know why' reason.
I am the maintainer of the container lifecycle and the colleague asked me to delete the files before the start of the gateway automatically.
For me this means a systemd unit with some hardcoded paths which I really don’t like. ChatGPT says that under some conditions (using a podman quadlet etc) I would need even a systemd unit override. I really do not want that.
Is there an elegant way to solve this from ignition configuration? To delete the files at the GW startup or shutdown? Or anything?
I am trying to create a reliable way to deploy dev/test/prod ignitions using git and podman quadlets → any external tool complicates things.
We have this problem from ignition 8.1 to 8.3.3.
java.lang.Exception: Exception while starting up module "com.inductiveautomation.sfc".
at com.inductiveautomation.ignition.gateway.modules.ModuleInstance.startup(ModuleInstance.java:761)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.runStartupPhase(ModuleManagerImpl.java:541)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.startup(ModuleManagerImpl.java:480)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.startupInternal(IgnitionGateway.java:1385)
at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.startup(RedundancyManagerImpl.java:367)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.initRedundancy(IgnitionGateway.java:807)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.lambda$initInternal$1(IgnitionGateway.java:720)
at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:561)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: class java.util.ImmutableCollections$MapN cannot be cast to class java.util.HashMap (java.util.ImmutableCollections$MapN and java.util.HashMap are in module java.base of loader 'bootstrap')
at com.inductiveautomation.sfc.distributed.protoserializers.PersistedChartSerializer.fromProtobufMessage(PersistedChartSerializer.java:77)
at com.inductiveautomation.sfc.ChartManager.initProtoCharts(ChartManager.java:586)
at com.inductiveautomation.sfc.ChartManager.initPersistedCharts(ChartManager.java:515)
at com.inductiveautomation.sfc.ChartManager.startup(ChartManager.java:194)
at com.inductiveautomation.sfc.SfcGatewayHookImpl.startup(SfcGatewayHookImpl.java:147)
at com.inductiveautomation.ignition.gateway.modules.ModuleInstance.startup(ModuleInstance.java:755)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.runStartupPhase(ModuleManagerImpl.java:541)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.startup(ModuleManagerImpl.java:480)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.startupInternal(IgnitionGateway.java:1385)
at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.startup(RedundancyManagerImpl.java:367)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.initRedundancy(IgnitionGateway.java:807)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.lambda$initInternal$1(IgnitionGateway.java:720)
at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:561)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
This will be fixed in 8.3.5 and is currently available in the 8.3.5 nightly.
The likely cause for the empty file is that there’s something in the chart that’s failing to serialize properly which is preventing the chart from persisting to disk. It would be worth tracking that down to prevent the empty files in the first place. Do you have logs from the shutdown?
Hi, thanks for the information. I consulted my colleague and he said he knows about the issue. He is using some custom classes (maybe python) if the sfc procedure. He would need to completely rewrite it. Now he makes changes so the charts run only on demand and they quit once finished. Now they has run all the time.
At the same time, we are slowly switching to Sepasoft batch procedure and we wont use these sfc charts anymore.
At shutdown there are multiple “Protobuf error thrown when serializing chart com.inductiveautomation.sfc.PersistedChart@1225f3 module-name=SFC”
Class 'java.math.BigInteger' and object '149' cannot be Protobuf serialized
And quite a few others
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | E [c.i.s.ChartManager ] [12:08:38.926]: Protobuf error thrown when serializing chart com.inductiveautomation.sfc.PersistedChart@20cb2ae9 module-name=SFC
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | com.inductiveautomation.ignition.common.model.exception.ProtobufSerializationException: Class 'java.math.BigInteger' and object '149' cannot be Protobuf serialized
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.impl.protoserializers.AnyObjectSerializer.toProtobufMessage(AnyObjectSerializer.java:63)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.impl.protoserializers.generic.MapSerializer.toProtobufMessage(MapSerializer.java:67)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.impl.protoserializers.generic.MapSerializer.toProtobufMessage(MapSerializer.java:23)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.impl.protoserializers.AnyObjectSerializer.toProtobufMessage(AnyObjectSerializer.java:69)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.ignition.gateway.gan.protoserializers.PyDictionarySerializer.toProtobufMessage(PyDictionarySerializer.java:42)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.sfc.distributed.protoserializers.PyChartScopeSerializer.toProtobufMessage(PyChartScopeSerializer.java:39)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.sfc.distributed.protoserializers.PersistedChartSerializer.toProtobufMessage(PersistedChartSerializer.java:48)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.sfc.ChartManager.persistedChartToFile(ChartManager.java:460)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.sfc.ChartManager.persistChart(ChartManager.java:447)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.sfc.ChartManager.shutdown(ChartManager.java:254)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.sfc.SfcGatewayHookImpl.shutdown(SfcGatewayHookImpl.java:158)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.ignition.gateway.modules.ModuleInstance.shutdown(ModuleInstance.java:834)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.shutdown(ModuleManagerImpl.java:561)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.shutdownInternal(IgnitionGateway.java:1781)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.shutdown(IgnitionGateway.java:2481)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.catapult.IgnitionServer$IgnitionWebAppContext$1.contextDestroyed(IgnitionServer.java:1363)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.servlet.ServletContextHandler.callContextDestroyed(ServletContextHandler.java:1607)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.servlet.ServletContextHandler.contextDestroyed(ServletContextHandler.java:529)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.servlet.ServletHandler.doStop(ServletHandler.java:329)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Handler$Abstract.doStop(Handler.java:499)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.security.SecurityHandler.doStop(SecurityHandler.java:428)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.servlet.security.ConstraintSecurityHandler.doStop(ConstraintSecurityHandler.java:382)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.session.AbstractSessionManager.doStop(AbstractSessionManager.java:1226)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Handler$Abstract.doStop(Handler.java:499)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.handler.ContextHandler.lambda$doStop$1(ContextHandler.java:810)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.call(ContextHandler.java:1457)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.handler.ContextHandler.doStop(ContextHandler.java:810)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.servlet.ServletContextHandler.stopContext(ServletContextHandler.java:1333)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.webapp.WebAppContext.stopWebapp(WebAppContext.java:1368)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.webapp.WebAppContext.stopContext(WebAppContext.java:1324)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.ee10.servlet.ServletContextHandler.doStop(ServletContextHandler.java:1084)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Handler$Abstract.doStop(Handler.java:499)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Handler$Abstract.doStop(Handler.java:499)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Handler$Abstract.doStop(Handler.java:499)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.stop(ContainerLifeCycle.java:180)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop(ContainerLifeCycle.java:202)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Handler$Abstract.doStop(Handler.java:499)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.server.Server.doStop(Server.java:690)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at org.eclipse.jetty.util.thread.ShutdownThread.run(ShutdownThread.java:136)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | Caused by: com.inductiveautomation.metro.api.ex.SerializableNotFoundException: ProtobufSerializable implementation not found for Java class 'java.math.BigInteger'
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.api.MetroProtobufRegistry.getByJavaClass(MetroProtobufRegistry.java:297)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.impl.protoserializers.ProtobufUtil.getSerializer(ProtobufUtil.java:143)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | at com.inductiveautomation.metro.impl.protoserializers.AnyObjectSerializer.toProtobufMessage(AnyObjectSerializer.java:60)
Feb 19 12:08:38 bmt-ignition-crash ignition-dev[709559]: jvm 1 | 2026/02/19 12:08:38 | ... 58 common frames omitted
Sorry about the delayed response. The easiest solution for now, assuming you don’t need persistence, would be to disable Persist State on any charts that are running into this.
For the BigInteger serialization error, we do have a fix that just merged and will also be available in 8.3.5.
The problem with custom classes can come up if an instance of the class is being stored inside a chart parameter. Just using these classes inside the SFC should not be a problem.