Repository navigation
Conversation
UdsSocket wraps LocalSocket's OutputStream in a FilterOutputStream that only overrode close(). FilterOutputStream.write(byte[], int, int) writes one byte at a time through write(int), so every buffer OkHttp wrote became one native LocalSocket write per byte. Override write(byte[], int, int) to pass the whole buffer to the wrapped stream, as the FilterOutputStream docs recommend for subclasses. The input side is unaffected: FilterInputStream.read(byte[], int, int) already delegates directly.
|
|
Author
|
Hey @kannanjgithub, could you take a look when you have a moment? It's a one-method fix in UdsSocket's output stream plus a test, and you reviewed the last two UdsChannelBuilder changes. |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
UdsSocket wraps LocalSocket's OutputStream in a FilterOutputStream that only overrode close(). FilterOutputStream.write(byte[], int, int) writes one byte at a time through write(int), so every buffer OkHttp wrote became one native LocalSocket write per byte. On LocalSocket this is expensive as each
write(int)is a separate JNI call.Override write(byte[], int, int) to pass the whole buffer to the wrapped stream, as the FilterOutputStream docs recommend for subclasses.
The new UdsSocketTest shadows LocalSocket's output stream to count writes. Before the fix, a 1000-byte write reached the socket as 1000 single-byte writes; after it, as one bulk write.
With this change, sending a 15MB payload over a UDS channel was about 120x faster.