podman

Форк
0
/
runtime_renumber.go 
96 строк · 2.4 Кб
1
//go:build !remote
2

3
package libpod
4

5
import (
6
	"fmt"
7

8
	"github.com/containers/podman/v5/libpod/define"
9
	"github.com/containers/podman/v5/libpod/events"
10
)
11

12
// RenumberLocks reassigns lock numbers for all containers and pods in the
13
// state. This should NOT be run while there are other Libpod
14
func (r *Runtime) RenumberLocks() error {
15
	// TODO: It would be desirable to make it impossible to call this until all
16
	// other libpod sessions are dead.
17
	// Possibly use a read-write file lock, with all non-renumber podmans owning the
18
	// lock as read, renumber attempting to take a write lock?
19
	// The alternative is some sort of session tracking, and I don't know how
20
	// reliable that can be.
21

22
	// Acquire the alive lock and hold it.
23
	// Ensures that we don't let other Podman commands run while we are
24
	// changing around lock numbers.
25
	aliveLock, err := r.getRuntimeAliveLock()
26
	if err != nil {
27
		return fmt.Errorf("retrieving alive lock: %w", err)
28
	}
29
	aliveLock.Lock()
30
	defer aliveLock.Unlock()
31

32
	if !r.valid {
33
		return define.ErrRuntimeStopped
34
	}
35

36
	// Start off by deallocating all locks
37
	if err := r.lockManager.FreeAllLocks(); err != nil {
38
		return err
39
	}
40

41
	allCtrs, err := r.state.AllContainers(false)
42
	if err != nil {
43
		return err
44
	}
45
	for _, ctr := range allCtrs {
46
		lock, err := r.lockManager.AllocateLock()
47
		if err != nil {
48
			return fmt.Errorf("allocating lock for container %s: %w", ctr.ID(), err)
49
		}
50

51
		ctr.config.LockID = lock.ID()
52

53
		// Write the new lock ID
54
		if err := r.state.RewriteContainerConfig(ctr, ctr.config); err != nil {
55
			return err
56
		}
57
	}
58
	allPods, err := r.state.AllPods()
59
	if err != nil {
60
		return err
61
	}
62
	for _, pod := range allPods {
63
		lock, err := r.lockManager.AllocateLock()
64
		if err != nil {
65
			return fmt.Errorf("allocating lock for pod %s: %w", pod.ID(), err)
66
		}
67

68
		pod.config.LockID = lock.ID()
69

70
		// Write the new lock ID
71
		if err := r.state.RewritePodConfig(pod, pod.config); err != nil {
72
			return err
73
		}
74
	}
75
	allVols, err := r.state.AllVolumes()
76
	if err != nil {
77
		return err
78
	}
79
	for _, vol := range allVols {
80
		lock, err := r.lockManager.AllocateLock()
81
		if err != nil {
82
			return fmt.Errorf("allocating lock for volume %s: %w", vol.Name(), err)
83
		}
84

85
		vol.config.LockID = lock.ID()
86

87
		// Write the new lock ID
88
		if err := r.state.RewriteVolumeConfig(vol, vol.config); err != nil {
89
			return err
90
		}
91
	}
92

93
	r.NewSystemEvent(events.Renumber)
94

95
	return r.Shutdown(false)
96
}
97

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.