Skip to content

Handle SaltDeserializationError in grains cache loading#68674

Open
sheagcraig wants to merge 4 commits intosaltstack:masterfrom
sheagcraig:handle_grains_msgpack_exception
Open

Handle SaltDeserializationError in grains cache loading#68674
sheagcraig wants to merge 4 commits intosaltstack:masterfrom
sheagcraig:handle_grains_msgpack_exception

Conversation

@sheagcraig
Copy link
Contributor

@sheagcraig sheagcraig commented Feb 3, 2026

What does this PR do?

Fix for #68678

What issues does this PR fix or reference?

Fixes a bug where corrupted grains cache files cause unhandled
SaltDeserializationError exceptions.

When msgpack encounters corrupted cache data, it raises
msgpack.exceptions.ExtraData, which is wrapped in
SaltDeserializationError by salt.payload.load(). Previously,
_load_cached_grains() only caught OSError, allowing the
exception to propagate and cause CRITICAL errors.

This fix adds SaltDeserializationError to the exception handler,
treating corrupted cache the same as missing cache: return None,
regenerate grains, and overwrite the corrupted cache file.

Previous Behavior

Only OSError was handled, so the SaltDeserializationError would cause a CRITICAL failure.

New Behavior

If the grains cache is corrupt and won't deserialize, catch the exception and
return None, which is a signal to callers to refresh the grains.

Merge requirements satisfied?

[NOTICE] Bug fixes or features added to Salt require tests.

Commits signed with GPG?

Yes

Fix a bug where corrupted grains cache files cause unhandled
SaltDeserializationError exceptions.

When msgpack encounters corrupted cache data, it raises
msgpack.exceptions.ExtraData, which is wrapped in
SaltDeserializationError by salt.payload.load(). Previously,
_load_cached_grains() only caught OSError, allowing the
exception to propagate and cause CRITICAL errors.

This fix adds SaltDeserializationError to the exception handler,
treating corrupted cache the same as missing cache: return None,
regenerate grains, and overwrite the corrupted cache file.

Changes:
- Add SaltDeserializationError to imports in salt/loader/__init__.py
- Update exception handler in _load_cached_grains() to catch both
  OSError and SaltDeserializationError

Impact:
- Automatic recovery from corrupted grains cache
- No manual intervention required
- Fully backward compatible

Fixes: Issue with corrupted grains cache causing minion connection failures
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant