Merge pull request #45847 from thaJeztah/sysinfo_singleflight
api: use singleflight for /info endpoint
This commit is contained in:
commit
4ee0cf6878
2 changed files with 37 additions and 27 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue