-
Notifications
You must be signed in to change notification settings - Fork 462
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Jobs with multiple files don't complete when backend fails #5359
Comments
@bryan-mason "Broken pipe" should not be a common occurrence for a backend, particularly when all of the standard backends block/handle it. The difference with single-vs-multi document jobs is that the backend (and associated pipes) remains active for all of the documents in the job - basically we reuse them for all documents, e.g:
Anyways, we should probably be closing the pipes when the backend fails, which will allow the filters to see that the backend has gone away (rather than block on IO) and allow the job to abort. |
It's been my experience supporting enterprise customers that:
Is one of the more common failure modes that people report. The cause always seems to be some sort of network equipment problem, and the socket backend handles it gracefully and exits cleanly, but it's still a problem (usually because |
When the following conditions are met:
pq /etc/services /etc/services
)Then the job stays in the queue. The backend fails, but the filter doesn't receive SIGPIPE and never exits, and the scheduler doesn't kills the job.
If the print job has only one file, then the filter gets SIGPIPE when the backend fails and the job is aborted (or retried depending on the Error Policy).
I've reproduced this in CUPS 1.4.2, 1.6.3 and 2.2.6.
I've been trying (unsuccessfully) to discover a difference in the way the scheduler starts filters for multi-file jobs vs. single-file jobs that would account for this behavior. Suggestions for where to look in the code would be appreciated (as would a patch to fix this, but I'm happy to work on the patch myself if I can get a push in the right direction).
Or would it make sense to call
stop_job()
somewhere if the backend fails. There's not much point in continuing to process a job if the backend has failed, is there?Thanks.
The text was updated successfully, but these errors were encountered: