Refactor; simplify function responsibilities

pull/2604/head
Luke Morris 2017-12-17 14:11:27 -08:00
parent 3518074d7d
commit 2184aecf86
3 changed files with 65 additions and 39 deletions

View File

@ -50,15 +50,23 @@ func (s *BuildStore) Update(ctx context.Context, build chronograf.BuildInfo) err
return nil
}
// Migrate simply stores the current version in the database
func (s *BuildStore) Migrate(ctx context.Context, build chronograf.BuildInfo) error {
return s.Update(ctx, build)
}
// get retrieves the current build, falling back to a default when missing
func (s *BuildStore) get(ctx context.Context, tx *bolt.Tx) (chronograf.BuildInfo, error) {
var build chronograf.BuildInfo
if v := tx.Bucket(BuildBucket).Get(BuildKey); v == nil {
build = chronograf.BuildInfo{
Version: "pre-1.4.0.0",
Commit: "",
}
return build, nil
defaultBuild := chronograf.BuildInfo{
Version: "pre-1.4.0.0",
Commit: "",
}
if bucket := tx.Bucket(BuildBucket); bucket == nil {
return defaultBuild, nil
} else if v := bucket.Get(BuildKey); v == nil {
return defaultBuild, nil
} else if err := internal.UnmarshalBuild(v, &build); err != nil {
return build, err
}

View File

@ -65,6 +65,10 @@ func (c *Client) Open(ctx context.Context) error {
}
c.db = db
return nil
}
func (c *Client) Initialize(ctx context.Context) error {
if err := c.db.Update(func(tx *bolt.Tx) error {
// Always create Organizations bucket.
if _, err := tx.CreateBucketIfNotExists(OrganizationsBucket); err != nil {
@ -107,7 +111,7 @@ func (c *Client) Open(ctx context.Context) error {
}
// Migrate moves data from an old schema to a new schema in each Store
func (c *Client) Migrate(ctx context.Context) error {
func (c *Client) Migrate(ctx context.Context, build chronograf.BuildInfo) error {
if c.db != nil {
// Runtime migrations
if err := c.OrganizationsStore.Migrate(ctx); err != nil {
@ -128,6 +132,9 @@ func (c *Client) Migrate(ctx context.Context) error {
if err := c.ConfigStore.Migrate(ctx); err != nil {
return err
}
if err := c.BuildStore.Migrate(ctx, build); err != nil {
return err
}
}
return nil
}
@ -140,6 +147,34 @@ func (c *Client) Close() error {
return nil
}
func (c *Client) Copy(ctx context.Context, version string) error {
fromFile, err := os.Open(c.Path)
if err != nil {
return err
}
defer fromFile.Close()
backupDir := path.Join(path.Dir(c.Path), "backup")
_ = os.Mkdir(backupDir, 0700)
toName := fmt.Sprintf("%s.%s", path.Base(c.Path), version)
toPath := path.Join(backupDir, toName)
toFile, err := os.OpenFile(toPath, os.O_RDWR|os.O_CREATE, 0600)
if err != nil {
return err
}
defer toFile.Close()
_, err = io.Copy(toFile, fromFile)
if err != nil {
return err
}
log.Printf("Successfully created %s", toPath)
return nil
}
// Makes a copy of the database to the backup/ directory, if necessary:
// - If this is a fresh install, don't create a backup and store the current version
// - If we are on the same version, don't create a backup
@ -149,46 +184,22 @@ func (c *Client) Backup(ctx context.Context, build chronograf.BuildInfo) error {
if err != nil {
return err
}
if c.isNew {
if err = c.BuildStore.Update(ctx, build); err != nil {
return err
}
return nil
}
if lastBuild.Version == build.Version {
return nil
}
if c.isNew {
return nil
}
// The database was pre-existing, and the version has changed
// and so create a backup
log.Printf("Moving from version " + lastBuild.Version)
log.Printf("Moving to version " + build.Version)
from, err := os.Open(c.Path)
if err != nil {
if err = c.Copy(ctx, lastBuild.Version); err != nil {
return err
}
defer from.Close()
backupDir := path.Join(path.Dir(c.Path), "backup")
_ = os.Mkdir(backupDir, 0700)
toName := fmt.Sprintf("%s.%s", path.Base(c.Path), lastBuild.Version)
toPath := path.Join(backupDir, toName)
to, err := os.OpenFile(toPath, os.O_RDWR|os.O_CREATE, 0600)
if err != nil {
return err
}
defer to.Close()
_, err = io.Copy(to, from)
if err != nil {
return err
}
if err = c.BuildStore.Update(ctx, build); err != nil {
return err
}
log.Printf("Successfully created %s", toPath)
return nil
}

View File

@ -408,7 +408,14 @@ func openService(ctx context.Context, s *Server, lBuilder LayoutBuilder, sBuilde
os.Exit(1)
}
if err := db.Migrate(ctx); err != nil {
if err := db.Initialize(ctx); err != nil {
logger.
WithField("component", "boltstore").
Error("Unable to boot boltdb: ", err)
os.Exit(1)
}
if err := db.Migrate(ctx, s.BuildInfo); err != nil {
logger.
WithField("component", "boltstore").
Error("Unable to migrate data in boltdb: ", err)