Merge pull request #17210 from vrothberg/ps-sync

ps: do not sync container
This commit is contained in:
OpenShift Merge Robot 2023-01-26 10:47:18 -05:00 committed by GitHub
commit 574c92b8ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 115 additions and 107 deletions

View file

@ -598,7 +598,7 @@ func (s *BoltState) Container(id string) (*Container, error) {
return err return err
} }
return s.getContainerFromDB(ctrID, ctr, ctrBucket) return s.getContainerFromDB(ctrID, ctr, ctrBucket, false)
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -703,7 +703,7 @@ func (s *BoltState) LookupContainer(idOrName string) (*Container, error) {
return err return err
} }
return s.getContainerFromDB(id, ctr, ctrBucket) return s.getContainerFromDB(id, ctr, ctrBucket, false)
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -815,8 +815,6 @@ func (s *BoltState) UpdateContainer(ctr *Container) error {
return fmt.Errorf("container %s is in namespace %q, does not match our namespace %q: %w", ctr.ID(), ctr.config.Namespace, s.namespace, define.ErrNSMismatch) return fmt.Errorf("container %s is in namespace %q, does not match our namespace %q: %w", ctr.ID(), ctr.config.Namespace, s.namespace, define.ErrNSMismatch)
} }
newState := new(ContainerState)
ctrID := []byte(ctr.ID()) ctrID := []byte(ctr.ID())
db, err := s.getDBCon() db, err := s.getDBCon()
@ -825,43 +823,13 @@ func (s *BoltState) UpdateContainer(ctr *Container) error {
} }
defer s.deferredCloseDBCon(db) defer s.deferredCloseDBCon(db)
err = db.View(func(tx *bolt.Tx) error { return db.View(func(tx *bolt.Tx) error {
ctrBucket, err := getCtrBucket(tx) ctrBucket, err := getCtrBucket(tx)
if err != nil { if err != nil {
return err return err
} }
return s.getContainerStateDB(ctrID, ctr, ctrBucket)
ctrToUpdate := ctrBucket.Bucket(ctrID)
if ctrToUpdate == nil {
ctr.valid = false
return fmt.Errorf("container %s does not exist in database: %w", ctr.ID(), define.ErrNoSuchCtr)
}
newStateBytes := ctrToUpdate.Get(stateKey)
if newStateBytes == nil {
return fmt.Errorf("container %s does not have a state key in DB: %w", ctr.ID(), define.ErrInternal)
}
if err := json.Unmarshal(newStateBytes, newState); err != nil {
return fmt.Errorf("unmarshalling container %s state: %w", ctr.ID(), err)
}
// backwards compat, previously we used a extra bucket for the netns so try to get it from there
netNSBytes := ctrToUpdate.Get(netNSKey)
if netNSBytes != nil && newState.NetNS == "" {
newState.NetNS = string(netNSBytes)
}
return nil
}) })
if err != nil {
return err
}
// New state compiled successfully, swap it into the current state
ctr.state = newState
return nil
} }
// SaveContainer saves a container's current state in the database // SaveContainer saves a container's current state in the database
@ -982,7 +950,8 @@ func (s *BoltState) ContainerInUse(ctr *Container) ([]string, error) {
} }
// AllContainers retrieves all the containers in the database // AllContainers retrieves all the containers in the database
func (s *BoltState) AllContainers() ([]*Container, error) { // If `loadState` is set, the containers' state will be loaded as well.
func (s *BoltState) AllContainers(loadState bool) ([]*Container, error) {
if !s.valid { if !s.valid {
return nil, define.ErrDBClosed return nil, define.ErrDBClosed
} }
@ -1019,7 +988,7 @@ func (s *BoltState) AllContainers() ([]*Container, error) {
ctr.config = new(ContainerConfig) ctr.config = new(ContainerConfig)
ctr.state = new(ContainerState) ctr.state = new(ContainerState)
if err := s.getContainerFromDB(id, ctr, ctrBucket); err != nil { if err := s.getContainerFromDB(id, ctr, ctrBucket, loadState); err != nil {
// If the error is a namespace mismatch, we can // If the error is a namespace mismatch, we can
// ignore it safely. // ignore it safely.
// We just won't include the container in the // We just won't include the container in the
@ -2495,7 +2464,7 @@ func (s *BoltState) PodContainers(pod *Pod) ([]*Container, error) {
newCtr.state = new(ContainerState) newCtr.state = new(ContainerState)
ctrs = append(ctrs, newCtr) ctrs = append(ctrs, newCtr)
return s.getContainerFromDB(id, newCtr, ctrBkt) return s.getContainerFromDB(id, newCtr, ctrBkt, false)
}) })
if err != nil { if err != nil {
return err return err

View file

@ -428,11 +428,45 @@ func (s *BoltState) getContainerConfigFromDB(id []byte, config *ContainerConfig,
return nil return nil
} }
func (s *BoltState) getContainerFromDB(id []byte, ctr *Container, ctrsBkt *bolt.Bucket) error { func (s *BoltState) getContainerStateDB(id []byte, ctr *Container, ctrsBkt *bolt.Bucket) error {
newState := new(ContainerState)
ctrToUpdate := ctrsBkt.Bucket(id)
if ctrToUpdate == nil {
ctr.valid = false
return fmt.Errorf("container %s does not exist in database: %w", ctr.ID(), define.ErrNoSuchCtr)
}
newStateBytes := ctrToUpdate.Get(stateKey)
if newStateBytes == nil {
return fmt.Errorf("container %s does not have a state key in DB: %w", ctr.ID(), define.ErrInternal)
}
if err := json.Unmarshal(newStateBytes, newState); err != nil {
return fmt.Errorf("unmarshalling container %s state: %w", ctr.ID(), err)
}
// backwards compat, previously we used a extra bucket for the netns so try to get it from there
netNSBytes := ctrToUpdate.Get(netNSKey)
if netNSBytes != nil && newState.NetNS == "" {
newState.NetNS = string(netNSBytes)
}
// New state compiled successfully, swap it into the current state
ctr.state = newState
return nil
}
func (s *BoltState) getContainerFromDB(id []byte, ctr *Container, ctrsBkt *bolt.Bucket, loadState bool) error {
if err := s.getContainerConfigFromDB(id, ctr.config, ctrsBkt); err != nil { if err := s.getContainerConfigFromDB(id, ctr.config, ctrsBkt); err != nil {
return err return err
} }
if loadState {
if err := s.getContainerStateDB(id, ctr, ctrsBkt); err != nil {
return err
}
}
// Get the lock // Get the lock
lock, err := s.runtime.lockManager.RetrieveLock(ctr.config.LockID) lock, err := s.runtime.lockManager.RetrieveLock(ctr.config.LockID)
if err != nil { if err != nil {

View file

@ -829,10 +829,6 @@ func (c *Container) Batch(batchFunc func(*Container) error) error {
c.lock.Lock() c.lock.Lock()
defer c.lock.Unlock() defer c.lock.Unlock()
if err := c.syncContainer(); err != nil {
return err
}
newCtr := new(Container) newCtr := new(Container)
newCtr.config = c.config newCtr.config = c.config
newCtr.state = c.state newCtr.state = c.state

View file

@ -283,7 +283,7 @@ func (r *RootlessNetNS) Cleanup(runtime *Runtime) error {
// only if the netns is empty we know that we do not need cleanup // only if the netns is empty we know that we do not need cleanup
return c.state.NetNS != "" return c.state.NetNS != ""
} }
ctrs, err := runtime.GetContainers(activeNetns) ctrs, err := runtime.GetContainers(false, activeNetns)
if err != nil { if err != nil {
return err return err
} }

View file

@ -777,7 +777,7 @@ func (r *Runtime) Shutdown(force bool) error {
// Shutdown all containers if --force is given // Shutdown all containers if --force is given
if force { if force {
ctrs, err := r.state.AllContainers() ctrs, err := r.state.AllContainers(false)
if err != nil { if err != nil {
logrus.Errorf("Retrieving containers from database: %v", err) logrus.Errorf("Retrieving containers from database: %v", err)
} else { } else {
@ -833,7 +833,7 @@ func (r *Runtime) refresh(alivePath string) error {
// Next refresh the state of all containers to recreate dirs and // Next refresh the state of all containers to recreate dirs and
// namespaces, and all the pods to recreate cgroups. // namespaces, and all the pods to recreate cgroups.
// Containers, pods, and volumes must also reacquire their locks. // Containers, pods, and volumes must also reacquire their locks.
ctrs, err := r.state.AllContainers() ctrs, err := r.state.AllContainers(false)
if err != nil { if err != nil {
return fmt.Errorf("retrieving all containers from state: %w", err) return fmt.Errorf("retrieving all containers from state: %w", err)
} }

View file

@ -1116,16 +1116,17 @@ func (r *Runtime) LookupContainerID(idOrName string) (string, error) {
return r.state.LookupContainerID(idOrName) return r.state.LookupContainerID(idOrName)
} }
// GetContainers retrieves all containers from the state // GetContainers retrieves all containers from the state.
// If `loadState` is set, the containers' state will be loaded as well.
// Filters can be provided which will determine what containers are included in // Filters can be provided which will determine what containers are included in
// the output. Multiple filters are handled by ANDing their output, so only // the output. Multiple filters are handled by ANDing their output, so only
// containers matching all filters are returned // containers matching all filters are returned
func (r *Runtime) GetContainers(filters ...ContainerFilter) ([]*Container, error) { func (r *Runtime) GetContainers(loadState bool, filters ...ContainerFilter) ([]*Container, error) {
if !r.valid { if !r.valid {
return nil, define.ErrRuntimeStopped return nil, define.ErrRuntimeStopped
} }
ctrs, err := r.GetAllContainers() ctrs, err := r.state.AllContainers(loadState)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1148,7 +1149,7 @@ func (r *Runtime) GetContainers(filters ...ContainerFilter) ([]*Container, error
// GetAllContainers is a helper function for GetContainers // GetAllContainers is a helper function for GetContainers
func (r *Runtime) GetAllContainers() ([]*Container, error) { func (r *Runtime) GetAllContainers() ([]*Container, error) {
return r.state.AllContainers() return r.state.AllContainers(false)
} }
// GetRunningContainers is a helper function for GetContainers // GetRunningContainers is a helper function for GetContainers
@ -1157,7 +1158,7 @@ func (r *Runtime) GetRunningContainers() ([]*Container, error) {
state, _ := c.State() state, _ := c.State()
return state == define.ContainerStateRunning return state == define.ContainerStateRunning
} }
return r.GetContainers(running) return r.GetContainers(false, running)
} }
// GetContainersByList is a helper function for GetContainers // GetContainersByList is a helper function for GetContainers
@ -1231,7 +1232,7 @@ func (r *Runtime) PruneContainers(filterFuncs []ContainerFilter) ([]*reports.Pru
return false return false
} }
filterFuncs = append(filterFuncs, containerStateFilter) filterFuncs = append(filterFuncs, containerStateFilter)
delContainers, err := r.GetContainers(filterFuncs...) delContainers, err := r.GetContainers(false, filterFuncs...)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -28,7 +28,7 @@ func (r *Runtime) RemoveContainersForImageCallback(ctx context.Context) libimage
if !r.valid { if !r.valid {
return define.ErrRuntimeStopped return define.ErrRuntimeStopped
} }
ctrs, err := r.state.AllContainers() ctrs, err := r.state.AllContainers(false)
if err != nil { if err != nil {
return err return err
} }

View file

@ -49,7 +49,7 @@ func (r *Runtime) migrate() error {
return err return err
} }
allCtrs, err := r.state.AllContainers() allCtrs, err := r.state.AllContainers(false)
if err != nil { if err != nil {
return err return err
} }

View file

@ -20,7 +20,7 @@ func (r *Runtime) renumberLocks() error {
return err return err
} }
allCtrs, err := r.state.AllContainers() allCtrs, err := r.state.AllContainers(false)
if err != nil { if err != nil {
return err return err
} }

View file

@ -96,9 +96,10 @@ type State interface { //nolint:interfacebloat
// The container being checked must be part of the set namespace. // The container being checked must be part of the set namespace.
ContainerInUse(ctr *Container) ([]string, error) ContainerInUse(ctr *Container) ([]string, error)
// Retrieves all containers presently in state. // Retrieves all containers presently in state.
// If `loadState` is set, the containers' state will be loaded as well.
// If a namespace is set, only containers within the namespace will be // If a namespace is set, only containers within the namespace will be
// returned. // returned.
AllContainers() ([]*Container, error) AllContainers(loadState bool) ([]*Container, error)
// Get networks the container is currently connected to. // Get networks the container is currently connected to.
GetNetworks(ctr *Container) (map[string]types.PerNetworkOptions, error) GetNetworks(ctr *Container) (map[string]types.PerNetworkOptions, error)

View file

@ -150,7 +150,7 @@ func TestAddDuplicateCtrIDFails(t *testing.T) {
err = state.AddContainer(testCtr2) err = state.AddContainer(testCtr2)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
}) })
@ -169,7 +169,7 @@ func TestAddDuplicateCtrNameFails(t *testing.T) {
err = state.AddContainer(testCtr2) err = state.AddContainer(testCtr2)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
}) })
@ -188,7 +188,7 @@ func TestAddCtrPodDupIDFails(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -207,7 +207,7 @@ func TestAddCtrPodDupNameFails(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -229,7 +229,7 @@ func TestAddCtrInPodFails(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -259,7 +259,7 @@ func TestAddCtrDepInPodFails(t *testing.T) {
err = state.AddContainer(testCtr2) err = state.AddContainer(testCtr2)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
require.Len(t, ctrs, 1) require.Len(t, ctrs, 1)
@ -285,7 +285,7 @@ func TestAddCtrDepInSameNamespaceSucceeds(t *testing.T) {
err = state.AddContainer(testCtr2) err = state.AddContainer(testCtr2)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(ctrs)) assert.Equal(t, 2, len(ctrs))
}) })
@ -309,7 +309,7 @@ func TestAddCtrDepInDifferentNamespaceFails(t *testing.T) {
err = state.AddContainer(testCtr2) err = state.AddContainer(testCtr2)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
@ -353,7 +353,7 @@ func TestAddCtrDifferentNamespaceFails(t *testing.T) {
err = state.SetNamespace("") err = state.SetNamespace("")
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -843,14 +843,14 @@ func TestRemoveContainer(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
err = state.RemoveContainer(testCtr) err = state.RemoveContainer(testCtr)
assert.NoError(t, err) assert.NoError(t, err)
ctrs2, err := state.AllContainers() ctrs2, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs2)) assert.Equal(t, 0, len(ctrs2))
}) })
@ -877,7 +877,7 @@ func TestRemoveContainerNotInNamespaceFails(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
@ -890,7 +890,7 @@ func TestRemoveContainerNotInNamespaceFails(t *testing.T) {
err = state.SetNamespace("") err = state.SetNamespace("")
assert.NoError(t, err) assert.NoError(t, err)
ctrs2, err := state.AllContainers() ctrs2, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs2)) assert.Equal(t, 1, len(ctrs2))
}) })
@ -898,7 +898,7 @@ func TestRemoveContainerNotInNamespaceFails(t *testing.T) {
func TestGetAllContainersOnNewStateIsEmpty(t *testing.T) { func TestGetAllContainersOnNewStateIsEmpty(t *testing.T) {
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) { runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -912,7 +912,7 @@ func TestGetAllContainersWithOneContainer(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
require.Len(t, ctrs, 1) require.Len(t, ctrs, 1)
@ -933,7 +933,7 @@ func TestGetAllContainersTwoContainers(t *testing.T) {
err = state.AddContainer(testCtr2) err = state.AddContainer(testCtr2)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(ctrs)) assert.Equal(t, 2, len(ctrs))
}) })
@ -952,7 +952,7 @@ func TestGetAllContainersNoContainerInNamespace(t *testing.T) {
err = state.SetNamespace("test2") err = state.SetNamespace("test2")
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -977,7 +977,7 @@ func TestGetContainerOneContainerInNamespace(t *testing.T) {
err = state.SetNamespace("test1") err = state.SetNamespace("test1")
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
@ -1186,7 +1186,7 @@ func TestCannotRemoveContainerWithDependency(t *testing.T) {
err = state.RemoveContainer(testCtr1) err = state.RemoveContainer(testCtr1)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(ctrs)) assert.Equal(t, 2, len(ctrs))
}) })
@ -1210,7 +1210,7 @@ func TestCannotRemoveContainerWithGenericDependency(t *testing.T) {
err = state.RemoveContainer(testCtr1) err = state.RemoveContainer(testCtr1)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(ctrs)) assert.Equal(t, 2, len(ctrs))
}) })
@ -1237,7 +1237,7 @@ func TestCanRemoveContainerAfterDependencyRemoved(t *testing.T) {
err = state.RemoveContainer(testCtr1) err = state.RemoveContainer(testCtr1)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -1265,7 +1265,7 @@ func TestCanRemoveContainerAfterDependencyRemovedDuplicate(t *testing.T) {
err = state.RemoveContainer(testCtr1) err = state.RemoveContainer(testCtr1)
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -1287,7 +1287,7 @@ func TestCannotUsePodAsDependency(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -1317,7 +1317,7 @@ func TestCannotUseBadIDAsDependency(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -1333,7 +1333,7 @@ func TestCannotUseBadIDAsGenericDependency(t *testing.T) {
err = state.AddContainer(testCtr) err = state.AddContainer(testCtr)
assert.Error(t, err) assert.Error(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -2630,7 +2630,7 @@ func TestRemovePodContainersPreservesCtrOutsidePod(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
}) })
@ -2778,7 +2778,7 @@ func TestAddContainerToPodSucceeds(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
require.Len(t, ctrs, 1) require.Len(t, ctrs, 1)
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
require.Len(t, allCtrs, 1) require.Len(t, allCtrs, 1)
@ -2813,7 +2813,7 @@ func TestAddContainerToPodTwoContainers(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(ctrs)) assert.Equal(t, 2, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(allCtrs)) assert.Equal(t, 2, len(allCtrs))
}) })
@ -2844,7 +2844,7 @@ func TestAddContainerToPodWithAddContainer(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
require.Len(t, ctrs, 1) require.Len(t, ctrs, 1)
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(allCtrs)) assert.Equal(t, 2, len(allCtrs))
@ -2877,7 +2877,7 @@ func TestAddContainerToPodCtrIDConflict(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
}) })
@ -2908,7 +2908,7 @@ func TestAddContainerToPodCtrNameConflict(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
}) })
@ -2933,7 +2933,7 @@ func TestAddContainerToPodPodIDConflict(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -2958,7 +2958,7 @@ func TestAddContainerToPodPodNameConflict(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3064,7 +3064,7 @@ func TestAddContainerToPodDependencyOutsidePodFails(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
@ -3137,7 +3137,7 @@ func TestAddContainerToPodDependencyInSeparateNamespaceFails(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
@ -3164,7 +3164,7 @@ func TestAddContainerToPodSameNamespaceSucceeds(t *testing.T) {
err = state.AddContainerToPod(testPod, testCtr) err = state.AddContainerToPod(testPod, testCtr)
assert.NoError(t, err) assert.NoError(t, err)
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
testContainersEqual(t, allCtrs[0], testCtr, true) testContainersEqual(t, allCtrs[0], testCtr, true)
@ -3188,7 +3188,7 @@ func TestAddContainerToPodDifferentNamespaceFails(t *testing.T) {
err = state.AddContainerToPod(testPod, testCtr) err = state.AddContainerToPod(testPod, testCtr)
assert.Error(t, err) assert.Error(t, err)
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3210,7 +3210,7 @@ func TestAddContainerToPodNamespaceOnCtrFails(t *testing.T) {
err = state.AddContainerToPod(testPod, testCtr) err = state.AddContainerToPod(testPod, testCtr)
assert.Error(t, err) assert.Error(t, err)
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3232,7 +3232,7 @@ func TestAddContainerToPodNamespaceOnPodFails(t *testing.T) {
err = state.AddContainerToPod(testPod, testCtr) err = state.AddContainerToPod(testPod, testCtr)
assert.Error(t, err) assert.Error(t, err)
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3290,7 +3290,7 @@ func TestAddCtrToPodDifferentNamespaceFails(t *testing.T) {
err = state.SetNamespace("") err = state.SetNamespace("")
assert.NoError(t, err) assert.NoError(t, err)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
}) })
@ -3360,7 +3360,7 @@ func TestRemoveContainerFromPodCtrNotInPodFails(t *testing.T) {
assert.True(t, testCtr.valid) assert.True(t, testCtr.valid)
ctrs, err := state.AllContainers() ctrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
}) })
@ -3388,7 +3388,7 @@ func TestRemoveContainerFromPodSucceeds(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3424,7 +3424,7 @@ func TestRemoveContainerFromPodWithDependencyFails(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(ctrs)) assert.Equal(t, 2, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(allCtrs)) assert.Equal(t, 2, len(allCtrs))
}) })
@ -3463,7 +3463,7 @@ func TestRemoveContainerFromPodWithDependencySucceedsAfterDepRemoved(t *testing.
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3498,7 +3498,7 @@ func TestRemoveContainerFromPodSameNamespaceSucceeds(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(ctrs)) assert.Equal(t, 0, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 0, len(allCtrs)) assert.Equal(t, 0, len(allCtrs))
}) })
@ -3536,7 +3536,7 @@ func TestRemoveContainerFromPodDifferentNamespaceFails(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(ctrs)) assert.Equal(t, 1, len(ctrs))
allCtrs, err := state.AllContainers() allCtrs, err := state.AllContainers(false)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 1, len(allCtrs)) assert.Equal(t, 1, len(allCtrs))
}) })

View file

@ -146,7 +146,7 @@ func ListContainers(w http.ResponseWriter, r *http.Request) {
filterFuncs = append(filterFuncs, runningOnly) filterFuncs = append(filterFuncs, runningOnly)
} }
containers, err := runtime.GetContainers(filterFuncs...) containers, err := runtime.GetContainers(false, filterFuncs...)
if err != nil { if err != nil {
utils.InternalServerError(w, err) utils.InternalServerError(w, err)
return return

View file

@ -64,7 +64,7 @@ func getContainers(runtime *libpod.Runtime, options getContainersOptions) ([]con
} }
filterFuncs = append(filterFuncs, generatedFunc) filterFuncs = append(filterFuncs, generatedFunc)
} }
ctrs, err := runtime.GetContainers(filterFuncs...) ctrs, err := runtime.GetContainers(false, filterFuncs...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -665,7 +665,7 @@ func (ic *ContainerEngine) ContainerRestore(ctx context.Context, namesOrIds []st
case options.Import != "": case options.Import != "":
ctrs, err = checkpoint.CRImportCheckpointTar(ctx, ic.Libpod, options) ctrs, err = checkpoint.CRImportCheckpointTar(ctx, ic.Libpod, options)
case options.All: case options.All:
ctrs, err = ic.Libpod.GetContainers(filterFuncs...) ctrs, err = ic.Libpod.GetContainers(false, filterFuncs...)
case options.Latest: case options.Latest:
containers, err := getContainers(ic.Libpod, getContainersOptions{latest: options.Latest, names: namesOrIds}) containers, err := getContainers(ic.Libpod, getContainersOptions{latest: options.Latest, names: namesOrIds})
if err != nil { if err != nil {

View file

@ -51,7 +51,14 @@ func GetContainerLists(runtime *libpod.Runtime, options entities.ContainerListOp
filterFuncs = append(filterFuncs, runningOnly) filterFuncs = append(filterFuncs, runningOnly)
} }
cons, err := runtime.GetContainers(filterFuncs...) // Load the containers with their states populated. This speeds things
// up considerably as we use a signel DB connection to load the
// containers' states instead of one per container.
//
// This may return slightly outdated states but that's acceptable for
// listing containers; any state is outdated the point a container lock
// gets released.
cons, err := runtime.GetContainers(true, filterFuncs...)
if err != nil { if err != nil {
return nil, err return nil, err
} }