mirror of
https://github.com/kemko/nomad.git
synced 2026-01-05 18:05:42 +03:00
The allocrunner has a facility for passing data written by allocrunner hooks to taskrunner hooks. Currently the only consumers of this facility are the allocrunner CSI hook (which writes data) and the taskrunner volume hook (which reads that same data). The allocrunner hook for CSI volumes doesn't set the alloc hook resources atomically. Instead, it gets the current resources and then writes a new version back. Because the CSI hook is currently the only writer and all readers happen long afterwards, this should be safe but #16623 shows there's some sequence of events during restore where this breaks down. Refactor hook resources so that hook data is accessed via setters and getters that hold the mutex.
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
package structs
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/hashicorp/nomad/client/pluginmanager/csimanager"
|
|
"github.com/hashicorp/nomad/helper"
|
|
)
|
|
|
|
// AllocHookResources contains data that is provided by AllocRunner Hooks for
|
|
// consumption by TaskRunners. This should be instantiated once in the
|
|
// AllocRunner and then only accessed via getters and setters that hold the
|
|
// lock.
|
|
type AllocHookResources struct {
|
|
csiMounts map[string]*csimanager.MountInfo
|
|
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
func NewAllocHookResources() *AllocHookResources {
|
|
return &AllocHookResources{
|
|
csiMounts: map[string]*csimanager.MountInfo{},
|
|
}
|
|
}
|
|
|
|
// GetCSIMounts returns a copy of the CSI mount info previously written by the
|
|
// CSI allocrunner hook
|
|
func (a *AllocHookResources) GetCSIMounts() map[string]*csimanager.MountInfo {
|
|
a.mu.RLock()
|
|
defer a.mu.RUnlock()
|
|
|
|
return helper.DeepCopyMap(a.csiMounts)
|
|
}
|
|
|
|
// SetCSIMounts stores the CSI mount info for later use by the volume taskrunner
|
|
// hook
|
|
func (a *AllocHookResources) SetCSIMounts(m map[string]*csimanager.MountInfo) {
|
|
a.mu.Lock()
|
|
defer a.mu.Unlock()
|
|
|
|
a.csiMounts = m
|
|
}
|