-
Notifications
You must be signed in to change notification settings - Fork 278
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
Intermittent crash with “failed to fill whole buffer” #991
Comments
CC @pcwalton for |
It should be returning exactly one vetcor for every corresponding |
Filed servo/ipc-channel#160. |
This could be either that, or a bug in WebRender: the expected vector lengths are |
A bit of a long shot: but is it possible by any chance that a single (That would be very bad, since it would mean the |
There is a single Renderer used by multiple LayoutThreads, yes. We create one Renderer per Browser (https://dxr.mozilla.org/servo/rev/449758ef5dd399f7e1a5a9550dcdd614056cee9e/components/servo/lib.rs#179-191) and clone the RenderApiSender value for each layout thread spawned from the same constellation (there's a single constellation per Browser). |
So that seems quite likely, thanks for digging into it @antrik! So mainly Those two messages are the So apart from the epoch thing that @antrik pointed out, it means that things can get out of sync pretty easily... It seems dubious to me that the layout thread in the first place is setting the root pipeline, given that pipeline doesn't necessarily need to be displayed... |
So we could add an explicit synchronization API to WR, or (ideally) we could fix servo to actually only render the top-level page, and send the stuff to the render back-end from the constellation instead of the layout thread. That means, also, that we could move the IPC boundary off-webrender I think (the renderer lives in the constellation process), which will simplify things also for Gecko, is that right @glennw? |
CC @nical, it sounds like moving the IPC boundary would be relevant to you. |
Actually as @glennw pointed out, we should probably just check the pipeline id + the epoch. Let's see if that fixes the intermittents, or we need to add more synchronization between those messages. |
Relevant IRC discussion at http://logs.glob.uno/?c=mozilla%23servo&s=2+Apr+2017&e=2+Apr+2017#c643593. Turns out we already have all that I'm going to fix that for now, but we should also consider moving all the IPC complexity into Servo, and leave WR IPC-free. (I believe @staktrace could be happy about that too :P). |
… when processing auxiliary lists. Fixes servo#991
channel: Add the pipeline id to the payload message, and filter by it when processing auxiliary lists. Fixes #991 <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/1050) <!-- Reviewable:end -->
Many intermittent test failures on Servo’s CI have in comment this error message: servo/servo#14323.
The backtraces have
webrender::render_backend::RenderBackend::run
just beforecore::result::unwrap_failed
. That method callsstd::io::Read::read_exact
which does produce “failed to fill whole buffer” errors when the input is shorter than expected. In this case the input isauxiliary_data
, obtained fromself.payload_rx.recv().unwrap()
. With IPC enabled (which I think is the case for Servo),self.payload_rx
is aipc_channel::ipc::IpcBytesReceiver
, whoserecv
method returnsResult<Vec<u8>, _>
. But sinceipc_channel
has no documentation, I don’t know what length that vector is supposed to have. Doesrecv
return exactly one vector for each correspondingIpcBytesSender::send
call, or is this a byte stream that can be fragmented at any point? Anyway, somehow this vector is sometimes shorter than WebRender expects.The text was updated successfully, but these errors were encountered: