Skip to content

Commit 6db7374

Browse files
authored
Add support for local memory pooling for data objects (#13678)
This feature is protected by a featuregate that is not yet enabled and only marked as alpha. Preliminary results show > 20% CPU performance improvement and at least 40% allocations improvement. I still need to generate UnmarshalProto for AnyValue which should improve even more results. Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
1 parent d227383 commit 6db7374

187 files changed

Lines changed: 4602 additions & 1430 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.chloggen/add-pooling.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
7+
component: pdata
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Add support for local memory pooling for data objects.
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [13678]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext: This is still an early experimental (alpha) feature. Do not recommended to be used production.
19+
To enable use "--featuregate=+pdata.useProtoPooling"
20+
21+
# Optional: The change log or logs in which this entry should be included.
22+
# e.g. '[user]' or '[user, api]'
23+
# Include 'user' if the change is relevant to end users.
24+
# Include 'api' if there is a change to a library API.
25+
# Default: '[user]'
26+
change_logs: [api, user]

internal/cmd/pdatagen/internal/pdata/field.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ type Field interface {
1414

1515
GenerateTestEncodingValues(ms *messageStruct) string
1616

17+
GenerateDeleteOrig(ms *messageStruct) string
18+
1719
GenerateCopyOrig(ms *messageStruct) string
1820

1921
GenerateMarshalJSON(ms *messageStruct) string

internal/cmd/pdatagen/internal/pdata/message_field.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ func (mf *MessageField) GenerateTestEncodingValues(*messageStruct) string {
6363
return mf.toProtoField().GenTestEncodingValues()
6464
}
6565

66+
func (mf *MessageField) GenerateDeleteOrig(*messageStruct) string {
67+
return mf.toProtoField().GenDeleteOrig()
68+
}
69+
6670
func (mf *MessageField) GenerateCopyOrig(ms *messageStruct) string {
6771
t := template.Parse("messageCopyOrigTemplate", []byte(messageCopyOrigTemplate))
6872
return template.Execute(t, mf.templateFields(ms))

internal/cmd/pdatagen/internal/pdata/one_of_field.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ const oneOfTestValuesTemplate = `
4444
{{ .GenerateTestEncodingValues $.baseStruct $.OneOfField }}
4545
{{- end }}`
4646

47+
const oneOfDeleteOrigTemplate = `switch ov := orig.{{ .originFieldName }}.(type) {
48+
{{ range .values -}}
49+
case *{{ $.originTypePrefix }}{{ .GetOriginFieldName }}:
50+
{{ .GenerateDeleteOrig $.baseStruct $.OneOfField }}{{- end }}
51+
}
52+
`
53+
4754
const oneOfCopyOrigTemplate = `switch t := src.{{ .originFieldName }}.(type) {
4855
{{- range .values }}
4956
{{ .GenerateCopyOrig $.baseStruct $.OneOfField }}
@@ -117,6 +124,20 @@ func (of *OneOfField) GenerateTestEncodingValues(ms *messageStruct) string {
117124
return template.Execute(template.Parse("oneOfTestValuesTemplate", []byte(oneOfTestValuesTemplate)), of.templateFields(ms))
118125
}
119126

127+
func (of *OneOfField) GenerateDeleteOrig(ms *messageStruct) string {
128+
atLeastOneMessage := false
129+
for i := range of.values {
130+
if _, ok := of.values[i].(*OneOfMessageValue); ok {
131+
atLeastOneMessage = true
132+
break
133+
}
134+
}
135+
if atLeastOneMessage {
136+
return template.Execute(template.Parse("oneOfDeleteOrigTemplate", []byte(oneOfDeleteOrigTemplate)), of.templateFields(ms))
137+
}
138+
return ""
139+
}
140+
120141
func (of *OneOfField) GenerateCopyOrig(ms *messageStruct) string {
121142
return template.Execute(template.Parse("oneOfCopyOrigTemplate", []byte(oneOfCopyOrigTemplate)), of.templateFields(ms))
122143
}
@@ -170,6 +191,7 @@ type oneOfValue interface {
170191
GenerateTestValue(ms *messageStruct, of *OneOfField) string
171192
GenerateTestFailingUnmarshalProtoValues(ms *messageStruct, of *OneOfField) string
172193
GenerateTestEncodingValues(ms *messageStruct, of *OneOfField) string
194+
GenerateDeleteOrig(ms *messageStruct, of *OneOfField) string
173195
GenerateCopyOrig(ms *messageStruct, of *OneOfField) string
174196
GenerateType(ms *messageStruct, of *OneOfField) string
175197
GenerateMarshalJSON(ms *messageStruct, of *OneOfField) string

internal/cmd/pdatagen/internal/pdata/one_of_message_value.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ func (omv *OneOfMessageValue) GenerateTestEncodingValues(ms *messageStruct, of *
9696
return omv.toProtoField(ms, of, false).GenTestEncodingValues()
9797
}
9898

99+
func (omv *OneOfMessageValue) GenerateDeleteOrig(ms *messageStruct, of *OneOfField) string {
100+
return omv.toProtoField(ms, of, false).GenDeleteOrig()
101+
}
102+
99103
func (omv *OneOfMessageValue) GenerateCopyOrig(ms *messageStruct, of *OneOfField) string {
100104
t := template.Parse("oneOfMessageCopyOrigTemplate", []byte(oneOfMessageCopyOrigTemplate))
101105
return template.Execute(t, omv.templateFields(ms, of))

internal/cmd/pdatagen/internal/pdata/one_of_primitive_value.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ func (opv *OneOfPrimitiveValue) GenerateTestEncodingValues(ms *messageStruct, of
9191
return opv.toProtoField(ms, of, false).GenTestEncodingValues()
9292
}
9393

94+
func (opv *OneOfPrimitiveValue) GenerateDeleteOrig(ms *messageStruct, of *OneOfField) string {
95+
return opv.toProtoField(ms, of, false).GenDeleteOrig()
96+
}
97+
9498
func (opv *OneOfPrimitiveValue) GenerateCopyOrig(ms *messageStruct, of *OneOfField) string {
9599
t := template.Parse("oneOfPrimitiveCopyOrigTemplate", []byte(oneOfPrimitiveCopyOrigTemplate))
96100
return template.Execute(t, opv.templateFields(ms, of))

internal/cmd/pdatagen/internal/pdata/optional_primitive_field.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ func (opv *OptionalPrimitiveField) GenerateTestEncodingValues(ms *messageStruct)
9898
return opv.toProtoField(ms, false).GenTestEncodingValues()
9999
}
100100

101+
func (opv *OptionalPrimitiveField) GenerateDeleteOrig(ms *messageStruct) string {
102+
return opv.toProtoField(ms, false).GenDeleteOrig()
103+
}
104+
101105
func (opv *OptionalPrimitiveField) GenerateCopyOrig(ms *messageStruct) string {
102106
t := template.Parse("optionalPrimitiveCopyOrigTemplate", []byte(optionalPrimitiveCopyOrigTemplate))
103107
return template.Execute(t, opv.templateFields(ms))

internal/cmd/pdatagen/internal/pdata/primitive_field.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ func (pf *PrimitiveField) GenerateTestEncodingValues(*messageStruct) string {
8080
return pf.toProtoField().GenTestEncodingValues()
8181
}
8282

83+
func (pf *PrimitiveField) GenerateDeleteOrig(*messageStruct) string {
84+
return pf.toProtoField().GenDeleteOrig()
85+
}
86+
8387
func (pf *PrimitiveField) GenerateCopyOrig(ms *messageStruct) string {
8488
t := template.Parse("primitiveCopyOrigTemplate", []byte(primitiveCopyOrigTemplate))
8589
return template.Execute(t, pf.templateFields(ms))

internal/cmd/pdatagen/internal/pdata/slice_field.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ func (sf *SliceField) GenerateTestEncodingValues(*messageStruct) string {
6969
return sf.toProtoField().GenTestEncodingValues()
7070
}
7171

72+
func (sf *SliceField) GenerateDeleteOrig(*messageStruct) string {
73+
return sf.toProtoField().GenDeleteOrig()
74+
}
75+
7276
func (sf *SliceField) GenerateCopyOrig(ms *messageStruct) string {
7377
t := template.Parse("sliceCopyOrigTemplate", []byte(sliceCopyOrigTemplate))
7478
return template.Execute(t, sf.templateFields(ms))

internal/cmd/pdatagen/internal/pdata/templates/message_internal.go.tmpl

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,34 @@ func New{{ .structName }}(orig *{{ .originFullName }}, state *State) {{ .structN
3232

3333
{{ end }}
3434

35+
var protoPool{{ .originName }} = sync.Pool{
36+
New: func() any {
37+
return &{{ .originFullName }}{}
38+
},
39+
}
40+
3541
func NewOrig{{ .originName }}() *{{ .originFullName }} {
36-
return &{{ .originFullName }}{}
42+
if !UseProtoPooling.IsEnabled() {
43+
return &{{ .originFullName }}{}
44+
}
45+
return protoPool{{ .originName }}.Get().(*{{ .originFullName }})
46+
}
47+
48+
func DeleteOrig{{ .originName }}(orig *{{ .originFullName }}, nullable bool) {
49+
if orig == nil {
50+
return
51+
}
52+
53+
if !UseProtoPooling.IsEnabled() {
54+
orig.Reset()
55+
return
56+
}
57+
58+
{{ range .fields }}{{ .GenerateDeleteOrig $.messageStruct }}{{ end }}
59+
orig.Reset()
60+
if nullable {
61+
protoPool{{ .originName }}.Put(orig)
62+
}
3763
}
3864

3965
func CopyOrig{{ .originName }}(dest, src *{{ .originFullName }}) {

0 commit comments

Comments
 (0)