code: func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode SyncMode) error {
  	err := d.synchronise(id, head, td, mode)
  	switch err {
  	case nil:
  	case errBusy:
  
  	case errTimeout, errBadPeer, errStallingPeer, errUnsyncedPeer,
  		errEmptyHeaderSet, errPeersUnavailable, errTooOld,
  		errInvalidAncestor, errInvalidChain:
  		log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err)
  		if d.dropPeer == nil {
  			// The dropPeer method is nil when `--copydb` is used for a local copy.
  			// Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored
  			log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", id)
  		} else {
  			d.dropPeer(id)
  		}
  	default:
  		log.Warn("Synchronisation failed, retrying", "err", err)
  	}
  	return err
  }
docs: // Synchronise tries to sync up our local block chain with a remote peer, both
  // adding various sanity checks as well as wrapping it with various log entries.