Skip to content

android: Delegate bulk writes in UdsSocket output stream - #13173

Open
karczews wants to merge 1 commit into
grpc:masterfrom
karczews:master
Open

karczews wants to merge 1 commit into
grpc:masterfrom
karczews:master

Conversation

@karczews

@karczews karczews commented Nov 6, 2026 •

Copy link
Copy Markdown

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.

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.
@linux-foundation-easycla

linux-foundation-easycla Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

  • ✅ login: karczews / name: Krzysztof Karczewski (57ecdc1)

@karczews

Copy link
Copy Markdown
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

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant