csi-driver-smb icon indicating copy to clipboard operation
csi-driver-smb copied to clipboard

fix: Remove excessive recursive variable expansions

Open mpatlasov opened this issue 9 months ago • 7 comments

Modern GNU make (version >= 4.4) has backward-incompatible feature:

  • WARNING: Backward-incompatibility! Previously makefile variables marked as export were not exported to commands started by the $(shell ...) function. Now, all exported variables are exported to $(shell ...). If this leads to recursion during expansion, then for backward-compatibility the value from the original environment is used.

This makes any invocation of make command very costly. Compare the performance of make 4.3 vs. 4.4:

$ time ~/Sources/make-4.3/make smb ARCH=$(go env GOARCH)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags "-X github.com/kubernetes-csi/csi-driver-smb/pkg/smb.driverVersion=v1.15.0 -X github.com/kubernetes-csi/csi-driver-smb/pkg/smb.gitCommit=f5ced814f628ddee2c9f3e6af505c5a6123e50f4 -X github.com/kubernetes-csi/csi-driver-smb/pkg/smb.buildDate=2024-05-15T00:00:09Z -s -w -extldflags "-static"" -mod vendor -o _output/amd64/smbplugin ./cmd/smbplugin

real	0m38.504s
user	3m50.580s
sys	0m23.502s

$ time ~/Sources/make-4.4/make smb ARCH=$(go env GOARCH)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags "-X github.com/kubernetes-csi/csi-driver-smb/pkg/smb.driverVersion=v1.15.0 -X github.com/kubernetes-csi/csi-driver-smb/pkg/smb.gitCommit=f5ced814f628ddee2c9f3e6af505c5a6123e50f4 -X github.com/kubernetes-csi/csi-driver-smb/pkg/smb.buildDate=2024-05-15T00:04:04Z -s -w -extldflags "-static"" -mod vendor -o _output/amd64/smbplugin ./cmd/smbplugin

real	16m59.851s
user	13m16.490s
sys	13m46.418s

The same variables are evaluated again and again millions times:

$ rpm -qf /usr/bin/make
make-4.4.1-6.fc40.x86_64

$ /usr/bin/make -d smb ARCH=$(go env GOARCH) 2>&1 |grep "not recursively expanding.*to export to shell function" |wc -l
2171342

The patch doesn't change user-visible behavior of Makefile, but makes make command as performant as it used to be in case of make 4.3.

What type of PR is this?

/kind bug

What this PR does / why we need it:

Modern make (>= 4.4) builds csi driver extremely slowly.

Release note:

none

mpatlasov avatar May 15 '24 00:05 mpatlasov

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: mpatlasov Once this PR has been reviewed and has the lgtm label, please assign msau42 for approval. For more information see the Kubernetes Code Review Process.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment Approvers can cancel approval by writing /approve cancel in a comment

k8s-ci-robot avatar May 15 '24 00:05 k8s-ci-robot

Hi @mpatlasov. Thanks for your PR.

I'm waiting for a kubernetes-csi member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

k8s-ci-robot avatar May 15 '24 00:05 k8s-ci-robot

/ok-to-test

andyzhangx avatar May 15 '24 05:05 andyzhangx

Pull Request Test Coverage Report for Build 9088044825

Details

  • 0 of 0 changed or added relevant lines in 0 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage remained the same at 79.093%

Totals Coverage Status
Change from base Build 9074623042: 0.0%
Covered Lines: 942
Relevant Lines: 1191

💛 - Coveralls

coveralls avatar May 15 '24 05:05 coveralls

/retest-required

mpatlasov avatar May 15 '24 20:05 mpatlasov

/retest-required

mpatlasov avatar May 17 '24 21:05 mpatlasov

/retest-required

mpatlasov avatar May 20 '24 14:05 mpatlasov

/retest-required

mpatlasov avatar May 22 '24 00:05 mpatlasov

@mpatlasov: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
pull-csi-driver-smb-e2e-capz 25daed399f01a657c1c4f7c6d0bbffb9a125f565 link false /test pull-csi-driver-smb-e2e-capz
pull-csi-driver-smb-sanity 25daed399f01a657c1c4f7c6d0bbffb9a125f565 link true /test pull-csi-driver-smb-sanity
pull-csi-driver-smb-external-e2e 25daed399f01a657c1c4f7c6d0bbffb9a125f565 link true /test pull-csi-driver-smb-external-e2e
pull-csi-driver-smb-e2e-windows-containerd 25daed399f01a657c1c4f7c6d0bbffb9a125f565 link true /test pull-csi-driver-smb-e2e-windows-containerd
pull-csi-driver-smb-e2e 25daed399f01a657c1c4f7c6d0bbffb9a125f565 link true /test pull-csi-driver-smb-e2e

Full PR test history. Your PR dashboard. Please help us cut down on flakes by linking to an open issue when you hit one in your PR.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

k8s-ci-robot avatar May 22 '24 01:05 k8s-ci-robot