diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh index f56f9553..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-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 +# 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..0beeb48e --- /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("Flag %q not found", flagName) + } + 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..b638a80c 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, } }