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 }