client: Give a copy of clientconfig to allocrunner

Currently, there is a race condition between creating a taskrunner, and
updating node attributes via fingerprinting.

This is because the taskenv builder will try to iterate over the
clientconfig.Node.Attributes map, which can be concurrently updated by
the fingerprinting process, thus causing a panic.

This fixes that by providing a copy of the clientconfg to the
allocrunner inside the Read lock during config creation.
This commit is contained in:
Danielle Tomlinson 2018-12-12 16:20:19 +01:00
parent 84ded28c6d
commit 3823599da9
1 changed files with 2 additions and 2 deletions

View File

@ -867,7 +867,7 @@ func (c *Client) restoreState() error {
arConf := &allocrunner.Config{ arConf := &allocrunner.Config{
Alloc: alloc, Alloc: alloc,
Logger: c.logger, Logger: c.logger,
ClientConfig: c.config, ClientConfig: c.configCopy,
StateDB: c.stateDB, StateDB: c.stateDB,
StateUpdater: c, StateUpdater: c,
DeviceStatsReporter: c, DeviceStatsReporter: c,
@ -2059,7 +2059,7 @@ func (c *Client) addAlloc(alloc *structs.Allocation, migrateToken string) error
arConf := &allocrunner.Config{ arConf := &allocrunner.Config{
Alloc: alloc, Alloc: alloc,
Logger: c.logger, Logger: c.logger,
ClientConfig: c.config, ClientConfig: c.configCopy,
StateDB: c.stateDB, StateDB: c.stateDB,
Consul: c.consulService, Consul: c.consulService,
Vault: c.vaultClient, Vault: c.vaultClient,