@@ -2,14 +2,17 @@ package main
2
2
3
3
import (
4
4
"context"
5
- "github.com/awslabs/containerd-firecracker/snapshotter"
6
- "google.golang.org/grpc"
7
5
"net"
8
6
"os"
7
+ "os/signal"
8
+ "syscall"
9
9
10
+ "github.com/awslabs/containerd-firecracker/snapshotter"
10
11
snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
11
12
"github.com/containerd/containerd/contrib/snapshotservice"
12
13
"github.com/containerd/containerd/log"
14
+ "golang.org/x/sync/errgroup"
15
+ "google.golang.org/grpc"
13
16
)
14
17
15
18
func main () {
@@ -19,7 +22,14 @@ func main() {
19
22
20
23
var unixAddr , rootPath = os .Args [1 ], os .Args [2 ]
21
24
22
- ctx := context .Background ()
25
+ stop := make (chan os.Signal , 1 )
26
+ signal .Notify (stop , syscall .SIGINT , syscall .SIGTERM )
27
+
28
+ ctx , cancel := context .WithCancel (context .Background ())
29
+ defer cancel ()
30
+
31
+ group , ctx := errgroup .WithContext (ctx )
32
+
23
33
rpc := grpc .NewServer ()
24
34
25
35
snap , err := snapshotter .NewSnapshotter (ctx , rootPath )
@@ -37,9 +47,34 @@ func main() {
37
47
log .G (ctx ).WithError (err ).Fatalf ("failed to listen socket at %s" , os .Args [1 ])
38
48
}
39
49
40
- defer listener .Close ()
50
+ group .Go (func () error {
51
+ return rpc .Serve (listener )
52
+ })
53
+
54
+ group .Go (func () error {
55
+ defer func () {
56
+ log .G (ctx ).Info ("stopping server" )
57
+ rpc .Stop ()
58
+
59
+ if err := snap .Close (); err != nil {
60
+ log .G (ctx ).WithError (err ).Error ("failed to close snapshotter" )
61
+ }
62
+ }()
41
63
42
- if err := rpc .Serve (listener ); err != nil {
43
- log .G (ctx ).WithError (err ).Fatal ("failed to run gRPC server" )
64
+ for {
65
+ select {
66
+ case <- stop :
67
+ cancel ()
68
+ return nil
69
+ case <- ctx .Done ():
70
+ return ctx .Err ()
71
+ }
72
+ }
73
+ })
74
+
75
+ if err := group .Wait (); err != nil {
76
+ log .G (ctx ).WithError (err ).Warn ("snapshotter error" )
44
77
}
78
+
79
+ log .G (ctx ).Info ("done" )
45
80
}
0 commit comments