Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix memory fingerprinting on 32bit #6239

Merged
merged 4 commits into from
Sep 4, 2019
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
15 changes: 8 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,33 @@ 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

endocrimes marked this conversation as resolved.
Show resolved Hide resolved
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)
}