Jelajahi Sumber

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

Signed-off-by: Santhosh Manohar <santhosh@docker.com>
Santhosh Manohar 8 tahun lalu
induk
melakukan
6f507f53e3
3 mengubah file dengan 36 tambahan dan 11 penghapusan
  1. 6 6
      libnetwork/resolver.go
  2. 2 2
      libnetwork/sandbox_dns_unix.go
  3. 28 3
      libnetwork/sandbox_store.go

+ 6 - 6
libnetwork/resolver.go

@@ -72,8 +72,8 @@ const (
 )
 
 type extDNSEntry struct {
-	ipStr        string
-	hostLoopback bool
+	IPStr        string
+	HostLoopback bool
 }
 
 // resolver implements the Resolver interface
@@ -413,15 +413,15 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
 	} else {
 		for i := 0; i < maxExtDNS; i++ {
 			extDNS := &r.extDNSList[i]
-			if extDNS.ipStr == "" {
+			if extDNS.IPStr == "" {
 				break
 			}
 			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)
 			}
 
-			if extDNS.hostLoopback {
+			if extDNS.HostLoopback {
 				extConnect()
 			} else {
 				execErr := r.backend.ExecFunc(extConnect)
@@ -435,7 +435,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
 				continue
 			}
 			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.
 			extConn.SetDeadline(time.Now().Add(extIOTimeout))

+ 2 - 2
libnetwork/sandbox_dns_unix.go

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

+ 28 - 3
libnetwork/sandbox_store.go

@@ -27,7 +27,12 @@ type sbState struct {
 	dbExists   bool
 	Eps        []epState
 	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 {
@@ -114,8 +119,16 @@ func (sbs *sbState) CopyTo(o datastore.KVObject) error {
 		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 {
 		dstSbs.ExtDNS = append(dstSbs.ExtDNS, dns)
+		dstSbs.ExtDNS2 = append(dstSbs.ExtDNS2, extDNSEntry{IPStr: dns})
 	}
 
 	return nil
@@ -131,7 +144,11 @@ func (sb *sandbox) storeUpdate() error {
 		ID:         sb.id,
 		Cid:        sb.containerID,
 		EpPriority: sb.epPriority,
-		ExtDNS:     sb.extDNS,
+		ExtDNS2:    sb.extDNS,
+	}
+
+	for _, ext := range sb.extDNS {
+		sbs.ExtDNS = append(sbs.ExtDNS, ext.IPStr)
 	}
 
 retry:
@@ -205,7 +222,15 @@ func (c *controller) sandboxCleanup(activeSandboxes map[string]interface{}) {
 			dbIndex:            sbs.dbIndex,
 			isStub:             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"