perf: optimize memory usage by avoiding string-to-byte conversions#135
Conversation
- Replace []byte(string) conversions with unsafe.Slice(unsafe.StringData()) to avoid memory copies - Remove debug logging that was converting []byte to string (memory copy) - Add configurable MAX_OBJECT_SIZE env var to prevent sending oversized objects - Update Go version from 1.24.1 to 1.25.6 Signed-off-by: Amir Malka <amirm@armosec.io>
07aef7b to
b368e6d
Compare
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. 📝 WalkthroughWalkthroughAdds an environment-based MAX_OBJECT_SIZE guard and Client field; replaces string-to-[]byte casts with unsafe.Slice across adapters and core; reduces logging of payload contents; renames a NewClient parameter; and bumps the Go toolchain and build image and CI setup to 1.25.6. Changes
Sequence Diagram(s)sequenceDiagram
participant Env as Environment
participant Client as Backend Client
participant Producer as MessageProducer
participant Logger as Logger
Env->>Client: getMaxObjectSizeBytes() (on NewClient)
Client->>Client: store maxObjectSizeBytes
Client->>Client: prepare PutObject payload (unsafe.Slice)
Client->>Client: if payload.size > maxObjectSizeBytes?
alt oversized
Client->>Logger: log error ("skipping oversized object")
Client--x Producer: do not send
else within limit
Client->>Producer: send PutObject message
Producer->>Logger: log send context (no raw payload)
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@adapters/backend/v1/client.go`:
- Around line 41-47: In getMaxObjectSizeBytes(), fix the env var validation and
log wording: when reading MaxObjectSizeEnvVar (env name "MAX_OBJECT_SIZE") keep
the existing strconv.Atoi parse but change the logger.L().Error message to
reference "MAX_OBJECT_SIZE" and include the raw value and error; treat any
parsed intVal <= 0 as invalid (log a warning/error mentioning the non-positive
value and ignore it) and do not return a pointer for invalid values—only return
&intVal for positive integers; otherwise return nil as before.
🧹 Nitpick comments (2)
core/synchronizer.go (2)
251-252: Avoid logging the full payload on unmarshal errors.
Stringifyingdataforces a large copy and risks leaking sensitive payloads. Prefer logging size (or a truncated prefix).♻️ Suggested tweak
- logger.L().Ctx(ctx).Error("cannot unmarshal message", helpers.Error(err), helpers.String("target", "domain.Generic"), - helpers.String("data", string(data))) + logger.L().Ctx(ctx).Error("cannot unmarshal message", helpers.Error(err), helpers.String("target", "domain.Generic"), + helpers.Int("data_size", len(data)))
417-419: Remove the no‑opif !s.isClient {}block.
It currently does nothing and reads like a missing guard; remove it or document the intended behavior.
Signed-off-by: Amir Malka <amirm@armosec.io>
There was a problem hiding this comment.
Pull request overview
This PR aims to optimize memory usage by eliminating memory copies during string-to-byte conversions using unsafe operations. However, the PR contains several critical issues that must be addressed before merging.
Changes:
- Replace string-to-byte conversions with
unsafe.Slice(unsafe.StringData())across multiple adapter implementations - Add configurable
MAX_OBJECT_SIZEenvironment variable to limit object sizes sent to the server - Update Go version from 1.24.1 to 1.25.6 in go.mod files and Dockerfile
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| go.mod | Updates Go version to 1.25.6 |
| tests/go.mod | Updates Go version to 1.25.6 |
| build/Dockerfile | Updates Docker base image to golang:1.25.6-trixie |
| core/synchronizer.go | Adds unsafe import and converts string-to-byte conversions using unsafe operations for GetObject and PutObject events; includes an empty if block |
| adapters/incluster/v1/client.go | Converts string-to-byte conversions using unsafe operations in batch processing for GetObject, PatchObject, and PutObject |
| adapters/backend/v1/client.go | Adds MAX_OBJECT_SIZE configuration, converts string-to-byte conversions using unsafe operations, removes verbose debug logging |
Comments suppressed due to low confidence (2)
core/synchronizer.go:438
- Using unsafe.Slice(unsafe.StringData()) to convert strings to byte slices is dangerous because it creates a mutable byte slice that points to immutable string data. If the returned byte slice is ever modified (directly or by any function it's passed to), it will cause undefined behavior and potential memory corruption since strings in Go are immutable. While the current code paths appear to only read these slices, this creates a fragile assumption that could easily be violated by future changes. Consider documenting this assumption clearly or using a safer approach that still avoids the copy if performance is critical (e.g., using reflect.StringHeader with proper documentation about the immutability requirement).
helpers.String("cluster", clientId.Cluster),
core/synchronizer.go:419
- This empty if block appears to be incomplete or accidentally committed. Either remove it entirely or add the intended logic. Empty conditional blocks reduce code maintainability and can confuse other developers.
var msg domain.PutObject
err = json.Unmarshal(data, &msg)
if err != nil {
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Signed-off-by: Amir Malka <amirm@armosec.io>
matthyx
left a comment
There was a problem hiding this comment.
incredible the number of places we have this...
Signed-off-by: Amir Malka <amirm@armosec.io>
Signed-off-by: Amir Malka <amirm@armosec.io>
matthyx
left a comment
There was a problem hiding this comment.
why you want to fix it?
|
Summary:
|
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [kubescape-operator](https://kubescape.io/) ([source](https://redirect.github.com/kubescape/helm-charts)) | patch | `1.30.2` → `1.30.3` | --- ### Release Notes <details> <summary>kubescape/helm-charts (kubescape-operator)</summary> ### [`v1.30.3`](https://redirect.github.com/kubescape/helm-charts/releases/tag/kubescape-operator-1.30.3) [Compare Source](https://redirect.github.com/kubescape/helm-charts/compare/kubescape-operator-1.30.2...kubescape-operator-1.30.3) Kubescape is an E2E Kubernetes cluster security platform #### What's Changed - chore: adding the ability to adjust the source of busybox by [@​drew-viles](https://redirect.github.com/drew-viles) in [#​784](https://redirect.github.com/kubescape/helm-charts/pull/784) - add k8s context tag by [@​YakirOren](https://redirect.github.com/YakirOren) in [#​785](https://redirect.github.com/kubescape/helm-charts/pull/785) - run system tests from private repo by [@​bvolovat](https://redirect.github.com/bvolovat) in [#​786](https://redirect.github.com/kubescape/helm-charts/pull/786) - add stream logs and wait for tests finish by [@​bvolovat](https://redirect.github.com/bvolovat) in [#​787](https://redirect.github.com/kubescape/helm-charts/pull/787) - fix attempt by [@​bvolovat](https://redirect.github.com/bvolovat) in [#​788](https://redirect.github.com/kubescape/helm-charts/pull/788) - Update 02-e2e-test.yaml by [@​armobot](https://redirect.github.com/armobot) in [#​789](https://redirect.github.com/kubescape/helm-charts/pull/789) - Run test from private repo by [@​bvolovat](https://redirect.github.com/bvolovat) in [#​791](https://redirect.github.com/kubescape/helm-charts/pull/791) - add workflow\_call by [@​bvolovat](https://redirect.github.com/bvolovat) in [#​792](https://redirect.github.com/kubescape/helm-charts/pull/792) - add startup probe by [@​YakirOren](https://redirect.github.com/YakirOren) in [#​793](https://redirect.github.com/kubescape/helm-charts/pull/793) - <kubescape/kubescape@v3.0.47...v3.0.48> - Fix typos in documentation by [@​oglok](https://redirect.github.com/oglok) in [kubescape/kubescape#1913](https://redirect.github.com/kubescape/kubescape/pull/1913) - fix: Kustomize directory analysis not working by [@​majiayu000](https://redirect.github.com/majiayu000) in [kubescape/kubescape#1914](https://redirect.github.com/kubescape/kubescape/pull/1914) - feat: Define labels to copy from workloads to reports by [@​majiayu000](https://redirect.github.com/majiayu000) in [kubescape/kubescape#1915](https://redirect.github.com/kubescape/kubescape/pull/1915) - Add SkipPersistence flag to MetricsQueryParams in metrics endpoint by [@​BroderPeters](https://redirect.github.com/BroderPeters) in [kubescape/kubescape#1917](https://redirect.github.com/kubescape/kubescape/pull/1917) - ci: update scorecard action version by [@​AndrewCharlesHay](https://redirect.github.com/AndrewCharlesHay) in [kubescape/kubescape#1918](https://redirect.github.com/kubescape/kubescape/pull/1918) - update test lists by [@​amirmalka](https://redirect.github.com/amirmalka) in [kubescape/kubescape#1919](https://redirect.github.com/kubescape/kubescape/pull/1919) - build(deps): Bump github.com/sigstore/cosign/v3 from 3.0.3-0.20251208232815-901b44d65952 to 3.0.4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [kubescape/kubescape#1920](https://redirect.github.com/kubescape/kubescape/pull/1920) - Update build number retrieval and permissions in workflow by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/kubescape#1921](https://redirect.github.com/kubescape/kubescape/pull/1921) - Fix workload scan to include allcontrols framework by [@​Copilot](https://redirect.github.com/Copilot) in [kubescape/kubescape#1922](https://redirect.github.com/kubescape/kubescape/pull/1922) - build(deps): Bump github.com/sigstore/fulcio from 1.8.4 to 1.8.5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [kubescape/kubescape#1923](https://redirect.github.com/kubescape/kubescape/pull/1923) - Fix panic on unsafe interface{} to string type assertions by [@​Copilot](https://redirect.github.com/Copilot) in [kubescape/kubescape#1926](https://redirect.github.com/kubescape/kubescape/pull/1926) - build(deps): Bump github.com/theupdateframework/go-tuf/v2 from 2.3.0 to 2.3.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [kubescape/kubescape#1927](https://redirect.github.com/kubescape/kubescape/pull/1927) - build(deps): Bump github.com/sigstore/rekor from 1.4.3 to 1.5.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [kubescape/kubescape#1928](https://redirect.github.com/kubescape/kubescape/pull/1928) - <kubescape/operator@v0.2.121...v0.2.126> - bump version by [@​jnathangreeg](https://redirect.github.com/jnathangreeg) in [kubescape/operator#349](https://redirect.github.com/kubescape/operator/pull/349) - Fix comment typo in checkECRRegistry function to clarify \_catalog end… by [@​jnathangreeg](https://redirect.github.com/jnathangreeg) in [kubescape/operator#351](https://redirect.github.com/kubescape/operator/pull/351) - add permissions by [@​bvolovat](https://redirect.github.com/bvolovat) in [kubescape/operator#352](https://redirect.github.com/kubescape/operator/pull/352) - bump github.com/armosec/armoapi-go v0.0.673 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/operator#353](https://redirect.github.com/kubescape/operator/pull/353) - bump github.com/kubescape/go-logger v0.0.26 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/operator#354](https://redirect.github.com/kubescape/operator/pull/354) - bump github.com/goradd/maps v1.3.0 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/operator#355](https://redirect.github.com/kubescape/operator/pull/355) - <kubescape/kubevuln@v0.3.98...v0.3.104> - replace debian 12 with debian 13 when building container images by [@​pfarikrispy](https://redirect.github.com/pfarikrispy) in [kubescape/kubevuln#317](https://redirect.github.com/kubescape/kubevuln/pull/317) - Add comprehensive documentation and governance by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/kubevuln#318](https://redirect.github.com/kubescape/kubevuln/pull/318) - Bump github.com/cilium/cilium from 1.16.9 to 1.16.17 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [kubescape/kubevuln#319](https://redirect.github.com/kubescape/kubevuln/pull/319) - Add timeout to Grype DB update with graceful fallback to prevent indefinite readiness probe failures by [@​Copilot](https://redirect.github.com/Copilot) in [kubescape/kubevuln#320](https://redirect.github.com/kubescape/kubevuln/pull/320) - Prevent DB update cancellation on readiness probe by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/kubevuln#321](https://redirect.github.com/kubescape/kubevuln/pull/321) - <kubescape/storage@v0.0.237...v0.0.239> - feat: handle large object storage by clearing spec and updating annotations by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/storage#279](https://redirect.github.com/kubescape/storage/pull/279) - bump k8s version to v0.35.0 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/storage#280](https://redirect.github.com/kubescape/storage/pull/280) - <kubescape/node-agent@v0.3.11...v0.3.36> - feat: propagate IsTriggerAlert field from rules to runtime alerts by [@​slashben](https://redirect.github.com/slashben) in [kubescape/node-agent#686](https://redirect.github.com/kubescape/node-agent/pull/686) - Generating release by [@​slashben](https://redirect.github.com/slashben) in [kubescape/node-agent#688](https://redirect.github.com/kubescape/node-agent/pull/688) - Feature/rule engine redesign by [@​YakirOren](https://redirect.github.com/YakirOren) in [kubescape/node-agent#685](https://redirect.github.com/kubescape/node-agent/pull/685) - refactor: update cloud metadata types to use armotypes package by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#689](https://redirect.github.com/kubescape/node-agent/pull/689) - Replace host sensor with node agent sensing by [@​Bezbran](https://redirect.github.com/Bezbran) in [kubescape/node-agent#681](https://redirect.github.com/kubescape/node-agent/pull/681) - use k8s-interface by [@​Bezbran](https://redirect.github.com/Bezbran) in [kubescape/node-agent#691](https://redirect.github.com/kubescape/node-agent/pull/691) - optimize header parsing and add early return in ruleAppliesToContext by [@​YakirOren](https://redirect.github.com/YakirOren) in [kubescape/node-agent#692](https://redirect.github.com/kubescape/node-agent/pull/692) - improve field accessor retrieval with nil checks and type assertions by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#694](https://redirect.github.com/kubescape/node-agent/pull/694) - Bump github.com/sigstore/sigstore from 1.9.5 to 1.10.4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [kubescape/node-agent#696](https://redirect.github.com/kubescape/node-agent/pull/696) - Add Azure ResourceGroup enrichment to CloudMetadata by [@​slashben](https://redirect.github.com/slashben) in [kubescape/node-agent#697](https://redirect.github.com/kubescape/node-agent/pull/697) - Add unit tests for Azure ResourceGroup parsing by [@​slashben](https://redirect.github.com/slashben) in [kubescape/node-agent#698](https://redirect.github.com/kubescape/node-agent/pull/698) - remove toMap function by [@​YakirOren](https://redirect.github.com/YakirOren) in [kubescape/node-agent#693](https://redirect.github.com/kubescape/node-agent/pull/693) - run system test from private repo by [@​bvolovat](https://redirect.github.com/bvolovat) in [kubescape/node-agent#700](https://redirect.github.com/kubescape/node-agent/pull/700) - bump: update golang-set dependency to v2.8.0 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#701](https://redirect.github.com/kubescape/node-agent/pull/701) - bump: update armoapi-go dependency to v0.0.671 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#702](https://redirect.github.com/kubescape/node-agent/pull/702) - update the tests\_groups by [@​bvolovat](https://redirect.github.com/bvolovat) in [kubescape/node-agent#703](https://redirect.github.com/kubescape/node-agent/pull/703) - bump: update dependencies for backend, storage, and OpenAPI packages by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#704](https://redirect.github.com/kubescape/node-agent/pull/704) - update chart repo by [@​bvolovat](https://redirect.github.com/bvolovat) in [kubescape/node-agent#705](https://redirect.github.com/kubescape/node-agent/pull/705) - bump: update cel-go dependency to v0.26.1 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#706](https://redirect.github.com/kubescape/node-agent/pull/706) - Implement ClusterUID enrichment for runtime alerts by [@​slashben](https://redirect.github.com/slashben) in [kubescape/node-agent#708](https://redirect.github.com/kubescape/node-agent/pull/708) - fix a bug where failed expressions would recompile on every event by [@​YakirOren](https://redirect.github.com/YakirOren) in [kubescape/node-agent#690](https://redirect.github.com/kubescape/node-agent/pull/690) - fix container watcher error propagation by [@​YakirOren](https://redirect.github.com/YakirOren) in [kubescape/node-agent#709](https://redirect.github.com/kubescape/node-agent/pull/709) - add permissions by [@​bvolovat](https://redirect.github.com/bvolovat) in [kubescape/node-agent#710](https://redirect.github.com/kubescape/node-agent/pull/710) - upgrade to IG v0.48.1 by [@​matthyx](https://redirect.github.com/matthyx) in [kubescape/node-agent#695](https://redirect.github.com/kubescape/node-agent/pull/695) - <kubescape/synchronizer@v0.0.127...v0.0.128> - perf: optimize memory usage by avoiding string-to-byte conversions by [@​amirmalka](https://redirect.github.com/amirmalka) in [kubescape/synchronizer#135](https://redirect.github.com/kubescape/synchronizer/pull/135) #### New Contributors - [@​drew-viles](https://redirect.github.com/drew-viles) made their first contribution in [#​784](https://redirect.github.com/kubescape/helm-charts/pull/784) - [@​YakirOren](https://redirect.github.com/YakirOren) made their first contribution in [#​785](https://redirect.github.com/kubescape/helm-charts/pull/785) - [@​armobot](https://redirect.github.com/armobot) made their first contribution in [#​789](https://redirect.github.com/kubescape/helm-charts/pull/789) - [@​pfarikrispy](https://redirect.github.com/pfarikrispy) made their first contribution in [kubescape/kubevuln#317](https://redirect.github.com/kubescape/kubevuln/pull/317) - [@​bvolovat](https://redirect.github.com/bvolovat) made their first contribution in [kubescape/operator#352](https://redirect.github.com/kubescape/operator/pull/352) - [@​oglok](https://redirect.github.com/oglok) made their first contribution in [kubescape/kubescape#1913](https://redirect.github.com/kubescape/kubescape/pull/1913) - [@​majiayu000](https://redirect.github.com/majiayu000) made their first contribution in [kubescape/kubescape#1914](https://redirect.github.com/kubescape/kubescape/pull/1914) - [@​BroderPeters](https://redirect.github.com/BroderPeters) made their first contribution in [kubescape/kubescape#1917](https://redirect.github.com/kubescape/kubescape/pull/1917) - [@​AndrewCharlesHay](https://redirect.github.com/AndrewCharlesHay) made their first contribution in [kubescape/kubescape#1918](https://redirect.github.com/kubescape/kubescape/pull/1918) - [@​Bezbran](https://redirect.github.com/Bezbran) made their first contribution in [kubescape/node-agent#681](https://redirect.github.com/kubescape/node-agent/pull/681) - [@​bvolovat](https://redirect.github.com/bvolovat) made their first contribution in [kubescape/node-agent#700](https://redirect.github.com/kubescape/node-agent/pull/700) **Full Changelog**: <kubescape/helm-charts@kubescape-operator-1.30.2...kubescape-operator-1.30.3> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/Darkflame72/home-ops). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUvaGVsbSIsInR5cGUvcGF0Y2giXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Overview
This PR optimizes memory usage by avoiding unnecessary memory copies when converting between strings and byte slices.
Changes
Memory Impact
For large objects (e.g., 100MB), this change eliminates the temporary doubling of memory that occurred during string-to-byte conversions, reducing peak memory usage significantly.
Summary by CodeRabbit
New Features
Improvements
Chores
✏️ Tip: You can customize this high-level summary in your review settings.