mirror of
https://github.com/containers/podman.git
synced 2025-05-22 01:27:07 +08:00
libpod: do not call (*container).Config()
Access the container's config field directly inside of libpod instead of calling `Config()` which in turn creates expensive JSON deep copies. Accessing the field directly drops memory consumption of a simple `podman run --rm busybox true` from 1245kB to 410kB. [NO TESTS NEEDED] Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
@ -174,7 +174,7 @@ func (c *Container) copyToArchive(ctx context.Context, path string, writer io.Wr
|
||||
|
||||
// getContainerUser returns the specs.User and ID mappings of the container.
|
||||
func getContainerUser(container *Container, mountPoint string) (specs.User, error) {
|
||||
userspec := container.Config().User
|
||||
userspec := container.config.User
|
||||
|
||||
uid, gid, _, err := chrootuser.GetUser(mountPoint, userspec)
|
||||
u := specs.User{
|
||||
|
@ -923,12 +923,11 @@ func (c *Container) checkDependenciesRunning() ([]string, error) {
|
||||
}
|
||||
|
||||
// Check the status
|
||||
conf := depCtr.Config()
|
||||
state, err := depCtr.State()
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "error retrieving state of dependency %s of container %s", dep, c.ID())
|
||||
}
|
||||
if state != define.ContainerStateRunning && !conf.IsInfra {
|
||||
if state != define.ContainerStateRunning && !depCtr.config.IsInfra {
|
||||
notRunning = append(notRunning, dep)
|
||||
}
|
||||
depCtrs[dep] = depCtr
|
||||
@ -1003,7 +1002,7 @@ func (c *Container) cniHosts() string {
|
||||
for _, status := range c.getNetworkStatus() {
|
||||
for _, netInt := range status.Interfaces {
|
||||
for _, netAddress := range netInt.Networks {
|
||||
hosts += fmt.Sprintf("%s\t%s %s\n", netAddress.Subnet.IP.String(), c.Hostname(), c.Config().Name)
|
||||
hosts += fmt.Sprintf("%s\t%s %s\n", netAddress.Subnet.IP.String(), c.Hostname(), c.config.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2106,7 +2105,7 @@ func (c *Container) canWithPrevious() error {
|
||||
// JSON files for later export
|
||||
func (c *Container) prepareCheckpointExport() error {
|
||||
// save live config
|
||||
if _, err := metadata.WriteJSONFile(c.Config(), c.bundlePath(), metadata.ConfigDumpFile); err != nil {
|
||||
if _, err := metadata.WriteJSONFile(c.config, c.bundlePath(), metadata.ConfigDumpFile); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -112,7 +112,7 @@ func (c *Container) resolvePath(mountPoint string, containerPath string) (string
|
||||
func findVolume(c *Container, containerPath string) (*Volume, error) {
|
||||
runtime := c.Runtime()
|
||||
cleanedContainerPath := filepath.Clean(containerPath)
|
||||
for _, vol := range c.Config().NamedVolumes {
|
||||
for _, vol := range c.config.NamedVolumes {
|
||||
if cleanedContainerPath == filepath.Clean(vol.Dest) {
|
||||
return runtime.GetVolume(vol.Name)
|
||||
}
|
||||
@ -124,7 +124,7 @@ func findVolume(c *Container, containerPath string) (*Volume, error) {
|
||||
// Volume's destination.
|
||||
func isPathOnVolume(c *Container, containerPath string) bool {
|
||||
cleanedContainerPath := filepath.Clean(containerPath)
|
||||
for _, vol := range c.Config().NamedVolumes {
|
||||
for _, vol := range c.config.NamedVolumes {
|
||||
if cleanedContainerPath == filepath.Clean(vol.Dest) {
|
||||
return true
|
||||
}
|
||||
@ -141,7 +141,7 @@ func isPathOnVolume(c *Container, containerPath string) bool {
|
||||
// path of a Mount. Returns a matching Mount or nil.
|
||||
func findBindMount(c *Container, containerPath string) *specs.Mount {
|
||||
cleanedPath := filepath.Clean(containerPath)
|
||||
for _, m := range c.Config().Spec.Mounts {
|
||||
for _, m := range c.config.Spec.Mounts {
|
||||
if m.Type != "bind" {
|
||||
continue
|
||||
}
|
||||
@ -157,7 +157,7 @@ func findBindMount(c *Container, containerPath string) *specs.Mount {
|
||||
// Mount's destination.
|
||||
func isPathOnBindMount(c *Container, containerPath string) bool {
|
||||
cleanedContainerPath := filepath.Clean(containerPath)
|
||||
for _, m := range c.Config().Spec.Mounts {
|
||||
for _, m := range c.config.Spec.Mounts {
|
||||
if cleanedContainerPath == filepath.Clean(m.Destination) {
|
||||
return true
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ func (p *Pod) GenerateForKube(ctx context.Context) (*v1.Pod, []v1.ServicePort, e
|
||||
// so set it at here
|
||||
for _, ctr := range allContainers {
|
||||
if !ctr.IsInfra() {
|
||||
switch ctr.Config().RestartPolicy {
|
||||
switch ctr.config.RestartPolicy {
|
||||
case define.RestartPolicyAlways:
|
||||
pod.Spec.RestartPolicy = v1.RestartPolicyAlways
|
||||
case define.RestartPolicyOnFailure:
|
||||
|
@ -222,7 +222,7 @@ func (r *Runtime) setupSlirp4netns(ctr *Container) error {
|
||||
defer errorhandling.CloseQuiet(syncR)
|
||||
defer errorhandling.CloseQuiet(syncW)
|
||||
|
||||
havePortMapping := len(ctr.Config().PortMappings) > 0
|
||||
havePortMapping := len(ctr.config.PortMappings) > 0
|
||||
logPath := filepath.Join(ctr.runtime.config.Engine.TmpDir, fmt.Sprintf("slirp4netns-%s.log", ctr.config.ID))
|
||||
|
||||
ctrNetworkSlipOpts := []string{}
|
||||
|
@ -1150,7 +1150,7 @@ func (r *ConmonOCIRuntime) createOCIContainer(ctr *Container, restoreOptions *Co
|
||||
|
||||
if ctr.config.NetMode.IsSlirp4netns() || rootless.IsRootless() {
|
||||
if ctr.config.PostConfigureNetNS {
|
||||
havePortMapping := len(ctr.Config().PortMappings) > 0
|
||||
havePortMapping := len(ctr.config.PortMappings) > 0
|
||||
if havePortMapping {
|
||||
ctr.rootlessPortSyncR, ctr.rootlessPortSyncW, err = os.Pipe()
|
||||
if err != nil {
|
||||
|
@ -164,8 +164,7 @@ func (p *Pod) PidMode() string {
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
conf := infra.Config()
|
||||
ctrSpec := conf.Spec
|
||||
ctrSpec := infra.config.Spec
|
||||
if ctrSpec != nil && ctrSpec.Linux != nil {
|
||||
for _, ns := range ctrSpec.Linux.Namespaces {
|
||||
if ns.Type == specs.PIDNamespace {
|
||||
@ -186,8 +185,7 @@ func (p *Pod) UserNSMode() string {
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
conf := infra.Config()
|
||||
ctrSpec := conf.Spec
|
||||
ctrSpec := infra.config.Spec
|
||||
if ctrSpec != nil && ctrSpec.Linux != nil {
|
||||
for _, ns := range ctrSpec.Linux.Namespaces {
|
||||
if ns.Type == specs.UserNamespace {
|
||||
|
@ -34,7 +34,7 @@ func (p *Pod) startInitContainers(ctx context.Context) error {
|
||||
}
|
||||
// If the container is a once init container, we need to remove it
|
||||
// after it runs
|
||||
if initCon.Config().InitContainerType == define.OneShotInitContainer {
|
||||
if initCon.config.InitContainerType == define.OneShotInitContainer {
|
||||
icLock := initCon.lock
|
||||
icLock.Lock()
|
||||
if err := p.runtime.removeContainer(ctx, initCon, false, false, true); err != nil {
|
||||
@ -590,16 +590,16 @@ func (p *Pod) Inspect() (*define.InspectPodData, error) {
|
||||
return nil, err
|
||||
}
|
||||
infraConfig = new(define.InspectPodInfraConfig)
|
||||
infraConfig.HostNetwork = !infra.Config().ContainerNetworkConfig.UseImageHosts
|
||||
infraConfig.StaticIP = infra.Config().ContainerNetworkConfig.StaticIP
|
||||
infraConfig.NoManageResolvConf = infra.Config().UseImageResolvConf
|
||||
infraConfig.NoManageHosts = infra.Config().UseImageHosts
|
||||
infraConfig.HostNetwork = !infra.config.ContainerNetworkConfig.UseImageHosts
|
||||
infraConfig.StaticIP = infra.config.ContainerNetworkConfig.StaticIP
|
||||
infraConfig.NoManageResolvConf = infra.config.UseImageResolvConf
|
||||
infraConfig.NoManageHosts = infra.config.UseImageHosts
|
||||
infraConfig.CPUPeriod = p.CPUPeriod()
|
||||
infraConfig.CPUQuota = p.CPUQuota()
|
||||
infraConfig.CPUSetCPUs = p.ResourceLim().CPU.Cpus
|
||||
infraConfig.PidNS = p.PidMode()
|
||||
infraConfig.UserNS = p.UserNSMode()
|
||||
namedVolumes, mounts := infra.sortUserVolumes(infra.Config().Spec)
|
||||
namedVolumes, mounts := infra.sortUserVolumes(infra.config.Spec)
|
||||
inspectMounts, err = infra.GetInspectMounts(namedVolumes, infra.config.ImageVolumes, mounts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -611,30 +611,30 @@ func (p *Pod) Inspect() (*define.InspectPodData, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(infra.Config().ContainerNetworkConfig.DNSServer) > 0 {
|
||||
infraConfig.DNSServer = make([]string, 0, len(infra.Config().ContainerNetworkConfig.DNSServer))
|
||||
for _, entry := range infra.Config().ContainerNetworkConfig.DNSServer {
|
||||
if len(infra.config.ContainerNetworkConfig.DNSServer) > 0 {
|
||||
infraConfig.DNSServer = make([]string, 0, len(infra.config.ContainerNetworkConfig.DNSServer))
|
||||
for _, entry := range infra.config.ContainerNetworkConfig.DNSServer {
|
||||
infraConfig.DNSServer = append(infraConfig.DNSServer, entry.String())
|
||||
}
|
||||
}
|
||||
if len(infra.Config().ContainerNetworkConfig.DNSSearch) > 0 {
|
||||
infraConfig.DNSSearch = make([]string, 0, len(infra.Config().ContainerNetworkConfig.DNSSearch))
|
||||
infraConfig.DNSSearch = append(infraConfig.DNSSearch, infra.Config().ContainerNetworkConfig.DNSSearch...)
|
||||
if len(infra.config.ContainerNetworkConfig.DNSSearch) > 0 {
|
||||
infraConfig.DNSSearch = make([]string, 0, len(infra.config.ContainerNetworkConfig.DNSSearch))
|
||||
infraConfig.DNSSearch = append(infraConfig.DNSSearch, infra.config.ContainerNetworkConfig.DNSSearch...)
|
||||
}
|
||||
if len(infra.Config().ContainerNetworkConfig.DNSOption) > 0 {
|
||||
infraConfig.DNSOption = make([]string, 0, len(infra.Config().ContainerNetworkConfig.DNSOption))
|
||||
infraConfig.DNSOption = append(infraConfig.DNSOption, infra.Config().ContainerNetworkConfig.DNSOption...)
|
||||
if len(infra.config.ContainerNetworkConfig.DNSOption) > 0 {
|
||||
infraConfig.DNSOption = make([]string, 0, len(infra.config.ContainerNetworkConfig.DNSOption))
|
||||
infraConfig.DNSOption = append(infraConfig.DNSOption, infra.config.ContainerNetworkConfig.DNSOption...)
|
||||
}
|
||||
if len(infra.Config().HostAdd) > 0 {
|
||||
infraConfig.HostAdd = make([]string, 0, len(infra.Config().HostAdd))
|
||||
infraConfig.HostAdd = append(infraConfig.HostAdd, infra.Config().HostAdd...)
|
||||
if len(infra.config.HostAdd) > 0 {
|
||||
infraConfig.HostAdd = make([]string, 0, len(infra.config.HostAdd))
|
||||
infraConfig.HostAdd = append(infraConfig.HostAdd, infra.config.HostAdd...)
|
||||
}
|
||||
if len(infra.Config().ContainerNetworkConfig.Networks) > 0 {
|
||||
infraConfig.Networks = make([]string, 0, len(infra.Config().ContainerNetworkConfig.Networks))
|
||||
infraConfig.Networks = append(infraConfig.Networks, infra.Config().ContainerNetworkConfig.Networks...)
|
||||
if len(infra.config.ContainerNetworkConfig.Networks) > 0 {
|
||||
infraConfig.Networks = make([]string, 0, len(infra.config.ContainerNetworkConfig.Networks))
|
||||
infraConfig.Networks = append(infraConfig.Networks, infra.config.ContainerNetworkConfig.Networks...)
|
||||
}
|
||||
infraConfig.NetworkOptions = infra.Config().ContainerNetworkConfig.NetworkOptions
|
||||
infraConfig.PortBindings = makeInspectPortBindings(infra.Config().ContainerNetworkConfig.PortMappings, nil)
|
||||
infraConfig.NetworkOptions = infra.config.ContainerNetworkConfig.NetworkOptions
|
||||
infraConfig.PortBindings = makeInspectPortBindings(infra.config.ContainerNetworkConfig.PortMappings, nil)
|
||||
}
|
||||
|
||||
inspectData := define.InspectPodData{
|
||||
|
Reference in New Issue
Block a user