fix(rollback): resolve signal handler race condition by clearing context after execution (#1245)

- Fixed race condition in signal handler
- Cleared context after execution instead of before
- Improved rollback stability

Signed-off-by: Nitesh <nitesh@example.com>
Co-authored-by: Nitesh <nitesh@example.com>
Co-authored-by: Paige Patton <64206430+paigerube14@users.noreply.github.com>
This commit is contained in:
Nitesh Kumar
2026-04-30 08:14:55 -04:00
committed by GitHub
co-authored by Nitesh Paige Patton
parent 9d06239341
commit 95530dfe55
8 changed files with 26 additions and 7 deletions
+3
View File
@@ -1,3 +1,5 @@
#!/usr/bin/env python
#
# Copyright 2025 The Krkn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,6 +13,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
import datetime
+1
View File
@@ -11,6 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""krkn.resiliency package public interface."""
from .resiliency import Resiliency # noqa: F401
+3
View File
@@ -1,3 +1,5 @@
#!/usr/bin/env python
#
# Copyright 2025 The Krkn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,6 +13,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Resiliency evaluation orchestrator for Krkn chaos runs.
This module provides the `Resiliency` class which loads the canonical
+3
View File
@@ -1,3 +1,5 @@
#!/usr/bin/env python
#
# Copyright 2025 The Krkn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,6 +13,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
from typing import Dict, List, Tuple
+13 -7
View File
@@ -58,13 +58,19 @@ class SignalHandler:
logger.warning(f"Signal {signal_name} received without complete context, skipping rollback.")
return
# Clear the context for the next signal, as another signal may arrive before the rollback completes.
# This ensures that the rollback is performed only once.
cls._set_context(None, None, telemetry_ocp)
# Perform rollback
logger.info(f"Performing rollback for signal {signal_name} with run_uuid={run_uuid}, scenario_type={scenario_type}")
execute_rollback_version_files(telemetry_ocp, run_uuid, scenario_type)
# Prevent concurrent rollback execution with a lock
if not cls._signal_lock.acquire(blocking=False):
logger.warning(f"Signal {signal_name} received but rollback already in progress, skipping.")
return
try:
# Perform rollback
logger.info(f"Performing rollback for signal {signal_name} with run_uuid={run_uuid}, scenario_type={scenario_type}")
execute_rollback_version_files(telemetry_ocp, run_uuid, scenario_type)
finally:
# Always clear context and release lock after rollback completes or fails
cls._set_context(None, None, telemetry_ocp)
cls._signal_lock.release()
# Call original handler if it exists
if signum not in cls._original_handlers:
+1
View File
@@ -1,3 +1,4 @@
#!/usr/bin/env python
"""
Tests for krkn.prometheus.collector module.
+1
View File
@@ -1,3 +1,4 @@
#!/usr/bin/env python
"""
Tests for krkn.resiliency.resiliency module.
+1
View File
@@ -1,3 +1,4 @@
#!/usr/bin/env python
"""
Tests for krkn.resiliency.score module.