Avoid deleting persisted data on weave-kube upgrade

Add a feature to weaveutil to get and set flags, then use this feature
to mark the DB when this version runs
This commit is contained in:
Bryan Boreham committed 2017-11-15 11:26:43 +00:00
1 parent 214cf6cb2e
commit 570ab0b10b
3 files changed
+70 -7

No files matched your search

+14 -7
View File
@@ -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
+54
View File
@@ -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", "<db-prefix> <flag-name>")
}
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", "<db-prefix> <flag-name> <flag-value>")
}
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
}
+2
View File
@@ -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,
}
}