Skip to content

Commit 36e64b2

Browse files
committed
feature:support live-restore
Signed-off-by: ningmingxiao <[email protected]>
1 parent 0ee7128 commit 36e64b2

File tree

3 files changed

+81
-11
lines changed

3 files changed

+81
-11
lines changed

go.mod

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/containerd/continuity v0.4.5 //gomodjail:unconfined
1717
github.com/containerd/errdefs v1.0.0
1818
github.com/containerd/fifo v1.1.0 //gomodjail:unconfined
19-
github.com/containerd/go-cni v1.1.13 //gomodjail:unconfined
19+
github.com/containerd/go-cni v1.1.12 //gomodjail:unconfined
2020
github.com/containerd/imgcrypt/v2 v2.0.1 //gomodjail:unconfined
2121
github.com/containerd/log v0.1.0
2222
github.com/containerd/nerdctl/mod/tigron v0.0.0
@@ -25,6 +25,7 @@ require (
2525
github.com/containerd/stargz-snapshotter v0.16.3 //gomodjail:unconfined
2626
github.com/containerd/stargz-snapshotter/estargz v0.16.3 //gomodjail:unconfined
2727
github.com/containerd/stargz-snapshotter/ipfs v0.16.3 //gomodjail:unconfined
28+
github.com/containerd/ttrpc v1.2.7
2829
github.com/containerd/typeurl/v2 v2.2.3
2930
github.com/containernetworking/cni v1.3.0 //gomodjail:unconfined
3031
github.com/containernetworking/plugins v1.7.1 //gomodjail:unconfined
@@ -34,7 +35,7 @@ require (
3435
github.com/distribution/reference v0.6.0
3536
github.com/docker/cli v28.3.3+incompatible //gomodjail:unconfined
3637
github.com/docker/docker v28.3.3+incompatible //gomodjail:unconfined
37-
github.com/docker/go-connections v0.6.0
38+
github.com/docker/go-connections v0.5.0
3839
github.com/docker/go-units v0.5.0
3940
github.com/fahedouch/go-logrotate v0.3.0 //gomodjail:unconfined
4041
github.com/fatih/color v1.18.0 //gomodjail:unconfined
@@ -79,7 +80,6 @@ require (
7980
github.com/containerd/errdefs/pkg v0.3.0 // indirect
8081
github.com/containerd/go-runc v1.1.0 // indirect
8182
github.com/containerd/plugin v1.0.0 // indirect
82-
github.com/containerd/ttrpc v1.2.7 // indirect
8383
github.com/containers/ocicrypt v1.2.1 // indirect
8484
github.com/creack/pty v1.1.24 // indirect
8585
github.com/djherbis/times v1.6.0 // indirect
@@ -148,4 +148,14 @@ require (
148148
tags.cncf.io/container-device-interface/specs-go v1.0.0 // indirect
149149
)
150150

151+
require (
152+
github.com/checkpoint-restore/checkpointctl v1.3.0 // indirect
153+
github.com/containerd/otelttrpc v0.1.0 // indirect
154+
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
155+
github.com/mdlayher/socket v0.5.1 // indirect
156+
github.com/mdlayher/vsock v1.2.1 // indirect
157+
go.etcd.io/bbolt v1.4.0 // indirect
158+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
159+
)
160+
151161
replace github.com/containerd/nerdctl/mod/tigron v0.0.0 => ./mod/tigron

go.sum

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH
1515
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
1616
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
1717
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
18+
github.com/checkpoint-restore/checkpointctl v1.3.0 h1:bNz5b6s+lxFdG5ZGDba3qSkBtXDDTCG2494dfAbQJ4E=
19+
github.com/checkpoint-restore/checkpointctl v1.3.0/go.mod h1:dqZH4wDvbjnsqFGK2LdUDk21yFQ1dCAtzgRMlG44KDM=
1820
github.com/cilium/ebpf v0.16.0 h1:+BiEnHL6Z7lXnlGUsXQPPAE7+kenAd4ES8MQ5min0Ok=
1921
github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE=
2022
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -39,8 +41,8 @@ github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151X
3941
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
4042
github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY=
4143
github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o=
42-
github.com/containerd/go-cni v1.1.13 h1:eFSGOKlhoYNxpJ51KRIMHZNlg5UgocXEIEBGkY7Hnis=
43-
github.com/containerd/go-cni v1.1.13/go.mod h1:nTieub0XDRmvCZ9VI/SBG6PyqT95N4FIhxsauF1vSBI=
44+
github.com/containerd/go-cni v1.1.12 h1:wm/5VD/i255hjM4uIZjBRiEQ7y98W9ACy/mHeLi4+94=
45+
github.com/containerd/go-cni v1.1.12/go.mod h1:+jaqRBdtW5faJxj2Qwg1Of7GsV66xcvnCx4mSJtUlxU=
4446
github.com/containerd/go-runc v1.1.0 h1:OX4f+/i2y5sUT7LhmcJH7GYrjjhHa1QI4e8yO0gGleA=
4547
github.com/containerd/go-runc v1.1.0/go.mod h1:xJv2hFF7GvHtTJd9JqTS2UVxMkULUYw4JN5XAUZqH5U=
4648
github.com/containerd/imgcrypt/v2 v2.0.1 h1:gQcmeCKA97fAl0wlpq0itSY/PagFBsn4/mlKUy6kOio=
@@ -49,6 +51,8 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
4951
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
5052
github.com/containerd/nydus-snapshotter v0.15.2 h1:qsHI4M+Wwrf6Jr4eBqhNx8qh+YU0dSiJ+WPmcLFWNcg=
5153
github.com/containerd/nydus-snapshotter v0.15.2/go.mod h1:FfwH2KBkNYoisK/e+KsmNr7xTU53DmnavQHMFOcXwfM=
54+
github.com/containerd/otelttrpc v0.1.0 h1:UOX68eVTE8H/T45JveIg+I22Ev2aFj4qPITCmXsskjw=
55+
github.com/containerd/otelttrpc v0.1.0/go.mod h1:XhoA2VvaGPW1clB2ULwrBZfXVuEWuyOd2NUD1IM0yTg=
5256
github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E=
5357
github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4=
5458
github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y=
@@ -94,8 +98,10 @@ github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjY
9498
github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
9599
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
96100
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
97-
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
98-
github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
101+
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
102+
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
103+
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
104+
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
99105
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
100106
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
101107
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -196,6 +202,8 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/
196202
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
197203
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
198204
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
205+
github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
206+
github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
199207
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
200208
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
201209
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
@@ -332,10 +340,14 @@ github.com/yuchanns/srslog v1.1.0/go.mod h1:HsLjdv3XV02C3kgBW2bTyW6i88OQE+VYJZIx
332340
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
333341
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
334342
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
343+
go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk=
344+
go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
335345
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
336346
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
337347
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
338348
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
349+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=
350+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM=
339351
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
340352
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
341353
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=

pkg/logging/logging.go

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,24 @@ import (
2323
"errors"
2424
"fmt"
2525
"io"
26+
"net"
2627
"os"
2728
"path/filepath"
2829
"sort"
2930
"strings"
3031
"sync"
3132
"time"
3233

34+
"github.com/containerd/ttrpc"
3335
"github.com/fsnotify/fsnotify"
3436
"github.com/muesli/cancelreader"
3537

38+
task "github.com/containerd/containerd/api/runtime/task/v3"
3639
containerd "github.com/containerd/containerd/v2/client"
40+
"github.com/containerd/containerd/v2/core/runtime/v2"
3741
"github.com/containerd/containerd/v2/core/runtime/v2/logging"
42+
"github.com/containerd/containerd/v2/pkg/namespaces"
43+
"github.com/containerd/containerd/v2/pkg/shim"
3844
"github.com/containerd/errdefs"
3945
"github.com/containerd/log"
4046

@@ -165,6 +171,48 @@ func WaitForLogger(dataStore, ns, id string) error {
165171
})
166172
}
167173

174+
func connectToShim(ctx context.Context, ctrdEndpoint string, version int, id string) (v2.TaskServiceClient, error) {
175+
addr, err := shim.SocketAddress(ctx, ctrdEndpoint, id, false)
176+
if err != nil {
177+
return nil, err
178+
}
179+
addr = strings.TrimPrefix(addr, "unix://")
180+
conn, err := net.Dial("unix", addr)
181+
if err != nil {
182+
return nil, err
183+
}
184+
185+
client := ttrpc.NewClient(conn)
186+
cli, err := v2.NewTaskClient(client, version)
187+
if err != nil {
188+
return nil, err
189+
}
190+
return cli, nil
191+
}
192+
193+
// Connect shim directly to avoid to connect containerd.
194+
func waitContainerExited(ctx context.Context, address string, config *logging.Config) (<-chan containerd.ExitStatus, error) {
195+
ctx = namespaces.WithNamespace(ctx, config.Namespace)
196+
shimCli, err := connectToShim(ctx, strings.TrimPrefix(address, "unix://"), 3, config.ID)
197+
if err != nil {
198+
return nil, err
199+
}
200+
c := make(chan containerd.ExitStatus, 1)
201+
go func() {
202+
defer close(c)
203+
response, err := shimCli.Wait(ctx, &task.WaitRequest{
204+
ID: config.ID,
205+
})
206+
207+
if err != nil {
208+
c <- *containerd.NewExitStatus(containerd.UnknownExitStatus, time.Time{}, err)
209+
return
210+
}
211+
c <- *containerd.NewExitStatus(response.ExitStatus, response.ExitedAt.AsTime(), nil)
212+
}()
213+
return c, nil
214+
}
215+
168216
func getContainerWait(ctx context.Context, address string, config *logging.Config) (<-chan containerd.ExitStatus, error) {
169217
client, err := containerd.New(strings.TrimPrefix(address, "unix://"), containerd.WithDefaultNamespace(config.Namespace))
170218
if err != nil {
@@ -175,9 +223,9 @@ func getContainerWait(ctx context.Context, address string, config *logging.Confi
175223
return nil, err
176224
}
177225

178-
task, err := con.Task(ctx, nil)
226+
_, err = con.Task(ctx, nil)
179227
if err == nil {
180-
return task.Wait(ctx)
228+
return waitContainerExited(ctx, strings.TrimPrefix(address, "unix://"), config)
181229
}
182230
if !errdefs.IsNotFound(err) {
183231
return nil, err
@@ -193,14 +241,14 @@ func getContainerWait(ctx context.Context, address string, config *logging.Confi
193241
case <-ctx.Done():
194242
return nil, errors.New("timed out waiting for container task to start")
195243
case <-ticker.C:
196-
task, err = con.Task(ctx, nil)
244+
_, err := con.Task(ctx, nil)
197245
if err != nil {
198246
if errdefs.IsNotFound(err) {
199247
continue
200248
}
201249
return nil, err
202250
}
203-
return task.Wait(ctx)
251+
return waitContainerExited(ctx, strings.TrimPrefix(address, "unix://"), config)
204252
}
205253
}
206254
}

0 commit comments

Comments
 (0)