Skip to content

Commit c5e98b7

Browse files
UN-2930 [FIX] Add thread-safety to FlaskPluginManager singleton
- Add threading.Lock at class level to protect singleton instance - Guard instance creation and state mutations with lock - Prevent race conditions in multi-threaded Flask environments - Ensure thread-safe initialization of app, plugins_dir, and plugins_pkg 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 5bfaa3d commit c5e98b7

File tree

1 file changed

+22
-18
lines changed
  • unstract/core/src/unstract/core/flask

1 file changed

+22
-18
lines changed

unstract/core/src/unstract/core/flask/plugin.py

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
integration.
66
"""
77

8+
import threading
89
from pathlib import Path
910
from typing import Any
1011

@@ -21,6 +22,7 @@ class FlaskPluginManager:
2122
"""
2223

2324
_instance = None
25+
_lock = threading.Lock()
2426

2527
def __new__(
2628
cls,
@@ -38,24 +40,26 @@ def __new__(
3840
Returns:
3941
FlaskPluginManager singleton instance
4042
"""
41-
if cls._instance is None:
42-
cls._instance = super().__new__(cls)
43-
cls._instance._initialized = False
44-
45-
# Update app if provided
46-
if app:
47-
cls._instance.app = app
48-
49-
# Initialize or update plugin manager if parameters change
50-
if plugins_dir and plugins_pkg and hasattr(cls._instance, "app"):
51-
if (
52-
not cls._instance._initialized
53-
or cls._instance._plugins_dir != plugins_dir
54-
or cls._instance._plugins_pkg != plugins_pkg
55-
):
56-
cls._instance._plugins_dir = plugins_dir
57-
cls._instance._plugins_pkg = plugins_pkg
58-
cls._instance._init_manager()
43+
with cls._lock:
44+
# Check inside lock to handle race condition
45+
if cls._instance is None:
46+
cls._instance = super().__new__(cls)
47+
cls._instance._initialized = False
48+
49+
# Update app if provided
50+
if app:
51+
cls._instance.app = app
52+
53+
# Initialize or update plugin manager if parameters change
54+
if plugins_dir and plugins_pkg and hasattr(cls._instance, "app"):
55+
if (
56+
not cls._instance._initialized
57+
or cls._instance._plugins_dir != plugins_dir
58+
or cls._instance._plugins_pkg != plugins_pkg
59+
):
60+
cls._instance._plugins_dir = plugins_dir
61+
cls._instance._plugins_pkg = plugins_pkg
62+
cls._instance._init_manager()
5963

6064
return cls._instance
6165

0 commit comments

Comments
 (0)