Skip to content

Commit 229236e

Browse files
authored
Merge pull request #111 from klihub/devel/split-sync-messages
fixes: use multiple sync messages if we hit ttrpc max message limit.
2 parents 43b5c7f + 159f575 commit 229236e

File tree

26 files changed

+867
-621
lines changed

26 files changed

+867
-621
lines changed

go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,23 @@ module github.com/containerd/nri
33
go 1.21
44

55
require (
6-
github.com/containerd/ttrpc v1.2.3
6+
github.com/containerd/ttrpc v1.2.6-0.20240827082320-b5cd6e4b3287
77
github.com/moby/sys/mountinfo v0.6.2
88
github.com/onsi/ginkgo/v2 v2.19.1
99
github.com/onsi/gomega v1.34.0
1010
github.com/opencontainers/runtime-spec v1.0.3-0.20220825212826-86290f6a00fb
1111
github.com/opencontainers/runtime-tools v0.9.0
12-
github.com/sirupsen/logrus v1.8.1
12+
github.com/sirupsen/logrus v1.9.3
1313
github.com/stretchr/testify v1.8.4
1414
golang.org/x/sys v0.21.0
15+
google.golang.org/grpc v1.57.1
1516
google.golang.org/protobuf v1.34.1
1617
k8s.io/cri-api v0.25.3
1718
sigs.k8s.io/yaml v1.3.0
1819
)
1920

2021
require (
22+
github.com/containerd/log v0.1.0 // indirect
2123
github.com/davecgh/go-spew v1.1.1 // indirect
2224
github.com/go-logr/logr v1.4.2 // indirect
2325
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
@@ -31,7 +33,6 @@ require (
3133
golang.org/x/text v0.15.0 // indirect
3234
golang.org/x/tools v0.21.0 // indirect
3335
google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d // indirect
34-
google.golang.org/grpc v1.57.1 // indirect
3536
gopkg.in/yaml.v2 v2.4.0 // indirect
3637
gopkg.in/yaml.v3 v3.0.1 // indirect
3738
)

go.sum

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
22
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
3-
github.com/containerd/ttrpc v1.2.3 h1:4jlhbXIGvijRtNC8F/5CpuJZ7yKOBFGFOOXg1bkISz0=
4-
github.com/containerd/ttrpc v1.2.3/go.mod h1:ieWsXucbb8Mj9PH0rXCw1i8IunRbbAiDkpXkbfflWBM=
3+
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
4+
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
5+
github.com/containerd/ttrpc v1.2.6-0.20240827082320-b5cd6e4b3287 h1:zwv64tCdT888KxuXQuv5i36cEdljoXq3sVqLmOEbCQI=
6+
github.com/containerd/ttrpc v1.2.6-0.20240827082320-b5cd6e4b3287/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o=
57
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
68
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
79
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -48,11 +50,13 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
4850
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
4951
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
5052
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
51-
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
5253
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
54+
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
55+
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
5356
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5457
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
5558
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
59+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5660
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
5761
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
5862
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
@@ -86,6 +90,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
8690
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8791
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8892
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
93+
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
8994
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
9095
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
9196
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -115,6 +120,7 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8X
115120
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
116121
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
117122
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
123+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
118124
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
119125
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
120126
k8s.io/cri-api v0.25.3 h1:YaiQ05CM4+5L2DAz0KoSa4sv4/VlQvLbf3WHKICPSXs=

pkg/adaptation/plugin.go

Lines changed: 92 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import (
3333
"github.com/containerd/nri/pkg/net"
3434
"github.com/containerd/nri/pkg/net/multiplex"
3535
"github.com/containerd/ttrpc"
36+
"google.golang.org/grpc/codes"
37+
"google.golang.org/grpc/status"
3638
)
3739

3840
const (
@@ -414,19 +416,101 @@ func (p *plugin) synchronize(ctx context.Context, pods []*PodSandbox, containers
414416
ctx, cancel := context.WithTimeout(ctx, getPluginRequestTimeout())
415417
defer cancel()
416418

417-
req := &SynchronizeRequest{
418-
Pods: pods,
419-
Containers: containers,
420-
}
421-
rpl, err := p.stub.Synchronize(ctx, req)
422-
if err != nil {
423-
p.close()
424-
return nil, err
419+
var (
420+
podsToSend = pods
421+
ctrsToSend = containers
422+
podsPerMsg = len(pods)
423+
ctrsPerMsg = len(containers)
424+
425+
rpl *SynchronizeResponse
426+
err error
427+
)
428+
429+
for {
430+
req := &SynchronizeRequest{
431+
Pods: podsToSend[:podsPerMsg],
432+
Containers: ctrsToSend[:ctrsPerMsg],
433+
More: len(podsToSend) > podsPerMsg || len(ctrsToSend) > ctrsPerMsg,
434+
}
435+
436+
log.Debugf(ctx, "sending sync message, %d/%d, %d/%d (more: %v)",
437+
len(req.Pods), len(podsToSend), len(req.Containers), len(ctrsToSend), req.More)
438+
439+
rpl, err = p.stub.Synchronize(ctx, req)
440+
if err == nil {
441+
if !req.More {
442+
break
443+
}
444+
445+
if len(rpl.Update) > 0 || rpl.More != req.More {
446+
p.close()
447+
return nil, fmt.Errorf("plugin does not handle split sync requests")
448+
}
449+
450+
podsToSend = podsToSend[podsPerMsg:]
451+
ctrsToSend = ctrsToSend[ctrsPerMsg:]
452+
453+
if podsPerMsg > len(podsToSend) {
454+
podsPerMsg = len(podsToSend)
455+
}
456+
if ctrsPerMsg > len(ctrsToSend) {
457+
ctrsPerMsg = len(ctrsToSend)
458+
}
459+
} else {
460+
podsPerMsg, ctrsPerMsg, err = recalcObjsPerSyncMsg(podsPerMsg, ctrsPerMsg, err)
461+
if err != nil {
462+
p.close()
463+
return nil, err
464+
}
465+
466+
log.Debugf(ctx, "oversized message, retrying in smaller chunks")
467+
}
425468
}
426469

427470
return rpl.Update, nil
428471
}
429472

473+
func recalcObjsPerSyncMsg(pods, ctrs int, err error) (int, int, error) {
474+
const (
475+
minObjsPerMsg = 8
476+
)
477+
478+
if status.Code(err) != codes.ResourceExhausted {
479+
return pods, ctrs, err
480+
}
481+
482+
if pods+ctrs <= minObjsPerMsg {
483+
return pods, ctrs, fmt.Errorf("failed to synchronize plugin with split messages")
484+
}
485+
486+
var e *ttrpc.OversizedMessageErr
487+
if !errors.As(err, &e) {
488+
return pods, ctrs, fmt.Errorf("failed to synchronize plugin with split messages")
489+
}
490+
491+
maxLen := e.MaximumLength()
492+
msgLen := e.RejectedLength()
493+
494+
if msgLen == 0 || maxLen == 0 || msgLen <= maxLen {
495+
return pods, ctrs, fmt.Errorf("failed to synchronize plugin with split messages")
496+
}
497+
498+
factor := float64(maxLen) / float64(msgLen)
499+
if factor > 0.9 {
500+
factor = 0.9
501+
}
502+
503+
pods = int(float64(pods) * factor)
504+
ctrs = int(float64(ctrs) * factor)
505+
506+
if pods+ctrs < minObjsPerMsg {
507+
pods = minObjsPerMsg / 2
508+
ctrs = minObjsPerMsg / 2
509+
}
510+
511+
return pods, ctrs, nil
512+
}
513+
430514
// Relay CreateContainer request to plugin.
431515
func (p *plugin) createContainer(ctx context.Context, req *CreateContainerRequest) (*CreateContainerResponse, error) {
432516
if !p.events.IsSet(Event_CREATE_CONTAINER) {

0 commit comments

Comments
 (0)