mirror of
https://github.com/hanzoai/visor.git
synced 2026-09-24 17:04:14 +00:00
urpc encodes with encoding/json, which walks the payload on every call: a realistic control.ExecArgs costs 7084ns and 10 allocations to cross. ZAP reads a field at a constant offset out of the buffer that arrived, so the same payload is 740ns and one allocation -- but only if the offsets are stated, and a stated offset that is wrong is silent corruption rather than a compile error. So state them from the types themselves. //tools/zap reflects over the payloads at build time and writes the wire as Go source with the offsets as constants. It lives inside Bazel because pkg/sentry/control cannot be imported from outside it: the *_go_proto packages it depends on have no source in the tree. Six payloads had no layout to state. A map, an interface and a type from another module have no offsets, so each is answered in the type: SaveOpts.Metadata and StartContainerArgs.InitialCgroups/Limits cross as lists of pairs; boot.Route.Destination restates net.IPNet as Subnet; OpenMountArgs restates the OCI mount fields the call actually uses; StartArgs.Spec and SinkConfig.Config carry their documents as the bytes they arrived as; MetricsRegistrationResponse carries the protocol buffer the same way; and seccheck's session options become a type instead of a map of any. ExecArgs and MetricsExportData still have none: ExecArgs holds live kernel objects behind an interface, and MetricsExportData reaches a prometheus snapshot whose labels are a map. Co-authored-by: Hanzo Dev <[email protected]>
97 lines
2.3 KiB
Python
97 lines
2.3 KiB
Python
load("//tools:defs.bzl", "go_library", "go_test")
|
|
load("//tools/go_generics:defs.bzl", "go_template_instance")
|
|
|
|
package(
|
|
default_applicable_licenses = ["//:license"],
|
|
licenses = ["notice"],
|
|
)
|
|
|
|
go_template_instance(
|
|
name = "asyncfileclient_refs",
|
|
out = "asyncfileclient_refs.go",
|
|
package = "stateipc",
|
|
prefix = "asyncFileClient",
|
|
template = "//pkg/refs:refs_template",
|
|
types = {
|
|
"T": "AsyncFileClient",
|
|
},
|
|
)
|
|
|
|
go_template_instance(
|
|
name = "destinationfile_atomicptrmap",
|
|
out = "destinationfile_atomicptrmap_unsafe.go",
|
|
package = "stateipc",
|
|
prefix = "destinationFile",
|
|
template = "//pkg/sync/atomicptrmap:generic_atomicptrmap",
|
|
types = {
|
|
"Key": "uint32",
|
|
"Value": "destinationFile",
|
|
"Hasher": "clientFileHandleHasher",
|
|
},
|
|
)
|
|
|
|
go_template_instance(
|
|
name = "sourcefile_atomicptrmap",
|
|
out = "sourcefile_atomicptrmap_unsafe.go",
|
|
package = "stateipc",
|
|
prefix = "sourceFile",
|
|
template = "//pkg/sync/atomicptrmap:generic_atomicptrmap",
|
|
types = {
|
|
"Key": "uint32",
|
|
"Value": "sourceFile",
|
|
"Hasher": "clientFileHandleHasher",
|
|
},
|
|
)
|
|
|
|
go_library(
|
|
name = "stateipc",
|
|
srcs = [
|
|
"asyncfileclient_refs.go",
|
|
"client.go",
|
|
"common.go",
|
|
"common_unsafe.go",
|
|
"destinationfile_atomicptrmap_unsafe.go",
|
|
"server.go",
|
|
"sourcefile_atomicptrmap_unsafe.go",
|
|
"stateipc.go",
|
|
"zap.go",
|
|
],
|
|
visibility = [
|
|
"//pkg/sentry:internal",
|
|
"//tools/zap:__pkg__",
|
|
],
|
|
deps = [
|
|
"//pkg/atomicbitops",
|
|
"//pkg/cleanup",
|
|
"//pkg/eventfd",
|
|
"//pkg/flipcall",
|
|
"//pkg/gohacks",
|
|
"//pkg/hostarch",
|
|
"//pkg/log",
|
|
"//pkg/refs",
|
|
"//pkg/sentry/memmap",
|
|
"//pkg/sentry/state/stateio",
|
|
"//pkg/sync",
|
|
"//pkg/urpc",
|
|
"@com_github_zap_proto_go//:go",
|
|
"@org_golang_x_sys//unix:go_default_library",
|
|
],
|
|
)
|
|
|
|
go_test(
|
|
name = "stateipc_test",
|
|
size = "small",
|
|
srcs = [
|
|
"stateipc_test.go",
|
|
],
|
|
library = ":stateipc",
|
|
deps = [
|
|
"//pkg/rand",
|
|
"//pkg/sentry/memmap",
|
|
"//pkg/sentry/state/stateio",
|
|
"//pkg/unet",
|
|
"//pkg/urpc",
|
|
"@org_golang_x_sys//unix:go_default_library",
|
|
],
|
|
)
|