FIX Preserve lifecycle on result persistence failures - #2473
Open
Roman Lutz (romanlutz) wants to merge 3 commits into
Open
FIX Preserve lifecycle on result persistence failures#2473Roman Lutz (romanlutz) wants to merge 3 commits into
Roman Lutz (romanlutz) wants to merge 3 commits into
Conversation
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3772242b-0ee1-4ecd-a028-a38c91c17926
Persist completed attack results after teardown without making generic event observers fatal or creating duplicate error results. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 75013b84-0c8d-4ea4-9c4c-6c58381ac1a1
Comment on lines
+628
to
+641
| async def execute_with_context_async(self, *, context: AttackStrategyContextT) -> AttackStrategyResultT: | ||
| """ | ||
| Execute an attack and persist its completed result after teardown. | ||
|
|
||
| Args: | ||
| context (AttackStrategyContextT): The attack execution context. | ||
|
|
||
| Returns: | ||
| AttackStrategyResultT: The completed and persisted attack result. | ||
| """ | ||
| result = await super().execute_with_context_async(context=context) | ||
| self._default_event_handler._persist_result(result=result) | ||
| return result | ||
|
|
Contributor
There was a problem hiding this comment.
cp pointed out that this works if there's no error but if the attack & db write fail, the db error doesn't get saved.
so we'd need something like this:
try:
result = await super().execute_with_context_async(context=context)
except Exception as attack_error:
# build_error_result would use _on_error_async()
error_result = self._default_event_handler._build_error_result(
context=context,
error=attack_error.__cause__ or attack_error,
)
try:
self._default_event_handler._persist_result(result=error_result)
except Exception as database_error:
raise ExceptionGroup(
"Attack and result persistence failed",
[attack_error, database_error],
)
raise
self._default_event_handler._persist_result(result=result)
return result
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Attack result persistence previously ran in a best-effort event handler. If the database write failed, the exception was ignored and the caller could receive a completed result even though no durable record existed for reporting or resume.
This change keeps generic lifecycle observers best-effort, enriches results during
ON_POST_EXECUTE, and persists completed results only after teardown succeeds. Persistence failures now propagate without creating a misleading secondERRORresult, while genuine execution or teardown failures continue to persist one accurateERRORresult and preserve the original exception.N/A
Tests and Documentation
JupyText was not applicable because no documentation notebooks changed.