goharbor/harbor · error
[tencent-tcr.FetchArtifacts.listImages] runner=
Error message
[tencent-tcr.FetchArtifacts.listImages] runner=%d repo=%s, error=%v
What it means
Returned inside a concurrent FetchArtifacts task in the Tencent TCR adapter when the getImages API call for one repository fails. It wraps the error with the runner task index and repository name, so the failing repo is identifiable; the cause is a TCR DescribeImages API failure (throttling, auth, or network).
Solutions
- Inspect the wrapped error for the TCR API failure
- Check Tencent Cloud credentials and TCR read permissions
- Watch for API rate limiting (tcrQPSLimit) and reduce concurrency if throttled
- Retry the replication job for transient failures
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at src/pkg/reg/adapter/tencentcr/artifact_registry.go:100 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16).
Data as JSON: /api/errors/9693d03348d3b727.
Report an issue: GitHub.
Appendix: source
Thrown at src/pkg/reg/adapter/tencentcr/artifact_registry.go:100
}
repos, _ = filter.DoFilterRepositories(repositories, filters)
log.Debugf("[tencent-tcr.FetchArtifacts] filteredRepos=%d", len(repos))
// 4. list images
var rawResources = make([]*model.Resource, len(repos))
runner := utils.NewLimitedConcurrentRunner(tcrQPSLimit)
for i, r := range repos {
// !copy
index := i
repo := r
runner.AddTask(func() error {
var images []string
repoArr := strings.Split(repo.Name, "/")
_, images, err = a.getImages(repoArr[0], strings.Join(repoArr[1:], "/"), "")
if err != nil {
return fmt.Errorf("[tencent-tcr.FetchArtifacts.listImages] runner=%d repo=%s, error=%v", index, repo.Name, err)
}
var filteredImages []string
if tagsPattern != "" {
for _, image := range images {
var ok bool
ok, err = util.Match(tagsPattern, image)
if err != nil {
return fmt.Errorf("[tencent-tcr.FetchArtifacts.matchImage] image='%s', error=%v", image, err)
}
if ok {
filteredImages = append(filteredImages, image)
}
}
} else {
filteredImages = images
}
View on GitHub (pinned to 7b2fd08cc5)