Codebase list golang-github-cloudflare-tableflip / upstream/1.2.1_git20200514.4baec98
New upstream version 1.2.1~git20200514.4baec98 Pirate Praveen 3 years ago
4 changed file(s) with 61 addition(s) and 17 deletion(s). Raw diff Collapse all Expand all
00 package tableflip
11
22 import (
3 "context"
34 "fmt"
45 "net"
56 "os"
7778 // NB: Files in these maps may be in blocking mode.
7879 inherited map[fileName]*file
7980 used map[fileName]*file
80 }
81
82 func newFds(inherited map[fileName]*file) *Fds {
81 lc *net.ListenConfig
82 }
83
84 func newFds(inherited map[fileName]*file, lc *net.ListenConfig) *Fds {
8385 if inherited == nil {
8486 inherited = make(map[fileName]*file)
8587 }
88
89 if lc == nil {
90 lc = &net.ListenConfig{}
91 }
92
8693 return &Fds{
8794 inherited: inherited,
8895 used: make(map[fileName]*file),
96 lc: lc,
8997 }
9098 }
9199
103111 return ln, nil
104112 }
105113
106 ln, err = net.Listen(network, addr)
114 ln, err = f.lc.Listen(context.Background(), network, addr)
107115 if err != nil {
108116 return nil, fmt.Errorf("can't create new listener: %s", err)
109117 }
186194 return conn, nil
187195 }
188196
189 conn, err = net.ListenPacket(network, addr)
197 conn, err = f.lc.ListenPacket(context.Background(), network, addr)
190198 if err != nil {
191199 return nil, fmt.Errorf("can't create new listener: %s", err)
192200 }
1818 {"tcp", "localhost:0"},
1919 }
2020
21 fds := newFds(nil)
21 fds := newFds(nil, nil)
22
2223 for _, addr := range addrs {
2324 ln, err := net.Listen(addr[0], addr[1])
2425 if err != nil {
4041 {"udp", "localhost:0"},
4142 }
4243
43 fds := newFds(nil)
44 fds := newFds(nil, nil)
4445 for _, addr := range addrs {
4546 conn, err := net.ListenPacket(addr[0], addr[1])
4647 if err != nil {
9091 err error
9192 )
9293
93 parent := newFds(nil)
94 parent := newFds(nil, nil)
9495 for _, addr := range addrs {
9596 switch addr[0] {
9697 case "udp", "unixgram":
107108 ln.Close()
108109 }
109110
110 child := newFds(parent.copy())
111 child := newFds(parent.copy(), nil)
111112 for _, addr := range addrs {
112113 switch addr[0] {
113114 case "udp", "unixgram":
141142 }
142143
143144 makeFds := func(t *testing.T) *Fds {
144 fds := newFds(nil)
145 fds := newFds(nil, nil)
145146 for _, addr := range addrs {
146147 var c io.Closer
147148 var err error
173174
174175 t.Run("closeInherited", func(t *testing.T) {
175176 parent := makeFds(t)
176 child := newFds(parent.copy())
177 child := newFds(parent.copy(), nil)
177178 child.closeInherited()
178179 for _, addr := range addrs {
179180 if _, err := os.Stat(addr[1]); err == nil {
204205 t.Fatal(err)
205206 }
206207
207 parent := newFds(nil)
208 parent := newFds(nil, nil)
208209 if err := parent.AddConn("unixgram", "", unix); err != nil {
209210 t.Fatal("Can't add conn:", err)
210211 }
211212 unix.Close()
212213
213 child := newFds(parent.copy())
214 child := newFds(parent.copy(), nil)
214215 conn, err := child.Conn("unixgram", "")
215216 if err != nil {
216217 t.Fatal("Can't get conn:", err)
228229 }
229230 defer r.Close()
230231
231 parent := newFds(nil)
232 parent := newFds(nil, nil)
232233 if err := parent.AddFile("test", w); err != nil {
233234 t.Fatal("Can't add file:", err)
234235 }
235236 w.Close()
236237
237 child := newFds(parent.copy())
238 child := newFds(parent.copy(), nil)
238239 file, err := child.File("test")
239240 if err != nil {
240241 t.Fatal("Can't get file:", err)
44 "errors"
55 "fmt"
66 "io/ioutil"
7 "net"
78 "os"
89 "path/filepath"
910 "runtime"
2324 UpgradeTimeout time.Duration
2425 // The PID of a ready process is written to this file.
2526 PIDFile string
27 // ListenConfig is a custom ListenConfig. Defaults to an empty ListenConfig
28 ListenConfig *net.ListenConfig
2629 }
2730
2831 // Upgrader handles zero downtime upgrades and passing files between processes.
9598 upgradeC: make(chan chan<- error),
9699 exitC: make(chan struct{}),
97100 exitFd: make(chan neverCloseThisFile, 1),
98 Fds: newFds(files),
101 Fds: newFds(files, opts.ListenConfig),
99102 }
100103
101104 go u.run()
77 "fmt"
88 "io"
99 "io/ioutil"
10 "net"
1011 "os"
1112 "strconv"
13 "syscall"
1214 "testing"
1315 "time"
1416 )
279281 }
280282 }
281283
284 func TestUpgraderListenConfig(t *testing.T) {
285 t.Parallel()
286
287 var listenConfigUsed bool
288 u := newTestUpgrader(Options{
289 ListenConfig: &net.ListenConfig{
290 Control: func(network, address string, c syscall.RawConn) error {
291 listenConfigUsed = true
292 return nil
293 },
294 },
295 })
296 defer u.Stop()
297
298 new, _ := u.upgradeProc(t)
299
300 go new.recvSignal(nil)
301
302 _, err := u.Listen("tcp", ":0")
303 if err != nil {
304 t.Errorf("Unexpected error from listen: %v", err)
305 }
306
307 if !listenConfigUsed {
308 t.Error("Expected ListenConfig to be called during Listen")
309 }
310
311 new.exit(nil)
312 }
313
282314 func TestUpgraderConcurrentUpgrade(t *testing.T) {
283315 t.Parallel()
284316
472504 func BenchmarkUpgrade(b *testing.B) {
473505 for _, n := range []int{4, 400, 4000} {
474506 b.Run(fmt.Sprintf("n=%d", n), func(b *testing.B) {
475 fds := newFds(nil)
507 fds := newFds(nil, nil)
476508 for i := 0; i < n; i += 2 {
477509 r, w, err := os.Pipe()
478510 if err != nil {