Comments (3)
Our original assumption was that if the container has exited, the conversion process should immediately exit as well, maybe with some small delay for some cleanups. So, we originally attributed this to a race condition.
We have noticed this happening in case of successful conversions, where indeed it's due to a race condition. If we wait a tiny bit before checking the conversion process' status, we will see that it has stopped.
Things are very different in the case of failed conversions due to exceptions in the host. In that case, what happens is:
- The process in the container calculates the number of pages and width/height of each page.
- The host process receives these calculations from
stdout
, and decides that a unit is out of bounds. In the case of thesample_bad_max_width.pdf
document, it's the width. - The host process raises an exception, and from its perspective, the conversion is over. At no point have we terminated the process running in the container!
- In the meantime, the container will continue working on the document, and write pixels to
stdout
. - At some point, the container will exit or we will kill it with
docker kill ...
. This doesn't matter much, but what matters here is that Docker is very careful with the container's stdout. It does not want to lose it, and thus thedocker run ...
process will block until we have read every byte from the container. - Deadlock! Our termination logic does not read data from standard streams, nor does it terminate the
docker
process, so both process will remain stuck.- Thankfully, we force kill the conversion process after 15 seconds, so we do end up making progress.
from dangerzone.
Now that we know what's going on behind the scenes, let's answer the above questions:
- In some error cases, our termination logic reports that the container does not exist, whereas the conversion process (docker run ...) still exists.
That's because the conversion process may still linger, until the parent has read all the data that the container has written.
- Specifically for the failed conversion case, when that happens in the host, the conversion process seems to be stuck indefinitely, and we have to kill it.
The conversion process remains stuck, because the container has written lots of data to the stdout, and the host process has not read them.
from dangerzone.
How can we improve here? We can do the following:
- Unconditionally kill the container once the conversion is over, and don't check if
kill
succeeded, since it's racy.- Log a warning if the container still exists after
kill
, since this is not racy, and not expected.
- Log a warning if the container still exists after
- Gracefully terminate the conversion process after we terminate the container, since we at that point, we don't want to read its data.
from dangerzone.
Related Issues (20)
- QA and Release 0.6.1 HOT 3
- AttributeError: module 'PySide2.QtGui' has no attribute 'QAction' when running on Qt5 HOT 1
- Run from CLI with no containers HOT 3
- Dangerzone is listed as a PDF viewer to open safe documents with on Linux HOT 4
- Docker is installed but isn't running on Ubuntu 22.04 HOT 11
- "Open With Dangerzone" with 2 PDFs results in 2 instances of Dangerzone being opened on Linux
- Text in progress bar is cut off - Increase line height in gui? HOT 1
- "Open With Dangerzone" with 2 documents results in a single document getting selected in macOS
- Dangerzone segfaults on Fedora 39/40 HOT 4
- Dangerzone on OpenBSD
- No Match Found HOT 2
- Research: How to automate alerts for linux distro prereleases?
- Package for Opensuse Tumbleweed HOT 3
- Detect default application for opening PDFs HOT 1
- Code scanning currently failing with dependabot.
- Add Dangezone source in our signed assets
- Unable to run podman inside containers when using silicon mac HOT 1
- Install poetry-plugin-export, as it will not be installed by default in future poetry versions
- Fix outstanding CI issues on the `main` branch HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dangerzone.