#23892·harbor

"扫描全部"会接管作业服务工作池,其他一切都需要排队。

作者: Vad1mo创建于 2026年9月10日更新于 2026年9月14日
标签needs/follow-up

现有的调整手段无法解决问题。gocraft/work 具有两个调整手段,Harbor 在 src/jobservice/worker/cworker/c_worker.go 中对其进行了配置(registerJob):

  • Prioritysrc/jobservice/job/priority.go):除 DEMO 和 SLACK 之外,每个作业类型的优先级均为 1000。优先级只改变了工作程序检查队列的顺序。它不保留任何容量。如果扫描队列是唯一非空队列,则无论权重如何,每个工作程序都会接收扫描作业。
  • MaxConcurrency(作业接口中的 MaxCurrency()):src/pkg/scan/job.go:99 返回 0,gocraft 将其视为无限。非零值是一个集群范围的 Redis 计数器,在达到上限时,获取脚本会转到下一个队列。这是第一个问题需要的行为。 这两个调整手段都关注作业名称。src/controller/scan/base_controller.go:975 中的 launchScanJob 为每个扫描设置了 Name: job.ImageScanJobVendorType,无论触发方式如何。Postgres 中,扫描所有子作业已经可区分(任务 vendor_type = SCAN_ALL,继承自执行),但 Redis 中却没有。因此,对 IMAGE_SCAN 设置上限同样严格地阻止了基于触发的扫描,优先级更改也无法区分两者。startScanAllbase_controller.go:459 起)在核心中作为一个 goroutine 运行,并以迭代器返回的速度提交每个对象。batchSize := 50 仅是数据库页面大小。

内容来源: goharbor/harbor