14
14
from ee .onyx .server .tenants .schema_management import create_schema_if_not_exists
15
15
from ee .onyx .server .tenants .schema_management import get_current_alembic_version
16
16
from onyx .background .celery .apps .app_base import task_logger
17
- from onyx .configs .app_configs import JOB_TIMEOUT
18
17
from onyx .configs .app_configs import TARGET_AVAILABLE_TENANTS
19
- from onyx .configs .constants import OnyxCeleryPriority
18
+ from onyx .configs .constants import ONYX_CLOUD_TENANT_ID
20
19
from onyx .configs .constants import OnyxCeleryQueues
21
20
from onyx .configs .constants import OnyxCeleryTask
22
21
from onyx .configs .constants import OnyxRedisLocks
39
38
name = OnyxCeleryTask .CLOUD_CHECK_AVAILABLE_TENANTS ,
40
39
queue = OnyxCeleryQueues .MONITORING ,
41
40
ignore_result = True ,
42
- soft_time_limit = JOB_TIMEOUT ,
41
+ soft_time_limit = _TENANT_PROVISIONING_SOFT_TIME_LIMIT ,
42
+ time_limit = _TENANT_PROVISIONING_TIME_LIMIT ,
43
43
trail = False ,
44
44
bind = True ,
45
45
)
@@ -55,7 +55,7 @@ def check_available_tenants(self: Task) -> None:
55
55
)
56
56
return
57
57
58
- r = get_redis_client ()
58
+ r = get_redis_client (tenant_id = ONYX_CLOUD_TENANT_ID )
59
59
lock_check : RedisLock = r .lock (
60
60
OnyxRedisLocks .CHECK_AVAILABLE_TENANTS_LOCK ,
61
61
timeout = _TENANT_PROVISIONING_SOFT_TIME_LIMIT ,
@@ -71,32 +71,28 @@ def check_available_tenants(self: Task) -> None:
71
71
try :
72
72
# Get the current count of available tenants
73
73
with get_session_with_shared_schema () as db_session :
74
- available_tenants_count = db_session .query (AvailableTenant ).count ()
74
+ num_available_tenants = db_session .query (AvailableTenant ).count ()
75
75
76
76
# Get the target number of available tenants
77
- target_available_tenants = getattr (
77
+ num_minimum_available_tenants = getattr (
78
78
TARGET_AVAILABLE_TENANTS , "value" , DEFAULT_TARGET_AVAILABLE_TENANTS
79
79
)
80
80
81
81
# Calculate how many new tenants we need to provision
82
- tenants_to_provision = max (
83
- 0 , target_available_tenants - available_tenants_count
84
- )
82
+ if num_available_tenants < num_minimum_available_tenants :
83
+ tenants_to_provision = num_minimum_available_tenants - num_available_tenants
84
+ else :
85
+ tenants_to_provision = 0
85
86
86
87
task_logger .info (
87
- f"Available tenants: { available_tenants_count } , "
88
- f"Target: { target_available_tenants } , "
88
+ f"Available tenants: { num_available_tenants } , "
89
+ f"Target minimum available tenants : { num_minimum_available_tenants } , "
89
90
f"To provision: { tenants_to_provision } "
90
91
)
91
92
92
- # Trigger pre-provisioning tasks for each tenant needed
93
- for _ in range (tenants_to_provision ):
94
- from celery import current_app
95
-
96
- current_app .send_task (
97
- OnyxCeleryTask .PRE_PROVISION_TENANT ,
98
- priority = OnyxCeleryPriority .LOW ,
99
- )
93
+ # just provision one tenant each time we run this ... increase if needed.
94
+ if tenants_to_provision > 0 :
95
+ pre_provision_tenant ()
100
96
101
97
except Exception :
102
98
task_logger .exception ("Error in check_available_tenants task" )
@@ -105,15 +101,7 @@ def check_available_tenants(self: Task) -> None:
105
101
lock_check .release ()
106
102
107
103
108
- @shared_task (
109
- name = OnyxCeleryTask .PRE_PROVISION_TENANT ,
110
- ignore_result = True ,
111
- soft_time_limit = _TENANT_PROVISIONING_SOFT_TIME_LIMIT ,
112
- time_limit = _TENANT_PROVISIONING_TIME_LIMIT ,
113
- queue = OnyxCeleryQueues .MONITORING ,
114
- bind = True ,
115
- )
116
- def pre_provision_tenant (self : Task ) -> None :
104
+ def pre_provision_tenant () -> None :
117
105
"""
118
106
Pre-provision a new tenant and store it in the NewAvailableTenant table.
119
107
This function fully sets up the tenant with all necessary configurations,
@@ -122,7 +110,7 @@ def pre_provision_tenant(self: Task) -> None:
122
110
# The MULTI_TENANT check is now done at the caller level (check_available_tenants)
123
111
# rather than inside this function
124
112
125
- r = get_redis_client ()
113
+ r = get_redis_client (tenant_id = ONYX_CLOUD_TENANT_ID )
126
114
lock_provision : RedisLock = r .lock (
127
115
OnyxRedisLocks .PRE_PROVISION_TENANT_LOCK ,
128
116
timeout = _TENANT_PROVISIONING_SOFT_TIME_LIMIT ,
0 commit comments