Fix parallel state execution with Salt-SSH

This commit is contained in:
jeanluc 2024-05-14 10:37:39 +02:00 committed by Daniel Wozniak
parent d7446d9a32
commit 14edbcf19c
2 changed files with 20 additions and 2 deletions

1
changelog/66514.fixed.md Normal file
View file

@ -0,0 +1 @@
Fixed parallel state execution with Salt-SSH

View file

@ -39,6 +39,7 @@ import salt.utils.event
import salt.utils.files import salt.utils.files
import salt.utils.hashutils import salt.utils.hashutils
import salt.utils.immutabletypes as immutabletypes import salt.utils.immutabletypes as immutabletypes
import salt.utils.jid
import salt.utils.msgpack import salt.utils.msgpack
import salt.utils.platform import salt.utils.platform
import salt.utils.process import salt.utils.process
@ -757,7 +758,21 @@ class State:
loader="states", loader="states",
initial_pillar=None, initial_pillar=None,
file_client=None, file_client=None,
__invocation_id=None,
): ):
"""
When instantiating an object of this class, do not pass
``__invocation_id``. It is an internal field for tracking
parallel executions where no jid is available (Salt-SSH) and
only exposed as an init argument to work on spawning platforms.
"""
if jid is not None:
__invocation_id = jid
if __invocation_id is None:
# For salt-ssh parallel states, we need a unique identifier
# for a single execution. self.jid should not be set there
# since it's used for other purposes as well.
__invocation_id = salt.utils.jid.gen_jid(opts)
self._init_kwargs = { self._init_kwargs = {
"opts": opts, "opts": opts,
"pillar_override": pillar_override, "pillar_override": pillar_override,
@ -768,6 +783,7 @@ class State:
"mocked": mocked, "mocked": mocked,
"loader": loader, "loader": loader,
"initial_pillar": initial_pillar, "initial_pillar": initial_pillar,
"__invocation_id": __invocation_id,
} }
self.states_loader = loader self.states_loader = loader
if "grains" not in opts: if "grains" not in opts:
@ -814,6 +830,7 @@ class State:
self.pre = {} self.pre = {}
self.__run_num = 0 self.__run_num = 0
self.jid = jid self.jid = jid
self.invocation_id = __invocation_id
self.instance_id = str(id(self)) self.instance_id = str(id(self))
self.inject_globals = {} self.inject_globals = {}
self.mocked = mocked self.mocked = mocked
@ -2237,7 +2254,7 @@ class State:
] ]
) )
troot = os.path.join(instance.opts["cachedir"], instance.jid) troot = os.path.join(instance.opts["cachedir"], instance.invocation_id)
tfile = os.path.join(troot, salt.utils.hashutils.sha1_digest(tag)) tfile = os.path.join(troot, salt.utils.hashutils.sha1_digest(tag))
if not os.path.isdir(troot): if not os.path.isdir(troot):
try: try:
@ -2821,7 +2838,7 @@ class State:
if not proc.is_alive(): if not proc.is_alive():
ret_cache = os.path.join( ret_cache = os.path.join(
self.opts["cachedir"], self.opts["cachedir"],
self.jid, self.invocation_id,
salt.utils.hashutils.sha1_digest(tag), salt.utils.hashutils.sha1_digest(tag),
) )
if not os.path.isfile(ret_cache): if not os.path.isfile(ret_cache):