vault: ensure upgrades are cleaned up

This commit is contained in:
Armon Dadgar 2015-05-28 16:52:06 -07:00
parent db0afc9ebe
commit 5aaad32af8
1 changed files with 29 additions and 0 deletions

View File

@ -1179,6 +1179,9 @@ func (c *Core) postUnseal() error {
if err := c.barrier.ReloadKeyring(); err != nil { if err := c.barrier.ReloadKeyring(); err != nil {
return err return err
} }
if err := c.scheduleUpgradeCleanup(); err != nil {
return err
}
} }
if err := c.loadMounts(); err != nil { if err := c.loadMounts(); err != nil {
return err return err
@ -1387,6 +1390,32 @@ func (c *Core) checkKeyUpgrades() error {
return nil return nil
} }
// scheduleUpgradeCleanup is used to ensure that all the upgrade paths
// are cleaned up in a timely manner if a leader failover takes place
func (c *Core) scheduleUpgradeCleanup() error {
// List the upgrades
upgrades, err := c.barrier.List(keyringUpgradePrefix)
if err != nil {
return fmt.Errorf("failed to list upgrades: %v", err)
}
// Nothing to do if no upgrades
if len(upgrades) == 0 {
return nil
}
// Schedule cleanup for all of them
time.AfterFunc(keyRotateGracePeriod, func() {
for _, upgrade := range upgrades {
path := fmt.Sprintf("%s%s", keyringUpgradePrefix, upgrade)
if err := c.barrier.Delete(path); err != nil {
c.logger.Printf("[ERR] core: failed to cleanup upgrade: %s", path)
}
}
})
return nil
}
// acquireLock blocks until the lock is acquired, returning the leaderCh // acquireLock blocks until the lock is acquired, returning the leaderCh
func (c *Core) acquireLock(lock physical.Lock, stopCh <-chan struct{}) <-chan struct{} { func (c *Core) acquireLock(lock physical.Lock, stopCh <-chan struct{}) <-chan struct{} {
for { for {