// getUpdatesFromPeer receives node data from the peer // for which the peer has more latest information available func (g *GossiperImpl) getUpdatesFromPeer(conn types.MessageChannel) error { var newPeerData types.StoreDiff err := conn.RcvData(&newPeerData) if err != nil { log.Error("Error fetching the latest peer data", err) return err } g.Update(newPeerData) return nil }
func (g *GossiperImpl) handleGossip(peerId string, conn types.MessageChannel) { log.Debug(g.id, " Servicing gossip request") var peerMetaInfo types.StoreMetaInfo err := error(nil) g.updateSelfTs() // Get the info about the node data that the sender has err = conn.RcvData(&peerMetaInfo) log.Debug(g.id, " Got meta data: \n", peerMetaInfo) if err != nil { return } // 2. Compare with current data that this node has and get // the names of the nodes for which this node has stale info // as compared to the sender diffNew, selfNew := g.Diff(peerMetaInfo) log.Debug(g.id, " The diff is: diffNew: \n", diffNew, " \nselfNew:\n", selfNew) // Send this list to the peer, and get the latest data // for them err = conn.SendData(diffNew) if err != nil { log.Error("Error sending list of nodes to fetch: ", err) return } // get the data for nodes sent above from the peer err = g.getUpdatesFromPeer(conn) if err != nil { log.Error("Failed to get data for nodes from the peer: ", err) return } // Since you know which data is stale on the sender side, // send him the data for the updated nodes err = g.sendUpdatesToPeer(&selfNew, conn) if err != nil { return } log.Debug(g.id, " Finished Servicing gossip request") g.history.AddLatest(NewGossipSessionInfo(peerId, types.GD_PEER_TO_ME)) g.updateGossipTs() }