Skip to content

Commit

Permalink
Apply the fix from PR hashicorp#3195 to 0.6.3
Browse files Browse the repository at this point in the history
  • Loading branch information
hsmade committed Oct 12, 2017
1 parent ac9d8f5 commit dade708
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 16 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 0.6.4 (October 12, 2017)

BUG FIXES:
* client: Fix lock contention that could cause a node to miss a heartbeat and
be marked as down [GH-3195]

## 0.6.3 (September 11, 2017)

BUG FIXES:
Expand Down
34 changes: 20 additions & 14 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulServic
// Start collecting stats
go c.emitStats()

c.logger.Printf("[INFO] client: Node ID %q", c.Node().ID)
c.logger.Printf("[INFO] client: Node ID %q", c.NodeID())
return c, nil
}

Expand Down Expand Up @@ -357,17 +357,24 @@ func (c *Client) Leave() error {

// Datacenter returns the datacenter for the given client
func (c *Client) Datacenter() string {
c.configLock.RLock()
dc := c.configCopy.Node.Datacenter
c.configLock.RUnlock()
return dc
return c.configCopy.Node.Datacenter
}

// Region returns the region for the given client
func (c *Client) Region() string {
return c.config.Region
}

// NodeID returns the node ID for the given client
func (c *Client) NodeID() string {
return c.config.Node.ID
}

// secretNodeID returns the secret node ID for the given client
func (c *Client) secretNodeID() string {
return c.config.Node.SecretID
}

// RPCMajorVersion returns the structs.ApiMajorVersion supported by the
// client.
func (c *Client) RPCMajorVersion() int {
Expand Down Expand Up @@ -455,7 +462,7 @@ func (c *Client) Stats() map[string]map[string]string {
defer c.heartbeatLock.Unlock()
stats := map[string]map[string]string{
"client": map[string]string{
"node_id": c.Node().ID,
"node_id": c.NodeID(),
"known_servers": c.servers.all().String(),
"num_allocations": strconv.Itoa(c.NumAllocs()),
"last_heartbeat": fmt.Sprintf("%v", time.Since(c.lastHeartbeat)),
Expand Down Expand Up @@ -1214,7 +1221,7 @@ func (c *Client) updateAllocStatus(alloc *structs.Allocation) {
// send the fields that are updatable by the client.
stripped := new(structs.Allocation)
stripped.ID = alloc.ID
stripped.NodeID = c.Node().ID
stripped.NodeID = c.NodeID()
stripped.TaskStates = alloc.TaskStates
stripped.ClientStatus = alloc.ClientStatus
stripped.ClientDescription = alloc.ClientDescription
Expand Down Expand Up @@ -1291,10 +1298,9 @@ func (c *Client) watchAllocations(updates chan *allocUpdates) {
// The request and response for getting the map of allocations that should
// be running on the Node to their AllocModifyIndex which is incremented
// when the allocation is updated by the servers.
n := c.Node()
req := structs.NodeSpecificRequest{
NodeID: n.ID,
SecretID: n.SecretID,
NodeID: c.NodeID(),
SecretID: c.secretNodeID(),
QueryOptions: structs.QueryOptions{
Region: c.Region(),
AllowStale: true,
Expand Down Expand Up @@ -1652,8 +1658,8 @@ func (c *Client) deriveToken(alloc *structs.Allocation, taskNames []string, vcli
// DeriveVaultToken of nomad server can take in a set of tasks and
// creates tokens for all the tasks.
req := &structs.DeriveVaultTokenRequest{
NodeID: c.Node().ID,
SecretID: c.Node().SecretID,
NodeID: c.NodeID(),
SecretID: c.secretNodeID(),
AllocID: alloc.ID,
Tasks: verifiedTasks,
QueryOptions: structs.QueryOptions{
Expand Down Expand Up @@ -1863,7 +1869,7 @@ func (c *Client) emitStats() {

// emitHostStats pushes host resource usage stats to remote metrics collection sinks
func (c *Client) emitHostStats(hStats *stats.HostStats) {
nodeID := c.Node().ID
nodeID := c.NodeID()
metrics.SetGauge([]string{"client", "host", "memory", nodeID, "total"}, float32(hStats.Memory.Total))
metrics.SetGauge([]string{"client", "host", "memory", nodeID, "available"}, float32(hStats.Memory.Available))
metrics.SetGauge([]string{"client", "host", "memory", nodeID, "used"}, float32(hStats.Memory.Used))
Expand Down Expand Up @@ -1930,7 +1936,7 @@ func (c *Client) emitHostStats(hStats *stats.HostStats) {

// emitClientMetrics emits lower volume client metrics
func (c *Client) emitClientMetrics() {
nodeID := c.Node().ID
nodeID := c.NodeID()

// Emit allocation metrics
blocked, migrating, pending, running, terminal := 0, 0, 0, 0, 0
Expand Down
4 changes: 2 additions & 2 deletions client/stats/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ func NewHostStatsCollector(logger *log.Logger, allocDir string) *HostStatsCollec

// Collect collects stats related to resource usage of a host
func (h *HostStatsCollector) Collect() error {
h.hostStatsLock.Lock()
defer h.hostStatsLock.Unlock()
hs := &HostStats{Timestamp: time.Now().UTC().UnixNano()}

// Determine up-time
Expand Down Expand Up @@ -131,9 +133,7 @@ func (h *HostStatsCollector) Collect() error {
hs.AllocDirStats = h.toDiskStats(usage, nil)

// Update the collected status object.
h.hostStatsLock.Lock()
h.hostStats = hs
h.hostStatsLock.Unlock()

return nil
}
Expand Down

0 comments on commit dade708

Please sign in to comment.