8.1 script reloading issue

Ignition 8.1.49

Project A > Project B > Project C

Each time I made a script change in project A, Tag expression script using runscript are broken and probably other side effect in script manager.
I need to restart the gateway.
The script modified in project A contain lots of global dictionnary with settings.
The script modified in Project A is broadly used in script from project B and C.

I suspect it is the race condition issue on loading script ?
Nothing suspect in thread dump or blocked thread.

org.python.core.PyException: TypeError: unhashable type: 'dict'

at org.python.core.Py.TypeError(Py.java:234)

at org.python.core.PyDictionary.dict___hash__(PyDictionary.java:828)

at org.python.core.PyDictionary.hashCode(PyDictionary.java:810)

at java.base/java.util.concurrent.ConcurrentHashMap.get(Unknown Source)

at org.python.core.PyStringMap.__finditem__(PyStringMap.java:129)

at com.inductiveautomation.ignition.common.script.ScriptManager.lambda$clearProjectScriptModules$6(ScriptManager.java:661)

at java.base/java.lang.Iterable.forEach(Unknown Source)

at com.inductiveautomation.ignition.common.script.ScriptManager.clearProjectScriptModules(ScriptManager.java:660)

at com.inductiveautomation.ignition.common.script.ScriptManager.shutdown(ScriptManager.java:167)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.createScriptConfig(ProjectScriptLifecycle.java:279)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.startupScriptConfig(ProjectScriptLifecycle.java:235)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.restartScriptConfig(ProjectScriptLifecycle.java:231)

at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle.onResourcesModified(ProjectScriptLifecycle.java:733)

at com.inductiveautomation.ignition.gateway.project.ProjectLifecycle$LifecycleResourceListener.resourcesModified(ProjectLifecycle.java:176)

at com.inductiveautomation.ignition.common.project.AbstractProject.notifyResourceListeners(AbstractProject.java:351)

at com.inductiveautomation.ignition.common.project.AbstractProject.updateEffectiveState(AbstractProject.java:153)

at com.inductiveautomation.ignition.common.project.RuntimeProject.applyChange(RuntimeProject.java:274)

at com.inductiveautomation.ignition.gateway.project.ProjectLifecycleFactory$1.lambda$updateOrStartAffectedProjects$5(ProjectLifecycleFactory.java:185)

at java.base/java.util.ArrayList.forEach(Unknown Source)

at com.inductiveautomation.ignition.gateway.project.ProjectLifecycleFactory$1.updateOrStartAffectedProjects(ProjectLifecycleFactory.java:165)

at com.inductiveautomation.ignition.gateway.project.ProjectLifecycleFactory$1.projectUpdated(ProjectLifecycleFactory.java:143)

at com.inductiveautomation.ignition.gateway.project.BaseProjectManager.doProjectUpdatedNotification(BaseProjectManager.java:1055)

at com.inductiveautomation.ignition.gateway.project.BaseProjectManager.lambda$fireProjectUpdated$25(BaseProjectManager.java:1005)

at com.inductiveautomation.ignition.gateway.project.BaseProjectManager.lambda$submitToQueue$22(BaseProjectManager.java:983)

at com.inductiveautomation.ignition.common.util.ExecutionQueue$PollAndExecute.run(ExecutionQueue.java:239)

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)

Almost certainly this:

Fixed in v8.3. Deemed too risky a fix for v8.1 (first attempt was an ugly disaster).

I tried your workaround but I created deadlock and no time to investigate or double check so I remove the change.
I probably miss something...
I will try again the workaround if no change come in 8.1 about this. We have some 8.1 projects not planned to upgrade in 8.3 before months or years...

Yeah, I can basically guarantee we're not going to try to fix stuff like this in 8.1, so either work around it or update.