[Bug]: Scheduled returns scan all accepted minion keys causing extreme load

オープン 初心者向け
#70,789 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 3 日以内に返信

@nepeat がすでに取り組んでいます。

2026年11月13日 から。

  • #70790 @nepeat による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
76/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
backend

調査の方向性

issue に記載されたスタックをたどり、salt.utils.job._store_job と local_cache.save_load 内の最初の save_load 呼び出しを読む。単独またはスケジュール実行の minion の戻り値に関する既存のテストを確認し、応答した minion の ID を渡すことで、ターゲットのメタデータとキャッシュの構成を維持しながら、受け入れ済みキーの走査を避けられることを検証する。

索引モデルが issue の本文から書いたものです。

説明

bug needs-triage
What happened?

After upgrading a Salt master from 3006.28 to 3008.5, MWorker processes on the master overloaded causing master issues.

The master has approximately > 100K+ accepted minion keys and 128 MWorkers. It uses ZeroMQ, master_job_cache: local_cache, keys.cache_driver: localfs_key, and key_cache: sched. Async MWorkers are
disabled. PKI and the master cache are on local SSD-backed ZFS.

A three-second strace sample of one worker showed 58,821 lstat calls, accounting for 99.96% of its syscall time. Python stack samples from three separate MWorkers showed the same path:

AESFuncs._sync_return
→ salt.utils.job.store_job
→ salt.utils.job._store_job
→ local_cache.save_load
→ CkMinions.check_minions
→ CkMinions._check_glob_minions
→ Key.glob_match
→ Key.list_keys
→ localfs_key.list_all
→ clean_path
→ realpath / lstat

For a standalone or scheduled minion return with jid: req, _store_job sets:

load["tgt_type"] = "glob"
load["tgt"] = load["id"]

It then calls save_load without a precomputed minion list. local_cache.save_load resolves the returning minion’s ID as a glob, causing enumeration and path validation across the entire accepted-key inventory.

Expected behavior: caching a standalone return should not require discovering its target across all accepted minion keys. Passing minions=[load["id"]] to the initial save_load call avoids this lookup while preserving existing target metadata and cache layout.

Type of salt install

Official deb

Major version

3008.x

What supported OS are you seeing the problem on? Can select multiple. (If bug appears on an unsupported OS, please open a GitHub Discussion instead)

debian-12

salt --versions-report output
Salt Version:
          Salt: 3008.5

Python Version:
        Python: 3.14.7 (main, Sep 30 2026, 03:35:11) [GCC 11.2.0]

Dependency Versions:
          cffi: 2.0.0
      cherrypy: 18.10.0
  cryptography: 50.0.1
      dateutil: 2.9.0.post0
     docker-py: Not Installed
         gitdb: 4.0.12
     gitpython: 3.2.0
        Jinja2: 3.1.6
       libgit2: 1.9.7
  looseversion: 1.3.0
      M2Crypto: Not Installed
          Mako: Not Installed
       msgpack: 1.2.1
  msgpack-pure: Not Installed
  mysql-python: Not Installed
     packaging: 24.0
     pycparser: 3.00
      pycrypto: Not Installed
  pycryptodome: 3.23.0
        pygit2: 1.20.1
  python-gnupg: 0.5.6
        PyYAML: 6.0.3
         PyZMQ: 27.1.0
        relenv: 0.22.27
         smmap: 5.0.2
       timelib: 0.3.0
       Tornado: 6.5.10
           ZMQ: 4.3.5

Salt Package Information:
  Package Type: onedir

System Versions:
          dist: debian 12.15 bookworm
        locale: utf-8
       machine: x86_64
       release: [REDACTED]
        system: Linux
       version: Debian GNU/Linux 12.15 bookworm
主要言語
Python
スター
15.8k
フォーク
5.6k
平均マージ
5日 9時間
マージ済み PR(30日)
99

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

saltstack/salt のほかの issue

saltstack/salt の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。