Skip to content

Merge upstream changes - #2

Open
tjovicic wants to merge 16 commits into
dragonflydb:mainfrom
andydunstall:main
Open

Merge upstream changes#2
tjovicic wants to merge 16 commits into
dragonflydb:mainfrom
andydunstall:main

Conversation

@tjovicic

Copy link
Copy Markdown

No description provided.

andydunstall and others added 16 commits January 1, 2026 06:48
Issue
=====

In a normal TCP/HTTP server, the TCP listener can be closed to stop
accepting new connections, without closing established connections. That
means the server can gracefully shut down by first closing the listener,
then waiting for in-progress requests on the established connections to
complete before closing them, which is how Go `http.Server.Shutdown()`
works.

The issue is in Piko, each upstream `Listener` opens a single outbound
connection to the server, then incoming connections are multiplexed on
that underlying connection.

`Listener.Close()` closes the underlying connection, meaning it stops
accepting new connections **and** closes established multiplex
connections. So graceful shutdown isn't supported.

Fix
===

Piko uses `yamux` for multiplexing, which supports stopping accepting
connections without closing the underlying connection using
`GoAway()`. Therefore instead of `Listener.Close()` closing the
underlying connection, it can call `GoAway()`, so graceful shutdown
works as expected.

`GoAway()` also notifies the server that the upstream is no longer
accepting connections, so the server can stop routing connections to
the upstream, whilst maintaining existing multiplexed connections.

This also adds `Listener.Shutdown()` to explicitly shut down the
underlying connection.

Fixes #290.

Limitations
===========

For the server to discover the upstream is no longer sending
connections, it must attempt to open a new multiplexed connection, which
will fail. Therefore the first request to an upstream whilst its doing a
graceful shutdown will fail, then its up to the client to retry.

If this becomes an issue it could be improved in the future, though as
upstreams disconnecting can already cause errors it seems ok for now.
Bumps [github.com/goccy/go-yaml](https://github.com/goccy/go-yaml) from 1.19.1 to 1.19.2.
- [Release notes](https://github.com/goccy/go-yaml/releases)
- [Changelog](https://github.com/goccy/go-yaml/blob/master/CHANGELOG.md)
- [Commits](goccy/go-yaml@v1.19.1...v1.19.2)

---
updated-dependencies:
- dependency-name: github.com/goccy/go-yaml
  dependency-version: 1.19.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.3.0 to 5.3.1.
- [Release notes](https://github.com/golang-jwt/jwt/releases)
- [Commits](golang-jwt/jwt@v5.3.0...v5.3.1)

---
updated-dependencies:
- dependency-name: github.com/golang-jwt/jwt/v5
  dependency-version: 5.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
#307)

Bumps [github.com/MicahParks/keyfunc/v3](https://github.com/MicahParks/keyfunc) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/MicahParks/keyfunc/releases)
- [Commits](MicahParks/keyfunc@v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: github.com/MicahParks/keyfunc/v3
  dependency-version: 3.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [github.com/gin-gonic/gin](https://github.com/gin-gonic/gin) from 1.11.0 to 1.12.0.
- [Release notes](https://github.com/gin-gonic/gin/releases)
- [Changelog](https://github.com/gin-gonic/gin/blob/master/CHANGELOG.md)
- [Commits](gin-gonic/gin@v1.11.0...v1.12.0)

---
updated-dependencies:
- dependency-name: github.com/gin-gonic/gin
  dependency-version: 1.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.19.0 to 0.20.0.
- [Commits](golang/sync@v0.19.0...v0.20.0)

---
updated-dependencies:
- dependency-name: golang.org/x/sync
  dependency-version: 0.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…311)

Bumps [github.com/go-jose/go-jose/v4](https://github.com/go-jose/go-jose) from 4.1.3 to 4.1.4.
- [Release notes](https://github.com/go-jose/go-jose/releases)
- [Commits](go-jose/go-jose@v4.1.3...v4.1.4)

---
updated-dependencies:
- dependency-name: github.com/go-jose/go-jose/v4
  dependency-version: 4.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [go.uber.org/zap](https://github.com/uber-go/zap) from 1.27.1 to 1.28.0.
- [Release notes](https://github.com/uber-go/zap/releases)
- [Changelog](https://github.com/uber-go/zap/blob/master/CHANGELOG.md)
- [Commits](uber-go/zap@v1.27.1...v1.28.0)

---
updated-dependencies:
- dependency-name: go.uber.org/zap
  dependency-version: 1.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@tjovicic tjovicic closed this May 21, 2026
@tjovicic tjovicic reopened this May 21, 2026
@tjovicic tjovicic closed this May 21, 2026
@tjovicic tjovicic reopened this May 21, 2026
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.

3 participants