daemon/links_linux.go
018f19f8
 package daemon
 
 import (
 	"fmt"
 	"path/filepath"
 	"strings"
 
 	"github.com/Sirupsen/logrus"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/pkg/graphdb"
 )
 
 // migrateLegacySqliteLinks migrates sqlite links to use links from HostConfig
 // when sqlite links were used, hostConfig.Links was set to nil
 func (daemon *Daemon) migrateLegacySqliteLinks(db *graphdb.Database, container *container.Container) error {
 	// if links is populated (or an empty slice), then this isn't using sqlite links and can be skipped
 	if container.HostConfig == nil || container.HostConfig.Links != nil {
 		return nil
 	}
 
 	logrus.Debugf("migrating legacy sqlite link info for container: %s", container.ID)
 
 	fullName := container.Name
 	if fullName[0] != '/' {
 		fullName = "/" + fullName
 	}
 
 	// don't use a nil slice, this ensures that the check above will skip once the migration has completed
 	links := []string{}
 	children, err := db.Children(fullName, 0)
 	if err != nil {
 		if !strings.Contains(err.Error(), "Cannot find child for") {
 			return err
 		}
 		// else continue... it's ok if we didn't find any children, it'll just be nil and we can continue the migration
 	}
 
 	for _, child := range children {
 		c, err := daemon.GetContainer(child.Entity.ID())
 		if err != nil {
 			return err
 		}
 
 		links = append(links, c.Name+":"+child.Edge.Name)
 	}
 
 	container.HostConfig.Links = links
 	return container.WriteHostConfig()
 }
 
 // sqliteMigration performs the link graph DB migration.
 func (daemon *Daemon) sqliteMigration(containers map[string]*container.Container) error {
 	// migrate any legacy links from sqlite
 	linkdbFile := filepath.Join(daemon.root, "linkgraph.db")
 	var (
 		legacyLinkDB *graphdb.Database
 		err          error
 	)
 
 	legacyLinkDB, err = graphdb.NewSqliteConn(linkdbFile)
 	if err != nil {
 		return fmt.Errorf("error connecting to legacy link graph DB %s, container links may be lost: %v", linkdbFile, err)
 	}
 	defer legacyLinkDB.Close()
 
 	for _, c := range containers {
 		if err := daemon.migrateLegacySqliteLinks(legacyLinkDB, c); err != nil {
 			return err
 		}
 	}
 	return nil
 }