in build-index/tagserver/server.go [389:419]
func (s *Server) putTag(tag string, d core.Digest, deps core.DigestList) error {
for _, dep := range deps {
if _, err := s.localOriginClient.Stat(tag, dep); err == blobclient.ErrBlobNotFound {
return handler.Errorf("cannot upload tag, missing dependency %s", dep)
} else if err != nil {
return handler.Errorf("check blob: %s", err)
}
}
if err := s.store.Put(tag, d, 0); err != nil {
return handler.Errorf("storage: %s", err)
}
neighbors := s.neighbors.Resolve()
var delay time.Duration
var successes int
for addr := range neighbors {
delay += s.config.DuplicatePutStagger
client := s.provider.Provide(addr)
if err := client.DuplicatePut(tag, d, delay); err != nil {
log.Errorf("Error duplicating put task to %s: %s", addr, err)
} else {
successes++
}
}
if len(neighbors) != 0 && successes == 0 {
s.stats.Counter("duplicate_put_failures").Inc(1)
}
return nil
}