Skip to content

Commit

Permalink
Merge pull request #6239 from hashicorp/b-32bitmem
Browse files Browse the repository at this point in the history
Fix memory fingerprinting on 32bit
  • Loading branch information
endocrimes committed Sep 4, 2019
2 parents dfb88cc + b56b9c6 commit e3ce4c7
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 24 deletions.
28 changes: 28 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ workflows:
name: "test-shared-exec"
test_packages: "./drivers/shared/executor"
<<: *IGNORE_FOR_UI_BRANCHES
- test-machine:
name: "test-32bit"
# Currently we only explicitly test fingerprinting on 32bit
# architectures.
test_packages: "./client/fingerprint"
goarch: "386"
<<: *IGNORE_FOR_UI_BRANCHES
- test-rkt:
<<: *IGNORE_FOR_UI_BRANCHES
- test-e2e:
Expand Down Expand Up @@ -118,11 +125,15 @@ jobs:
exclude_packages:
type: string
default: ""
goarch:
type: string
default: "amd64"
environment:
<<: *COMMON_ENVS
GOTEST_PKGS: "<< parameters.test_packages >>"
GOTEST_PKGS_EXCLUDE: "<< parameters.exclude_packages >>"
GOPATH: /go
GOTESTARCH: "<< parameters.goarch >>"
steps:
- checkout
- run: make deps
Expand Down Expand Up @@ -191,17 +202,30 @@ jobs:
executor:
type: string
default: "go-machine-recent"
goarch:
type: string
default: "amd64"
environment:
<<: *COMMON_ENVS
GOTEST_PKGS_EXCLUDE: "<< parameters.exclude_packages >>"
GOTEST_PKGS: "<< parameters.test_packages >>"
GOPATH: /home/circleci/go
GOTESTARCH: "<< parameters.goarch >>"
steps:
- checkout
- install-golang
- install-protoc
- install-consul
- install-vault
- run:
name: Install 32bit gcc libs
command: |
if [ ! -z $GOTESTARCH ] && [ $GOTESTARCH == "386" ]; then
sudo apt-get update
sudo apt-get install -y gcc-multilib
else
echo "Skipping 32bit lib installation while building for not 386"
fi
- run: PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make bootstrap
- run-tests
- store_test_results:
Expand Down Expand Up @@ -330,6 +354,10 @@ commands:
unset GOTEST_PKGS
fi
if [ ! -z $GOTESTARCH ]; then
export GOARCH="$GOTESTARCH";
fi
mkdir -p /tmp/test-reports
sudo -E PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make generate-structs
sudo -E PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make test-nomad
16 changes: 9 additions & 7 deletions client/fingerprint/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/shirou/gopsutil/mem"
)

const bytesInMB = 1024 * 1024
const bytesInMB int64 = 1024 * 1024

// MemoryFingerprint is used to fingerprint the available memory on the node
type MemoryFingerprint struct {
Expand All @@ -25,32 +25,34 @@ func NewMemoryFingerprint(logger log.Logger) Fingerprint {
}

func (f *MemoryFingerprint) Fingerprint(req *FingerprintRequest, resp *FingerprintResponse) error {
var totalMemory int
var totalMemory int64
cfg := req.Config
if cfg.MemoryMB != 0 {
totalMemory = cfg.MemoryMB * bytesInMB
totalMemory = int64(cfg.MemoryMB) * bytesInMB
} else {
memInfo, err := mem.VirtualMemory()
if err != nil {
f.logger.Warn("error reading memory information", "error", err)
return err
}
if memInfo.Total > 0 {
totalMemory = int(memInfo.Total)
totalMemory = int64(memInfo.Total)
}
}

if totalMemory > 0 {
resp.AddAttribute("memory.totalbytes", fmt.Sprintf("%d", totalMemory))

// COMPAT(0.10): Remove in 0.10
memoryMB := totalMemory / bytesInMB

// COMPAT(0.10): Unused since 0.9.
resp.Resources = &structs.Resources{
MemoryMB: totalMemory / bytesInMB,
MemoryMB: int(memoryMB),
}

resp.NodeResources = &structs.NodeResources{
Memory: structs.NodeMemoryResources{
MemoryMB: int64(totalMemory / bytesInMB),
MemoryMB: memoryMB,
},
}
}
Expand Down
26 changes: 9 additions & 17 deletions client/fingerprint/memory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (
)

func TestMemoryFingerprint(t *testing.T) {
require := require.New(t)

f := NewMemoryFingerprint(testlog.HCLogger(t))
node := &structs.Node{
Attributes: make(map[string]string),
Expand All @@ -19,24 +21,13 @@ func TestMemoryFingerprint(t *testing.T) {
request := &FingerprintRequest{Config: &config.Config{}, Node: node}
var response FingerprintResponse
err := f.Fingerprint(request, &response)
if err != nil {
t.Fatalf("err: %v", err)
}
require.NoError(err)

assertNodeAttributeContains(t, response.Attributes, "memory.totalbytes")

if response.Resources == nil {
t.Fatalf("response resources should not be nil")
}

// COMPAT(0.10): Remove in 0.10
if response.Resources.MemoryMB == 0 {
t.Fatalf("Expected node.Resources.MemoryMB to be non-zero")
}

if response.NodeResources.Memory.MemoryMB == 0 {
t.Fatalf("Expected node.Resources.MemoryMB to be non-zero")
}
require.NotNil(response.Resources, "expected response Resources to not be nil")
require.NotZero(response.Resources.MemoryMB, "expected memory to be non-zero")
require.NotNil(response.NodeResources, "expected response NodeResources to not be nil")
require.NotZero(response.NodeResources.Memory.MemoryMB, "expected memory to be non-zero")
}

func TestMemoryFingerprint_Override(t *testing.T) {
Expand All @@ -56,6 +47,7 @@ func TestMemoryFingerprint_Override(t *testing.T) {
assertNodeAttributeContains(t, response.Attributes, "memory.totalbytes")
require := require.New(t)
require.NotNil(response.Resources)
require.Equal(response.Resources.MemoryMB, memoryMB)
require.EqualValues(response.Resources.MemoryMB, memoryMB)
require.NotNil(response.NodeResources)
require.EqualValues(response.NodeResources.Memory.MemoryMB, memoryMB)
}

0 comments on commit e3ce4c7

Please sign in to comment.