in build-index/tagserver/server.go [421:451]
func (s *Server) replicateTag(tag string, d core.Digest, deps core.DigestList) error {
destinations := s.remotes.Match(tag)
if len(destinations) == 0 {
return nil
}
for _, dest := range destinations {
task := tagreplication.NewTask(tag, d, deps, dest, 0)
if err := s.tagReplicationManager.Add(task); err != nil {
return handler.Errorf("add replicate task: %s", err)
}
}
neighbors := s.neighbors.Resolve()
var delay time.Duration
var successes int
for addr := range neighbors { // Loops in random order.
delay += s.config.DuplicateReplicateStagger
client := s.provider.Provide(addr)
if err := client.DuplicateReplicate(tag, d, deps, delay); err != nil {
log.Errorf("Error duplicating replicate task to %s: %s", addr, err)
} else {
successes++
}
}
if len(neighbors) != 0 && successes == 0 {
s.stats.Counter("duplicate_replicate_failures").Inc(1)
}
return nil
}