From: Matt Joiner <anacrolix@gmail.com>
Date: Tue, 3 May 2016 04:59:54 +0000 (+1000)
Subject: Rework handling of metadata data messages
X-Git-Tag: v1.0.0~757
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=d47ba4a08fb5b8c3ed921b89da744a7fd621e068;p=btrtrc.git

Rework handling of metadata data messages

There are some dubious logs probably resulting from poor ordering of some code for handling incoming metadata data messages.
---

diff --git a/client.go b/client.go
index fd5aeabe..4f2e87ad 100644
--- a/client.go
+++ b/client.go
@@ -1006,7 +1006,15 @@ func (cl *Client) requestPendingMetadata(t *Torrent, c *connection) {
 	}
 }
 
-func (cl *Client) completedMetadata(t *Torrent) {
+func (t *Torrent) maybeMetadataCompleted() {
+	if t.haveInfo() {
+		// Nothing to do.
+		return
+	}
+	if !t.haveAllMetadataPieces() {
+		// Don't have enough metadata pieces.
+		return
+	}
 	h := sha1.New()
 	h.Write(t.metadataBytes)
 	var ih metainfo.Hash
@@ -1025,13 +1033,13 @@ func (cl *Client) completedMetadata(t *Torrent) {
 	}
 	// TODO(anacrolix): If this fails, I think something harsher should be
 	// done.
-	err = cl.setMetaData(t, &info, t.metadataBytes)
+	err = t.cl.setMetaData(t, &info, t.metadataBytes)
 	if err != nil {
 		log.Printf("error setting metadata: %s", err)
 		t.invalidateMetadata()
 		return
 	}
-	if cl.config.Debug {
+	if t.cl.config.Debug {
 		log.Printf("%s: got metadata from peers", t)
 	}
 }
@@ -1052,26 +1060,20 @@ func (cl *Client) gotMetadataExtensionMsg(payload []byte, t *Torrent, c *connect
 	piece := d["piece"]
 	switch msgType {
 	case pp.DataMetadataExtensionMsgType:
-		if t.haveInfo() {
-			break
+		if !c.requestedMetadataPiece(piece) {
+			err = fmt.Errorf("got unexpected piece %d", piece)
+			return
 		}
+		c.metadataRequests[piece] = false
 		begin := len(payload) - metadataPieceSize(d["total_size"], piece)
 		if begin < 0 || begin >= len(payload) {
-			log.Printf("got bad metadata piece")
-			break
-		}
-		if !c.requestedMetadataPiece(piece) {
-			log.Printf("got unexpected metadata piece %d", piece)
-			break
+			err = fmt.Errorf("data has bad offset in payload: %d", begin)
+			return
 		}
-		c.metadataRequests[piece] = false
 		t.saveMetadataPiece(piece, payload[begin:])
 		c.UsefulChunksReceived++
 		c.lastUsefulChunkReceived = time.Now()
-		if !t.haveAllMetadataPieces() {
-			break
-		}
-		cl.completedMetadata(t)
+		t.maybeMetadataCompleted()
 	case pp.RequestMetadataExtensionMsgType:
 		if !t.haveMetadataPiece(piece) {
 			c.Post(t.newMetadataExtensionMessage(c, pp.RejectMetadataExtensionMsgType, d["piece"], nil))