Merge pull request #45847 from thaJeztah/sysinfo_singleflight

api: use singleflight for /info endpoint
This commit is contained in:
Sebastiaan van Stijn 2023-07-04 13:45:49 +02:00 committed by GitHub
commit 4ee0cf6878
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 27 deletions

View file

@ -2,7 +2,9 @@ package system // import "github.com/docker/docker/api/server/router/system"
import ( import (
"github.com/docker/docker/api/server/router" "github.com/docker/docker/api/server/router"
"github.com/docker/docker/api/types"
buildkit "github.com/docker/docker/builder/builder-next" buildkit "github.com/docker/docker/builder/builder-next"
"resenje.org/singleflight"
) )
// systemRouter provides information about the Docker system overall. // systemRouter provides information about the Docker system overall.
@ -13,6 +15,11 @@ type systemRouter struct {
routes []router.Route routes []router.Route
builder *buildkit.Builder builder *buildkit.Builder
features func() map[string]bool features func() map[string]bool
// collectSystemInfo is a single-flight for the /info endpoint,
// unique per API version (as different API versions may return
// a different API response).
collectSystemInfo singleflight.Group[string, *types.Info]
} }
// NewRouter initializes a new system router // NewRouter initializes a new system router

View file

@ -57,38 +57,41 @@ func (s *systemRouter) swarmStatus() string {
} }
func (s *systemRouter) getInfo(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { func (s *systemRouter) getInfo(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
info := s.backend.SystemInfo()
if s.cluster != nil {
info.Swarm = s.cluster.Info()
info.Warnings = append(info.Warnings, info.Swarm.Warnings...)
}
version := httputils.VersionFromContext(ctx) version := httputils.VersionFromContext(ctx)
if versions.LessThan(version, "1.25") { info, _, _ := s.collectSystemInfo.Do(ctx, version, func(ctx context.Context) (*types.Info, error) {
// TODO: handle this conversion in engine-api info := s.backend.SystemInfo()
kvSecOpts, err := types.DecodeSecurityOptions(info.SecurityOptions)
if err != nil { if s.cluster != nil {
info.Warnings = append(info.Warnings, err.Error()) info.Swarm = s.cluster.Info()
info.Warnings = append(info.Warnings, info.Swarm.Warnings...)
} }
var nameOnly []string
for _, so := range kvSecOpts { if versions.LessThan(version, "1.25") {
nameOnly = append(nameOnly, so.Name) // TODO: handle this conversion in engine-api
kvSecOpts, err := types.DecodeSecurityOptions(info.SecurityOptions)
if err != nil {
info.Warnings = append(info.Warnings, err.Error())
}
var nameOnly []string
for _, so := range kvSecOpts {
nameOnly = append(nameOnly, so.Name)
}
info.SecurityOptions = nameOnly
info.ExecutionDriver = "<not supported>" //nolint:staticcheck // ignore SA1019 (ExecutionDriver is deprecated)
} }
info.SecurityOptions = nameOnly if versions.LessThan(version, "1.39") {
info.ExecutionDriver = "<not supported>" //nolint:staticcheck // ignore SA1019 (ExecutionDriver is deprecated) if info.KernelVersion == "" {
} info.KernelVersion = "<unknown>"
if versions.LessThan(version, "1.39") { }
if info.KernelVersion == "" { if info.OperatingSystem == "" {
info.KernelVersion = "<unknown>" info.OperatingSystem = "<unknown>"
}
} }
if info.OperatingSystem == "" { if versions.GreaterThanOrEqualTo(version, "1.42") {
info.OperatingSystem = "<unknown>" info.KernelMemory = false
} }
} return info, nil
if versions.GreaterThanOrEqualTo(version, "1.42") { })
info.KernelMemory = false
}
return httputils.WriteJSON(w, http.StatusOK, info) return httputils.WriteJSON(w, http.StatusOK, info)
} }