diff --git a/prog/kube-peers/main.go b/prog/kube-peers/main.go index 3b03f437..9d95c1f5 100644 --- a/prog/kube-peers/main.go +++ b/prog/kube-peers/main.go @@ -182,7 +182,7 @@ func main() { logLevel string ) flag.BoolVar(&justReclaim, "reclaim", false, "reclaim IP space from dead peers") - flag.BoolVar(&justCheck, "check-peer-exists", false, "return success if peer name is stored in annotation") + flag.BoolVar(&justCheck, "check-peer-new", false, "return success if peer name is not stored in annotation") flag.StringVar(&peerName, "peer-name", "unknown", "name of this Weave Net peer") flag.StringVar(&nodeName, "node-name", "unknown", "name of this Kubernetes node") flag.StringVar(&logLevel, "log-level", "info", "logging level (debug, info, warning, error)") @@ -204,9 +204,9 @@ func main() { common.Log.Fatalf("[kube-peers] Could not check peer list: %v", err) } if exists { - os.Exit(0) - } else { os.Exit(9) + } else { + os.Exit(0) } } peers, err := getKubePeers(c) diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh index f91a0d16..bba088da 100755 --- a/prog/weave-kube/launch.sh +++ b/prog/weave-kube/launch.sh @@ -95,16 +95,23 @@ if [ -z "$PEERNAME" ]; then exit 2 fi -# If this peer name is not stored in the list, either we are a -# brand-new peer or we were removed by another peer while temporarily -# absent. In order to avoid a CRDT clash for the latter case, clean up -if ! /home/weave/kube-peers -check-peer-exists -peer-name="$PEERNAME" -log-level=debug ; then - if [ -f ${DB_PREFIX}data.db ]; then - echo "Peer not in list; removing persisted data" >&2 - rm -f ${DB_PREFIX}data.db +# Check if peer reclaim is in use - we don't want to delete persisted data on an upgrade +if /usr/bin/weaveutil get-db-flag "$DB_PREFIX" peer-reclaim >/dev/null ; then + # If this peer name is not stored in the list, either we are a + # brand-new peer or we were removed by another peer while temporarily + # absent. In order to avoid a CRDT clash for the latter case, clean up + if /home/weave/kube-peers -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then + if [ -f ${DB_PREFIX}data.db ]; then + echo "Peer not in list; removing persisted data" >&2 + rm -f ${DB_PREFIX}data.db + fi fi fi +# flag that peer reclaim is now in use - note we have to do this before +# weaver is running as the DB can only be opened by one process at a time +/usr/bin/weaveutil set-db-flag "$DB_PREFIX" peer-reclaim ok + post_start_actions() { # Wait for weave process to become responsive while true ; do diff --git a/prog/weaveutil/db_flag.go b/prog/weaveutil/db_flag.go new file mode 100644 index 00000000..6d32587b --- /dev/null +++ b/prog/weaveutil/db_flag.go @@ -0,0 +1,54 @@ +// Get/set arbitrary flags in the Weave Net persistence DB +package main + +import ( + "fmt" + + "github.com/weaveworks/weave/db" +) + +const dbFlagPrefix = "flag:" + +func getDBFlag(args []string) error { + if len(args) != 2 { + cmdUsage("check-db-flag", " ") + } + dbPrefix := args[0] + flagName := args[1] + + d, err := db.NewBoltDBReadOnly(dbPrefix) + if err != nil { + return err + } + defer d.Close() + var value string + nameFound, err := d.Load(dbFlagPrefix+flagName, &value) + if err != nil { + return err + } + if !nameFound { + return fmt.Errorf("") + } + fmt.Print(value) + return nil +} + +func setDBFlag(args []string) error { + if len(args) != 3 { + cmdUsage("set-db-flag", " ") + } + dbPrefix := args[0] + flagName := args[1] + value := args[2] + + d, err := db.NewBoltDB(dbPrefix) + if err != nil { + return err + } + defer d.Close() + err = d.Save(dbFlagPrefix+flagName, value) + if err != nil { + return err + } + return nil +} diff --git a/prog/weaveutil/main.go b/prog/weaveutil/main.go index 065208b1..deb45d9d 100644 --- a/prog/weaveutil/main.go +++ b/prog/weaveutil/main.go @@ -50,6 +50,8 @@ func init() { "swarm-manager-peers": swarmManagerPeers, "is-docker-plugin-enabled": isDockerPluginEnabled, "rewrite-etc-hosts": rewriteEtcHosts, + "get-db-flag": getDBFlag, + "set-db-flag": setDBFlag, } } @@ -83,7 +85,9 @@ func main() { os.Exit(1) } if err := cmd(os.Args[2:]); err != nil { - fmt.Fprintln(os.Stderr, err) + if err.Error() != "" { + fmt.Fprintln(os.Stderr, err) + } os.Exit(1) } }