Skip to content

stack: add ProxyService for composing a Proxy with a Service#1726

Merged
hawkw merged 2 commits intomainfrom
eliza/proxy-svc
Jun 3, 2022
Merged

stack: add ProxyService for composing a Proxy with a Service#1726
hawkw merged 2 commits intomainfrom
eliza/proxy-svc

Conversation

@hawkw
Copy link
Contributor

@hawkw hawkw commented Jun 2, 2022

This branch adds a Proxy::into_service method that composes a Proxy
with a Service, returning a new Service that calls the inner
Service through that Proxy.

This negates the need for Proxy::proxy_oneshot, so this also
closes #1725.

Currently, this is unused, but it will be used in PR #1706 (from which
this change was factored out).

This branch adds a `Proxy::into_service` method that composes a `Proxy`
with a `Service`, returning a new `Service` that calls the inner
`Service` through that `Proxy`.

This negates the need for `Proxy::proxy_oneshot`, so this also
closes #1725.

Currently, this is unused, but it will be used in PR #1706 (from which
this change was factored out).
Copy link
Member

@olix0r olix0r left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought we already had this but maybe it was removed at some point. Note that there are several docs warnings

Signed-off-by: Eliza Weisman <[email protected]>
@hawkw hawkw merged commit 00eca39 into main Jun 3, 2022
@hawkw hawkw deleted the eliza/proxy-svc branch June 3, 2022 19:07
olix0r added a commit to linkerd/linkerd2 that referenced this pull request Jun 9, 2022
This release includes only minor internal changes and dependency
updates.

---

* build(deps): bump once_cell from 1.11.0 to 1.12.0 (linkerd/linkerd2-proxy#1701)
* build(deps): bump tj-actions/changed-files from 20.1 to 20.2 (linkerd/linkerd2-proxy#1700)
* Shellscript housekeeping (linkerd/linkerd2-proxy#1702)
* Update README to mention just and devcontainers (linkerd/linkerd2-proxy#1703)
* build(deps): bump jemallocator from 0.3.2 to 0.5.0 (linkerd/linkerd2-proxy#1708)
* build(deps): bump prost from 0.10.3 to 0.10.4 (linkerd/linkerd2-proxy#1710)
* build(deps): bump prost-build from 0.10.3 to 0.10.4 (linkerd/linkerd2-proxy#1709)
* ci: Lint markdown files (linkerd/linkerd2-proxy#1707)
* test: replace `profile_test!` macro with builder (linkerd/linkerd2-proxy#1705)
* build(deps): bump tj-actions/changed-files from 20.2 to 21 (linkerd/linkerd2-proxy#1712)
* dev: Fix the `just docker` recipe (linkerd/linkerd2-proxy#1713)
* build(deps): bump prettyplease from 0.1.10 to 0.1.11 (linkerd/linkerd2-proxy#1714)
* justfile: generate a default docker tag name (linkerd/linkerd2-proxy#1716)
* build(deps): bump tj-actions/changed-files from 21 to 22.2 (linkerd/linkerd2-proxy#1727)
* build(deps): bump petgraph from 0.6.1 to 0.6.2 (linkerd/linkerd2-proxy#1717)
* build(deps): bump clang-sys from 1.3.2 to 1.3.3 (linkerd/linkerd2-proxy#1718)
* build(deps): bump flate2 from 1.0.23 to 1.0.24 (linkerd/linkerd2-proxy#1719)
* build(deps): bump hyper from 0.14.18 to 0.14.19 (linkerd/linkerd2-proxy#1720)
* build(deps): bump miniz_oxide from 0.5.1 to 0.5.3 (linkerd/linkerd2-proxy#1722)
* build(deps): bump bumpalo from 3.9.1 to 3.10.0 (linkerd/linkerd2-proxy#1728)
* build(deps): bump async-trait from 0.1.53 to 0.1.56 (linkerd/linkerd2-proxy#1729)
* build(deps): bump parking_lot from 0.12.0 to 0.12.1 (linkerd/linkerd2-proxy#1730)
* build(deps): bump indexmap from 1.7.0 to 1.8.2 (linkerd/linkerd2-proxy#1732)
* http-box: add `EraseResponse` middleware (linkerd/linkerd2-proxy#1723)
* test: don't generate discovery tests in a macro (linkerd/linkerd2-proxy#1711)
* stack: add `ProxyService` for composing a `Proxy` with a `Service` (linkerd/linkerd2-proxy#1726)
* build(deps): bump tokio-stream from 0.1.8 to 0.1.9 (linkerd/linkerd2-proxy#1733)
* build(deps): bump tokio-macros from 1.7.0 to 1.8.0 (linkerd/linkerd2-proxy#1736)
* build(deps): bump tokio from 1.18.2 to 1.19.2 (linkerd/linkerd2-proxy#1737)
* Add 'group' labels to describe policy resources (linkerd/linkerd2-proxy#1738)
* build(deps): bump tokio-util from 0.7.2 to 0.7.3 (linkerd/linkerd2-proxy#1735)
* Move policy protobuf handling into the `server-policy` crate (linkerd/linkerd2-proxy#1739)
* build(deps): bump http from 0.2.7 to 0.2.8 (linkerd/linkerd2-proxy#1740)
* Implement `Deref` for address newtypes (linkerd/linkerd2-proxy#1741)
* Rename `Route*` to `ProfileRoute*` (linkerd/linkerd2-proxy#1742)
* Rename target types from Route to ProfileRoute (linkerd/linkerd2-proxy#1743)

Signed-off-by: Oliver Gould <[email protected]>
olix0r added a commit to linkerd/linkerd2 that referenced this pull request Jun 9, 2022
This release includes only minor internal changes and dependency
updates.

---

* build(deps): bump once_cell from 1.11.0 to 1.12.0 (linkerd/linkerd2-proxy#1701)
* build(deps): bump tj-actions/changed-files from 20.1 to 20.2 (linkerd/linkerd2-proxy#1700)
* Shellscript housekeeping (linkerd/linkerd2-proxy#1702)
* Update README to mention just and devcontainers (linkerd/linkerd2-proxy#1703)
* build(deps): bump jemallocator from 0.3.2 to 0.5.0 (linkerd/linkerd2-proxy#1708)
* build(deps): bump prost from 0.10.3 to 0.10.4 (linkerd/linkerd2-proxy#1710)
* build(deps): bump prost-build from 0.10.3 to 0.10.4 (linkerd/linkerd2-proxy#1709)
* ci: Lint markdown files (linkerd/linkerd2-proxy#1707)
* test: replace `profile_test!` macro with builder (linkerd/linkerd2-proxy#1705)
* build(deps): bump tj-actions/changed-files from 20.2 to 21 (linkerd/linkerd2-proxy#1712)
* dev: Fix the `just docker` recipe (linkerd/linkerd2-proxy#1713)
* build(deps): bump prettyplease from 0.1.10 to 0.1.11 (linkerd/linkerd2-proxy#1714)
* justfile: generate a default docker tag name (linkerd/linkerd2-proxy#1716)
* build(deps): bump tj-actions/changed-files from 21 to 22.2 (linkerd/linkerd2-proxy#1727)
* build(deps): bump petgraph from 0.6.1 to 0.6.2 (linkerd/linkerd2-proxy#1717)
* build(deps): bump clang-sys from 1.3.2 to 1.3.3 (linkerd/linkerd2-proxy#1718)
* build(deps): bump flate2 from 1.0.23 to 1.0.24 (linkerd/linkerd2-proxy#1719)
* build(deps): bump hyper from 0.14.18 to 0.14.19 (linkerd/linkerd2-proxy#1720)
* build(deps): bump miniz_oxide from 0.5.1 to 0.5.3 (linkerd/linkerd2-proxy#1722)
* build(deps): bump bumpalo from 3.9.1 to 3.10.0 (linkerd/linkerd2-proxy#1728)
* build(deps): bump async-trait from 0.1.53 to 0.1.56 (linkerd/linkerd2-proxy#1729)
* build(deps): bump parking_lot from 0.12.0 to 0.12.1 (linkerd/linkerd2-proxy#1730)
* build(deps): bump indexmap from 1.7.0 to 1.8.2 (linkerd/linkerd2-proxy#1732)
* http-box: add `EraseResponse` middleware (linkerd/linkerd2-proxy#1723)
* test: don't generate discovery tests in a macro (linkerd/linkerd2-proxy#1711)
* stack: add `ProxyService` for composing a `Proxy` with a `Service` (linkerd/linkerd2-proxy#1726)
* build(deps): bump tokio-stream from 0.1.8 to 0.1.9 (linkerd/linkerd2-proxy#1733)
* build(deps): bump tokio-macros from 1.7.0 to 1.8.0 (linkerd/linkerd2-proxy#1736)
* build(deps): bump tokio from 1.18.2 to 1.19.2 (linkerd/linkerd2-proxy#1737)
* Add 'group' labels to describe policy resources (linkerd/linkerd2-proxy#1738)
* build(deps): bump tokio-util from 0.7.2 to 0.7.3 (linkerd/linkerd2-proxy#1735)
* Move policy protobuf handling into the `server-policy` crate (linkerd/linkerd2-proxy#1739)
* build(deps): bump http from 0.2.7 to 0.2.8 (linkerd/linkerd2-proxy#1740)
* Implement `Deref` for address newtypes (linkerd/linkerd2-proxy#1741)
* Rename `Route*` to `ProfileRoute*` (linkerd/linkerd2-proxy#1742)
* Rename target types from Route to ProfileRoute (linkerd/linkerd2-proxy#1743)

Signed-off-by: Oliver Gould <[email protected]>
zhlsunshine pushed a commit to zhlistio/linkerd2 that referenced this pull request Jun 15, 2022
This release includes only minor internal changes and dependency
updates.

---

* build(deps): bump once_cell from 1.11.0 to 1.12.0 (linkerd/linkerd2-proxy#1701)
* build(deps): bump tj-actions/changed-files from 20.1 to 20.2 (linkerd/linkerd2-proxy#1700)
* Shellscript housekeeping (linkerd/linkerd2-proxy#1702)
* Update README to mention just and devcontainers (linkerd/linkerd2-proxy#1703)
* build(deps): bump jemallocator from 0.3.2 to 0.5.0 (linkerd/linkerd2-proxy#1708)
* build(deps): bump prost from 0.10.3 to 0.10.4 (linkerd/linkerd2-proxy#1710)
* build(deps): bump prost-build from 0.10.3 to 0.10.4 (linkerd/linkerd2-proxy#1709)
* ci: Lint markdown files (linkerd/linkerd2-proxy#1707)
* test: replace `profile_test!` macro with builder (linkerd/linkerd2-proxy#1705)
* build(deps): bump tj-actions/changed-files from 20.2 to 21 (linkerd/linkerd2-proxy#1712)
* dev: Fix the `just docker` recipe (linkerd/linkerd2-proxy#1713)
* build(deps): bump prettyplease from 0.1.10 to 0.1.11 (linkerd/linkerd2-proxy#1714)
* justfile: generate a default docker tag name (linkerd/linkerd2-proxy#1716)
* build(deps): bump tj-actions/changed-files from 21 to 22.2 (linkerd/linkerd2-proxy#1727)
* build(deps): bump petgraph from 0.6.1 to 0.6.2 (linkerd/linkerd2-proxy#1717)
* build(deps): bump clang-sys from 1.3.2 to 1.3.3 (linkerd/linkerd2-proxy#1718)
* build(deps): bump flate2 from 1.0.23 to 1.0.24 (linkerd/linkerd2-proxy#1719)
* build(deps): bump hyper from 0.14.18 to 0.14.19 (linkerd/linkerd2-proxy#1720)
* build(deps): bump miniz_oxide from 0.5.1 to 0.5.3 (linkerd/linkerd2-proxy#1722)
* build(deps): bump bumpalo from 3.9.1 to 3.10.0 (linkerd/linkerd2-proxy#1728)
* build(deps): bump async-trait from 0.1.53 to 0.1.56 (linkerd/linkerd2-proxy#1729)
* build(deps): bump parking_lot from 0.12.0 to 0.12.1 (linkerd/linkerd2-proxy#1730)
* build(deps): bump indexmap from 1.7.0 to 1.8.2 (linkerd/linkerd2-proxy#1732)
* http-box: add `EraseResponse` middleware (linkerd/linkerd2-proxy#1723)
* test: don't generate discovery tests in a macro (linkerd/linkerd2-proxy#1711)
* stack: add `ProxyService` for composing a `Proxy` with a `Service` (linkerd/linkerd2-proxy#1726)
* build(deps): bump tokio-stream from 0.1.8 to 0.1.9 (linkerd/linkerd2-proxy#1733)
* build(deps): bump tokio-macros from 1.7.0 to 1.8.0 (linkerd/linkerd2-proxy#1736)
* build(deps): bump tokio from 1.18.2 to 1.19.2 (linkerd/linkerd2-proxy#1737)
* Add 'group' labels to describe policy resources (linkerd/linkerd2-proxy#1738)
* build(deps): bump tokio-util from 0.7.2 to 0.7.3 (linkerd/linkerd2-proxy#1735)
* Move policy protobuf handling into the `server-policy` crate (linkerd/linkerd2-proxy#1739)
* build(deps): bump http from 0.2.7 to 0.2.8 (linkerd/linkerd2-proxy#1740)
* Implement `Deref` for address newtypes (linkerd/linkerd2-proxy#1741)
* Rename `Route*` to `ProfileRoute*` (linkerd/linkerd2-proxy#1742)
* Rename target types from Route to ProfileRoute (linkerd/linkerd2-proxy#1743)

Signed-off-by: Oliver Gould <[email protected]>
Signed-off-by: zhlsunshine <[email protected]>
hawkw added a commit that referenced this pull request Jun 22, 2022
Currently, gRPC responses are classified for metrics based on the value
of the `grpc-status` header in either the initial `HEADERS` frame *or*
in the `TRAILERS` frame that terminates the response body. However, this
is *not* the case for retries. Because we don't want to buffer the
entire response body before forwarding it to the client (introducing
latency, and potentially breaking client behavior in the case of
long-running streams), we make retry decisions for gRPC based only on
`grpc-status` in the initial `HEADERS` frame.

Unfortunately, some gRPC implementations (such as Akka) will send the
`grpc-status` header in a `TRAILERS` frame even when the body is empty
(see linkerd/linkerd2#7701). In that case, Linkerd won't retry the
request, even though it wouldn't actually have to wait to buffer a long
body before making a retry decision.

This branch resolves this issue by changing the retry implementation so
that the proxy will wait for a single additional frame after the first
`HEADERS` frame before making a retry decision. If the next frame is a
`TRAILERS` frame that terminates the response stream, we can include the
value of the `grpc-status` in that `TRAILERS` frame in the retry
decision. Otherwise, if the next frame is a `DATA` frame, we buffer only
a single frame, give up on trying to retry, and forward that frame to
the client, followed by the rest of the body.

Unfortunately, this change is a bit complicated, as it was necessary to
introduce the ability for retries to modify the response body as well as
the request body. This then implies that we need to be able to erase
response body types as well, when they may differ based on whether or
not retries are enabled for a route. I tried a number of different ways
of structuring this change, such as passing an additional `Layer` into
the `Retry` service that wraps the service constructed for retries, but
this was kind of a mess. Ultimately, I felt like the cleanest way of
doing this was changing the `linkerd_retry::PrepareRequest` trait to a
`PrepareRetry` trait that can also modify response bodies.

I'm open to suggestions for a nicer way of structuing this change. I
also considered the alternative of giving up on `tower::retry` entirely
and writing our own retry service from scratch, but I wanted to try to
avoid that if it was possible.

Depends on #1705 and #1726.

Fixes linkerd/linkerd2#7701.

Signed-off-by: Eliza Weisman <[email protected]>
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.

2 participants