42 lines
1.4 KiB
Go
42 lines
1.4 KiB
Go
// Package tableflip implements zero downtime upgrades.
|
|
//
|
|
// An upgrade spawns a new copy of argv[0] and passes
|
|
// file descriptors of used listening sockets to the new process. The old process exits
|
|
// once the new process signals readiness. Thus new code can use sockets allocated
|
|
// in the old process. This is similar to the approach used by nginx, but
|
|
// as a library.
|
|
//
|
|
// At any point in time there are one or two processes, with at most one of them
|
|
// in non-ready state. A successful upgrade fully replaces all old configuration
|
|
// and code.
|
|
//
|
|
// To use this library with systemd you need to use the PIDFile option in the service
|
|
// file.
|
|
//
|
|
// [Unit]
|
|
// Description=Service using tableflip
|
|
//
|
|
// [Service]
|
|
// ExecStart=/path/to/binary -some-flag /path/to/pid-file
|
|
// ExecReload=/bin/kill -HUP $MAINPID
|
|
// PIDFile=/path/to/pid-file
|
|
//
|
|
// Then pass /path/to/pid-file to New. You can use systemd-run to
|
|
// test your implementation:
|
|
//
|
|
// systemd-run --user -p PIDFile=/path/to/pid-file /path/to/binary
|
|
//
|
|
// systemd-run will print a unit name, which you can use with systemctl to
|
|
// inspect the service.
|
|
//
|
|
// NOTES:
|
|
//
|
|
// Requires at least Go 1.9, since there is a race condition on the
|
|
// pipes used for communication between parent and child.
|
|
//
|
|
// If you're seeing "can't start process: no such file or directory",
|
|
// you're probably using "go run main.go", for graceful reloads to work,
|
|
// you'll need use "go build main.go".
|
|
//
|
|
package tableflip
|