Opened 4 years ago
Last modified 4 years ago
#6365 assigned defect
Loading pickled file in thread crashes
| Reported by: | Tristan Croll | Owned by: | Greg Couch |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | Core | Version: | |
| Keywords: | Cc: | chimera-programmers | |
| Blocked By: | Blocking: | ||
| Notify when closed: | Platform: | all | |
| Project: | ChimeraX |
Description
The following bug report has been submitted:
Platform: Windows-10-10.0.19041
ChimeraX Version: 1.4.dev202203110419 (2022-03-11 04:19:32 UTC)
Description
Last time you used ChimeraX it crashed.
Please describe steps that led to the crash here.
For some reason loading a picked file (OpenMM `ForceField` object and two version strings) in a separate Python thread is no longer thread-safe (has been working for years, now crashes intermittently). Can get rid of the threading (was only there to get some marginally better startup time), but I think worth noting.
Windows fatal exception: access violation
Thread 0x000092b8 (most recent call first):
File "", line 228 in _call_with_frames_removed
File "", line 1173 in create_module
File "", line 565 in module_from_spec
File "", line 666 in _load_unlocked
File "", line 986 in _find_and_load_unlocked
File "", line 1007 in _find_and_load
File "C:\Users\tristan\AppData\Local\UCSF\ChimeraX\1.4\site-packages\chimerax\isolde\openmm\forcefields.py", line 66 in _background_load_ff
File "C:\Program Files\ChimeraX-daily\bin\lib\concurrent\futures\thread.py", line 52 in run
File "C:\Program Files\ChimeraX-daily\bin\lib\concurrent\futures\thread.py", line 77 in _worker
File "C:\Program Files\ChimeraX-daily\bin\lib\threading.py", line 910 in run
File "C:\Program Files\ChimeraX-daily\bin\lib\threading.py", line 973 in _bootstrap_inner
File "C:\Program Files\ChimeraX-daily\bin\lib\threading.py", line 930 in _bootstrap
Current thread 0x00000020 (most recent call first):
File "C:\Program Files\ChimeraX-daily\bin\lib\site-packages\chimerax\ui\gui.py", line 318 in event_loop
File "C:\Program Files\ChimeraX-daily\bin\lib\site-packages\ChimeraX_main.py", line 867 in init
File "C:\Program Files\ChimeraX-daily\bin\lib\site-packages\ChimeraX_main.py", line 1018 in
File "C:\Program Files\ChimeraX-daily\bin\lib\runpy.py", line 87 in _run_code
File "C:\Program Files\ChimeraX-daily\bin\lib\runpy.py", line 197 in _run_module_as_main
===== Log before crash start =====
> isolde shorthand
Initialising ISOLDE-specific command aliases:
Alias Equivalent full command
-------------------------------------------------
st isolde step {arguments}
aw isolde add water {arguments}
awsf isolde add water {arguments} sim false
al isolde add ligand {arguments}
aa isolde add aa $1 sel {arguments}
ht isolde mod his sel {arguments}
so setattr sel atoms occupancy {arguments}
ab isolde adjust bfactors {arguments}
ss isolde sim start sel
rt isolde release torsions sel {arguments}
rd isolde release distances sel {arguments}
ra rd; rt
pf isolde pepflip sel
cf isolde cisflip sel
cbb color bfactor {arguments}
cbo color byattr occupancy {arguments}
cbc color {arguments} bychain; color {arguments} byhet
cs clipper set contourSensitivity {arguments}
UCSF ChimeraX version: 1.4.dev202203110419 (2022-03-11)
© 2016-2022 Regents of the University of California. All rights reserved.
How to cite UCSF ChimeraX
> isolde start
===== Log before crash end =====
Log:
> isolde shorthand
Initialising ISOLDE-specific command aliases:
Alias Equivalent full command
-------------------------------------------------
st isolde step {arguments}
aw isolde add water {arguments}
awsf isolde add water {arguments} sim false
al isolde add ligand {arguments}
aa isolde add aa $1 sel {arguments}
ht isolde mod his sel {arguments}
so setattr sel atoms occupancy {arguments}
ab isolde adjust bfactors {arguments}
ss isolde sim start sel
rt isolde release torsions sel {arguments}
rd isolde release distances sel {arguments}
ra rd; rt
pf isolde pepflip sel
cf isolde cisflip sel
cbb color bfactor {arguments}
cbo color byattr occupancy {arguments}
cbc color {arguments} bychain; color {arguments} byhet
cs clipper set contourSensitivity {arguments}
UCSF ChimeraX version: 1.4.dev202203110419 (2022-03-11)
© 2016-2022 Regents of the University of California. All rights reserved.
How to cite UCSF ChimeraX
OpenGL version: 3.3.0 NVIDIA 497.29
OpenGL renderer: NVIDIA GeForce RTX 2080/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation
Locale: en_GB.cp1252
Qt version: PyQt6 6.2.3, Qt 6.2.3
Qt platform: windows
Manufacturer: Notebook
Model: P7xxTM1
OS: Microsoft Windows 10 Education (Build 19041)
Memory: 68,654,501,888
MaxProcessMemory: 137,438,953,344
CPU: 16 Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
OSLanguage: en-GB
Installed Packages:
-himerax-isolde: 1.4.dev0
alabaster: 0.7.12
appdirs: 1.4.4
Babel: 2.9.1
backcall: 0.2.0
blockdiag: 3.0.0
certifi: 2021.10.8
cftime: 1.6.0
charset-normalizer: 2.0.12
ChimeraX-AddCharge: 1.2.3
ChimeraX-AddH: 2.1.11
ChimeraX-AlignmentAlgorithms: 2.0
ChimeraX-AlignmentHdrs: 3.2.1
ChimeraX-AlignmentMatrices: 2.0
ChimeraX-Alignments: 2.2.3
ChimeraX-AlphaFold: 1.0
ChimeraX-AltlocExplorer: 1.0.1
ChimeraX-AmberInfo: 1.0
ChimeraX-Arrays: 1.0
ChimeraX-Atomic: 1.36.2
ChimeraX-AtomicLibrary: 6.1.1
ChimeraX-AtomSearch: 2.0.1
ChimeraX-AxesPlanes: 2.1
ChimeraX-BasicActions: 1.1
ChimeraX-BILD: 1.0
ChimeraX-BlastProtein: 2.0
ChimeraX-BondRot: 2.0
ChimeraX-BugReporter: 1.0
ChimeraX-BuildStructure: 2.6.1
ChimeraX-Bumps: 1.0
ChimeraX-BundleBuilder: 1.1
ChimeraX-ButtonPanel: 1.0
ChimeraX-CageBuilder: 1.0
ChimeraX-CellPack: 1.0
ChimeraX-Centroids: 1.2
ChimeraX-ChemGroup: 2.0
ChimeraX-Clashes: 2.2.2
ChimeraX-Clipper: 0.18.0
ChimeraX-ColorActions: 1.0
ChimeraX-ColorGlobe: 1.0
ChimeraX-ColorKey: 1.5.1
ChimeraX-CommandLine: 1.2.1
ChimeraX-ConnectStructure: 2.0.1
ChimeraX-Contacts: 1.0
ChimeraX-Core: 1.4.dev202203110419
ChimeraX-CoreFormats: 1.1
ChimeraX-coulombic: 1.3.2
ChimeraX-Crosslinks: 1.0
ChimeraX-Crystal: 1.0
ChimeraX-CrystalContacts: 1.0
ChimeraX-DataFormats: 1.2.2
ChimeraX-Dicom: 1.0
ChimeraX-DistMonitor: 1.1.5
ChimeraX-Dssp: 2.0
ChimeraX-EMDB-SFF: 1.0
ChimeraX-ExperimentalCommands: 1.0
ChimeraX-FileHistory: 1.0
ChimeraX-FunctionKey: 1.0
ChimeraX-Geometry: 1.1
ChimeraX-gltf: 1.0
ChimeraX-Graphics: 1.1
ChimeraX-Hbonds: 2.1.2
ChimeraX-Help: 1.2
ChimeraX-HKCage: 1.3
ChimeraX-IHM: 1.1
ChimeraX-ImageFormats: 1.2
ChimeraX-IMOD: 1.0
ChimeraX-IO: 1.0.1
ChimeraX-ISOLDE: 1.4.dev0
ChimeraX-ItemsInspection: 1.0
ChimeraX-Label: 1.1
ChimeraX-ListInfo: 1.1.1
ChimeraX-Log: 1.1.5
ChimeraX-LookingGlass: 1.1
ChimeraX-Maestro: 1.8.1
ChimeraX-Map: 1.1
ChimeraX-MapData: 2.0
ChimeraX-MapEraser: 1.0
ChimeraX-MapFilter: 2.0
ChimeraX-MapFit: 2.0
ChimeraX-MapSeries: 2.1
ChimeraX-Markers: 1.0
ChimeraX-Mask: 1.0
ChimeraX-MatchMaker: 2.0.6
ChimeraX-MDcrds: 2.6
ChimeraX-MedicalToolbar: 1.0.1
ChimeraX-Meeting: 1.0
ChimeraX-MLP: 1.1
ChimeraX-mmCIF: 2.7
ChimeraX-MMTF: 2.1
ChimeraX-Modeller: 1.5.3
ChimeraX-ModelPanel: 1.3.2
ChimeraX-ModelSeries: 1.0
ChimeraX-Mol2: 2.0
ChimeraX-Morph: 1.0
ChimeraX-MouseModes: 1.1
ChimeraX-Movie: 1.0
ChimeraX-Neuron: 1.0
ChimeraX-Nucleotides: 2.0.2
ChimeraX-OpenCommand: 1.8
ChimeraX-PDB: 2.6.6
ChimeraX-PDBBio: 1.0
ChimeraX-PDBLibrary: 1.0.2
ChimeraX-PDBMatrices: 1.0
ChimeraX-PickBlobs: 1.0
ChimeraX-Positions: 1.0
ChimeraX-PresetMgr: 1.1
ChimeraX-PubChem: 2.1
ChimeraX-ReadPbonds: 1.0.1
ChimeraX-Registration: 1.1
ChimeraX-RemoteControl: 1.0
ChimeraX-ResidueFit: 1.0
ChimeraX-RestServer: 1.1
ChimeraX-RNALayout: 1.0
ChimeraX-RotamerLibMgr: 2.0.1
ChimeraX-RotamerLibsDunbrack: 2.0
ChimeraX-RotamerLibsDynameomics: 2.0
ChimeraX-RotamerLibsRichardson: 2.0
ChimeraX-SaveCommand: 1.5
ChimeraX-SchemeMgr: 1.0
ChimeraX-SDF: 2.0
ChimeraX-Segger: 1.0
ChimeraX-Segment: 1.0
ChimeraX-SelInspector: 1.0
ChimeraX-SeqView: 2.4.8
ChimeraX-Shape: 1.0.1
ChimeraX-Shell: 1.0
ChimeraX-Shortcuts: 1.1
ChimeraX-ShowAttr: 1.0
ChimeraX-ShowSequences: 1.0
ChimeraX-SideView: 1.0
ChimeraX-Smiles: 2.1
ChimeraX-SmoothLines: 1.0
ChimeraX-SpaceNavigator: 1.0
ChimeraX-StdCommands: 1.8
ChimeraX-STL: 1.0
ChimeraX-Storm: 1.0
ChimeraX-StructMeasure: 1.0.1
ChimeraX-Struts: 1.0.1
ChimeraX-Surface: 1.0
ChimeraX-SwapAA: 2.0
ChimeraX-SwapRes: 2.1.1
ChimeraX-TapeMeasure: 1.0
ChimeraX-Test: 1.0
ChimeraX-Toolbar: 1.1
ChimeraX-ToolshedUtils: 1.2.1
ChimeraX-Tug: 1.0
ChimeraX-UI: 1.16.2
ChimeraX-uniprot: 2.2
ChimeraX-UnitCell: 1.0
ChimeraX-ViewDockX: 1.1.2
ChimeraX-VIPERdb: 1.0
ChimeraX-Vive: 1.1
ChimeraX-VolumeMenu: 1.0
ChimeraX-VTK: 1.0
ChimeraX-WavefrontOBJ: 1.0
ChimeraX-WebCam: 1.0
ChimeraX-WebServices: 1.0
ChimeraX-Zone: 1.0
colorama: 0.4.4
comtypes: 1.1.10
cxservices: 1.1
cycler: 0.11.0
Cython: 0.29.26
debugpy: 1.5.1
decorator: 5.1.1
docutils: 0.17.1
entrypoints: 0.4
filelock: 3.4.2
fonttools: 4.30.0
funcparserlib: 1.0.0a0
grako: 3.16.5
h5py: 3.6.0
html2text: 2020.1.16
idna: 3.3
ihm: 0.26
imagecodecs: 2021.11.20
imagesize: 1.3.0
ipykernel: 6.6.1
ipython: 7.31.1
ipython-genutils: 0.2.0
jedi: 0.18.1
Jinja2: 3.0.3
jupyter-client: 7.1.0
jupyter-core: 4.9.2
kiwisolver: 1.3.2
line-profiler: 3.4.0
lxml: 4.7.1
lz4: 3.1.10
MarkupSafe: 2.1.0
matplotlib: 3.5.1
matplotlib-inline: 0.1.3
msgpack: 1.0.3
nest-asyncio: 1.5.4
netCDF4: 1.5.8
networkx: 2.6.3
numexpr: 2.8.1
numpy: 1.22.1
openvr: 1.16.802
packaging: 21.3
ParmEd: 3.4.3
parso: 0.8.3
pickleshare: 0.7.5
Pillow: 9.0.0
pip: 21.3.1
pkginfo: 1.8.2
prompt-toolkit: 3.0.28
psutil: 5.9.0
pycollada: 0.7.2
pydicom: 2.2.2
Pygments: 2.11.2
PyOpenGL: 3.1.5
PyOpenGL-accelerate: 3.1.5
pyparsing: 3.0.7
PyQt6-commercial: 6.2.3
PyQt6-sip: 13.2.0
PyQt6-WebEngine-commercial: 6.2.1
python-dateutil: 2.8.2
pytz: 2021.3
pywin32: 303
pyzmq: 22.3.0
qtconsole: 5.2.2
QtPy: 2.0.1
RandomWords: 0.3.0
requests: 2.27.1
scipy: 1.7.3
setuptools: 59.8.0
sfftk-rw: 0.7.1
six: 1.16.0
snowballstemmer: 2.2.0
sortedcontainers: 2.4.0
Sphinx: 4.3.2
sphinx-autodoc-typehints: 1.15.2
sphinxcontrib-applehelp: 1.0.2
sphinxcontrib-blockdiag: 3.0.0
sphinxcontrib-devhelp: 1.0.2
sphinxcontrib-htmlhelp: 2.0.0
sphinxcontrib-jsmath: 1.0.1
sphinxcontrib-qthelp: 1.0.3
sphinxcontrib-serializinghtml: 1.1.5
suds-community: 1.0.0
tables: 3.7.0
tifffile: 2021.11.2
tinyarray: 1.2.4
tornado: 6.1
traitlets: 5.1.1
urllib3: 1.26.8
wcwidth: 0.2.5
webcolors: 1.11.1
wheel: 0.37.1
wheel-filename: 1.3.0
WMI: 1.5.1
Change History (9)
comment:1 by , 4 years ago
| Cc: | added |
|---|---|
| Component: | Unassigned → Core |
| Owner: | set to |
| Platform: | → all |
| Project: | → ChimeraX |
| Status: | new → assigned |
| Summary: | ChimeraX bug report submission → Loading pickled file in thread crashes |
comment:2 by , 4 years ago
comment:3 by , 4 years ago
You are using Qt 6 in this report. I believe Qt is not thread safe and all calls must be done from the main thread. So if unpickling somehow makes a Qt call that could explain why it is crashing with Qt 6.
comment:4 by , 4 years ago
In particular, logging will cause changes in the Log tool. If your thread is logging anything (or doing anything else that might cause Qt activity) you can use session.ui.thread_safe to make the call in the main thread, e.g.:
session.logger.status("force field loaded")
becomes:
session.ui.thread_safe(session.logger.status, "force field loaded")
comment:5 by , 4 years ago
This was done with the barebones multiprocessing.ThreadPoolExecutor, but yes - point taken. There *is* a print in the thread (which hasn't actually caused noticeable trouble in the past, but I can see how it could) - but the crash when it happens is always in the pickle.load() step. The ForceField class knows nothing whatsoever about ChimeraX and the other two components of the pickle are simple strings, so as far as I can see there's nothing that *should* be causing a crash. Still, it should be fine for me to just completely remove the threading here - this dates back to a time when I was loading the entire forcefield at once (including ~15k ligands) which was slow enough to be really annoying, but these days the ligands are all kept separate and only added to the forcefield on demand. Core forcefield load time is not particularly bad - a few seconds on the first load from XML files, under a second for subsequent loads from the pickle.
comment:6 by , 4 years ago
Please do not use pickle data in session files. It is not secure and can not be made secure.
Besides the threading iessue, I see two needed fixes for this bug: (1) better documentation on what can be in session data, and (2) any use of pickle needs to emit a warning or pickle needs to be disabled.
For (1) session data should be POD (plain old data), like what can be in a JSON file. ChimeraX extends what can be POD, see https://www.cgl.ucsf.edu/chimerax/docs/devel/core/serialize.html. And session data can include references to instances of classes, but those have to follow the ChimeraX state protocol. Some documentation for that is in https://www.rbvi.ucsf.edu/chimerax/docs/devel/tutorials/tutorial_tool_qt.html#sessions -- see take_snapshot, restore_snapshot, and get_class.
follow-up: 8 comment:8 by , 4 years ago
None of this is saved in a session (.cxs) file. When a new ISOLDE session is started for the first time, the OpenMM forcefield is loaded from its XML files; the resulting ForceField object is pickled to a file in ISOLDE's cache directory (ChimeraX/{version}/isolde_data) and that's used by preference in future loads.
________________________________
From: ChimeraX <ChimeraX-bugs-admin@cgl.ucsf.edu>
Sent: 15 March 2022 17:03
Cc: chimera-programmers@cgl.ucsf.edu <chimera-programmers@cgl.ucsf.edu>; gregc@cgl.ucsf.edu <gregc@cgl.ucsf.edu>; Tristan Croll <tic20@cam.ac.uk>
Subject: Re: [ChimeraX] #6365: Loading pickled file in thread crashes
#6365: Loading pickled file in thread crashes
------------------------------------+------------------------
Reporter: Tristan Croll | Owner: Greg Couch
Type: defect | Status: assigned
Priority: normal | Milestone:
Component: Core | Version:
Resolution: | Keywords:
Blocked By: | Blocking:
Notify when closed: | Platform: all
Project: ChimeraX |
------------------------------------+------------------------
Comment (by Greg Couch):
Please do not use pickle data in session files. It is not secure and can
not be made secure.
Besides the threading iessue, I see two needed fixes for this bug: (1)
better documentation on what can be in session data, and (2) any use of
pickle needs to emit a warning or pickle needs to be disabled.
For (1) session data should be POD (plain old data), like what can be in a
JSON file. ChimeraX extends what can be POD, see
https://www.cgl.ucsf.edu/chimerax/docs/devel/core/serialize.html. And
session data can include references to instances of classes, but those
have to follow the ChimeraX state protocol. Some documentation for that
is in
https://www.rbvi.ucsf.edu/chimerax/docs/devel/tutorials/tutorial_tool_qt.html#sessions
-- see take_snapshot, restore_snapshot, and get_class.
--
Ticket URL: <https://www.rbvi.ucsf.edu/trac/ChimeraX/ticket/6365#comment:6>
ChimeraX <https://www.rbvi.ucsf.edu/chimerax/>
ChimeraX Issue Tracker
comment:9 by , 4 years ago
Ah. It's a relief that's it's not compromising the session data. My hackles are lowered.
Thread is spawned at https://github.com/tristanic/isolde/blob/6abd2668edef97ab87120e5f2d9e5758afdf5f03/isolde/src/openmm/forcefields.py#L181, and crashes at https://github.com/tristanic/isolde/blob/6abd2668edef97ab87120e5f2d9e5758afdf5f03/isolde/src/openmm/forcefields.py#L66. Still the same version of OpenMM as ChimeraX 1.3, and I haven't done anything to this code in a long long time. I've tried deleting the old pickle files so they're regenerated on the next ISOLDE start... regeneration worked fine, but the crash still happens intermittently.