github.com/AbhinandanKurakure/podman/v3@v3.4.10/libpod/runtime_renumber.go (about)

     1  package libpod
     2  
     3  import (
     4  	"github.com/containers/podman/v3/libpod/events"
     5  	"github.com/pkg/errors"
     6  )
     7  
     8  // renumberLocks reassigns lock numbers for all containers and pods in the
     9  // state.
    10  // TODO: It would be desirable to make it impossible to call this until all
    11  // other libpod sessions are dead.
    12  // Possibly use a read-write file lock, with all non-renumber podmans owning the
    13  // lock as read, renumber attempting to take a write lock?
    14  // The alternative is some sort of session tracking, and I don't know how
    15  // reliable that can be.
    16  func (r *Runtime) renumberLocks() error {
    17  	// Start off by deallocating all locks
    18  	if err := r.lockManager.FreeAllLocks(); err != nil {
    19  		return err
    20  	}
    21  
    22  	allCtrs, err := r.state.AllContainers()
    23  	if err != nil {
    24  		return err
    25  	}
    26  	for _, ctr := range allCtrs {
    27  		lock, err := r.lockManager.AllocateLock()
    28  		if err != nil {
    29  			return errors.Wrapf(err, "error allocating lock for container %s", ctr.ID())
    30  		}
    31  
    32  		ctr.config.LockID = lock.ID()
    33  
    34  		// Write the new lock ID
    35  		if err := r.state.RewriteContainerConfig(ctr, ctr.config); err != nil {
    36  			return err
    37  		}
    38  	}
    39  	allPods, err := r.state.AllPods()
    40  	if err != nil {
    41  		return err
    42  	}
    43  	for _, pod := range allPods {
    44  		lock, err := r.lockManager.AllocateLock()
    45  		if err != nil {
    46  			return errors.Wrapf(err, "error allocating lock for pod %s", pod.ID())
    47  		}
    48  
    49  		pod.config.LockID = lock.ID()
    50  
    51  		// Write the new lock ID
    52  		if err := r.state.RewritePodConfig(pod, pod.config); err != nil {
    53  			return err
    54  		}
    55  	}
    56  	allVols, err := r.state.AllVolumes()
    57  	if err != nil {
    58  		return err
    59  	}
    60  	for _, vol := range allVols {
    61  		lock, err := r.lockManager.AllocateLock()
    62  		if err != nil {
    63  			return errors.Wrapf(err, "error allocating lock for volume %s", vol.Name())
    64  		}
    65  
    66  		vol.config.LockID = lock.ID()
    67  
    68  		// Write the new lock ID
    69  		if err := r.state.RewriteVolumeConfig(vol, vol.config); err != nil {
    70  			return err
    71  		}
    72  	}
    73  
    74  	r.newSystemEvent(events.Renumber)
    75  
    76  	return nil
    77  }