Fix the data model inconsistency that breaks daemon upgrade to 1.14-dev

Signed-off-by: Santhosh Manohar <santhosh@docker.com>
This commit is contained in:
Santhosh Manohar 2017-01-19 14:25:26 -08:00
parent b7d91af92e
commit 6f507f53e3
3 changed files with 36 additions and 11 deletions

View File

@ -72,8 +72,8 @@ const (
) )
type extDNSEntry struct { type extDNSEntry struct {
ipStr string IPStr string
hostLoopback bool HostLoopback bool
} }
// resolver implements the Resolver interface // resolver implements the Resolver interface
@ -413,15 +413,15 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
} else { } else {
for i := 0; i < maxExtDNS; i++ { for i := 0; i < maxExtDNS; i++ {
extDNS := &r.extDNSList[i] extDNS := &r.extDNSList[i]
if extDNS.ipStr == "" { if extDNS.IPStr == "" {
break break
} }
extConnect := func() { extConnect := func() {
addr := fmt.Sprintf("%s:%d", extDNS.ipStr, 53) addr := fmt.Sprintf("%s:%d", extDNS.IPStr, 53)
extConn, err = net.DialTimeout(proto, addr, extIOTimeout) extConn, err = net.DialTimeout(proto, addr, extIOTimeout)
} }
if extDNS.hostLoopback { if extDNS.HostLoopback {
extConnect() extConnect()
} else { } else {
execErr := r.backend.ExecFunc(extConnect) execErr := r.backend.ExecFunc(extConnect)
@ -435,7 +435,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
continue continue
} }
logrus.Debugf("Query %s[%d] from %s, forwarding to %s:%s", name, query.Question[0].Qtype, logrus.Debugf("Query %s[%d] from %s, forwarding to %s:%s", name, query.Question[0].Qtype,
extConn.LocalAddr().String(), proto, extDNS.ipStr) extConn.LocalAddr().String(), proto, extDNS.IPStr)
// Timeout has to be set for every IO operation. // Timeout has to be set for every IO operation.
extConn.SetDeadline(time.Now().Add(extIOTimeout)) extConn.SetDeadline(time.Now().Add(extIOTimeout))

View File

@ -174,8 +174,8 @@ func (sb *sandbox) setExternalResolvers(content []byte, addrType int, checkLoopb
hostLoopback = dns.IsIPv4Localhost(ip) hostLoopback = dns.IsIPv4Localhost(ip)
} }
sb.extDNS = append(sb.extDNS, extDNSEntry{ sb.extDNS = append(sb.extDNS, extDNSEntry{
ipStr: ip, IPStr: ip,
hostLoopback: hostLoopback, HostLoopback: hostLoopback,
}) })
} }
} }

View File

@ -27,7 +27,12 @@ type sbState struct {
dbExists bool dbExists bool
Eps []epState Eps []epState
EpPriority map[string]int EpPriority map[string]int
ExtDNS []extDNSEntry // external servers have to be persisted so that on restart of a live-restore
// enabled daemon we get the external servers for the running containers.
// We have two versions of ExtDNS to support upgrade & downgrade of the daemon
// between >=1.14 and <1.14 versions.
ExtDNS []string
ExtDNS2 []extDNSEntry
} }
func (sbs *sbState) Key() []string { func (sbs *sbState) Key() []string {
@ -114,8 +119,16 @@ func (sbs *sbState) CopyTo(o datastore.KVObject) error {
dstSbs.Eps = append(dstSbs.Eps, eps) dstSbs.Eps = append(dstSbs.Eps, eps)
} }
if len(sbs.ExtDNS2) > 0 {
for _, dns := range sbs.ExtDNS2 {
dstSbs.ExtDNS2 = append(dstSbs.ExtDNS2, dns)
dstSbs.ExtDNS = append(dstSbs.ExtDNS, dns.IPStr)
}
return nil
}
for _, dns := range sbs.ExtDNS { for _, dns := range sbs.ExtDNS {
dstSbs.ExtDNS = append(dstSbs.ExtDNS, dns) dstSbs.ExtDNS = append(dstSbs.ExtDNS, dns)
dstSbs.ExtDNS2 = append(dstSbs.ExtDNS2, extDNSEntry{IPStr: dns})
} }
return nil return nil
@ -131,7 +144,11 @@ func (sb *sandbox) storeUpdate() error {
ID: sb.id, ID: sb.id,
Cid: sb.containerID, Cid: sb.containerID,
EpPriority: sb.epPriority, EpPriority: sb.epPriority,
ExtDNS: sb.extDNS, ExtDNS2: sb.extDNS,
}
for _, ext := range sb.extDNS {
sbs.ExtDNS = append(sbs.ExtDNS, ext.IPStr)
} }
retry: retry:
@ -205,7 +222,15 @@ func (c *controller) sandboxCleanup(activeSandboxes map[string]interface{}) {
dbIndex: sbs.dbIndex, dbIndex: sbs.dbIndex,
isStub: true, isStub: true,
dbExists: true, dbExists: true,
extDNS: sbs.ExtDNS, }
// If we are restoring from a older version extDNSEntry won't have the
// HostLoopback field
if len(sbs.ExtDNS2) > 0 {
sb.extDNS = sbs.ExtDNS2
} else {
for _, dns := range sbs.ExtDNS {
sb.extDNS = append(sb.extDNS, extDNSEntry{IPStr: dns})
}
} }
msg := " for cleanup" msg := " for cleanup"