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() }
// sendUpdatesToPeer sends the information about the given // nodes to the peer func (g *GossiperImpl) sendUpdatesToPeer(diff *types.StoreNodes, conn types.MessageChannel) error { dataToSend := g.Subset(*diff) return conn.SendData(&dataToSend) }
// sendNodeMetaInfo sends a list of meta info for all // the nodes in the nodes's store to the peer func (g *GossiperImpl) sendNodeMetaInfo(conn types.MessageChannel) error { msg := g.MetaInfo() err := conn.SendData(&msg) return err }