3
3
import traceback
4
4
from typing import Any , List , Optional , cast
5
5
6
+ import schedule
6
7
from fastapi import HTTPException
7
8
8
9
from dbgpt .component import SystemApp
@@ -56,7 +57,10 @@ def init_app(self, system_app: SystemApp) -> None:
56
57
self ._dao = self ._dao or ServeDao (self ._serve_config )
57
58
self ._system_app = system_app
58
59
self ._dbgpts_loader = system_app .get_component (
59
- DBGPTsLoader .name , DBGPTsLoader , or_register_component = DBGPTsLoader
60
+ DBGPTsLoader .name ,
61
+ DBGPTsLoader ,
62
+ or_register_component = DBGPTsLoader ,
63
+ load_dbgpts_interval = self ._serve_config .load_dbgpts_interval ,
60
64
)
61
65
62
66
def before_start (self ):
@@ -68,7 +72,10 @@ def before_start(self):
68
72
def after_start (self ):
69
73
"""Execute after the application starts"""
70
74
self .load_dag_from_db ()
71
- self .load_dag_from_dbgpts ()
75
+ self .load_dag_from_dbgpts (is_first_load = True )
76
+ schedule .every (self ._serve_config .load_dbgpts_interval ).seconds .do (
77
+ self .load_dag_from_dbgpts
78
+ )
72
79
73
80
@property
74
81
def dao (self ) -> BaseDao [ServeEntity , ServeRequest , ServerResponse ]:
@@ -126,6 +133,7 @@ def create_and_save_dag(
126
133
if save_failed_flow :
127
134
request .state = State .LOAD_FAILED
128
135
request .error_message = str (e )
136
+ request .dag_id = ""
129
137
return self .dao .create (request )
130
138
else :
131
139
raise e
@@ -147,6 +155,7 @@ def create_and_save_dag(
147
155
if save_failed_flow :
148
156
request .state = State .LOAD_FAILED
149
157
request .error_message = f"Register DAG error: { str (e )} "
158
+ request .dag_id = ""
150
159
self .dao .update ({"uid" : request .uid }, request )
151
160
else :
152
161
# Rollback
@@ -198,7 +207,7 @@ def _pre_load_dag_from_dbgpts(self):
198
207
f"dbgpts error: { str (e )} "
199
208
)
200
209
201
- def load_dag_from_dbgpts (self ):
210
+ def load_dag_from_dbgpts (self , is_first_load : bool = False ):
202
211
"""Load DAG from dbgpts"""
203
212
flows = self .dbgpts_loader .get_flows ()
204
213
for flow in flows :
@@ -208,7 +217,7 @@ def load_dag_from_dbgpts(self):
208
217
exist_inst = self .get ({"name" : flow .name })
209
218
if not exist_inst :
210
219
self .create_and_save_dag (flow , save_failed_flow = True )
211
- else :
220
+ elif is_first_load or exist_inst . state != State . RUNNING :
212
221
# TODO check version, must be greater than the exist one
213
222
flow .uid = exist_inst .uid
214
223
self .update_flow (flow , check_editable = False , save_failed_flow = True )
@@ -242,6 +251,7 @@ def update_flow(
242
251
if save_failed_flow :
243
252
request .state = State .LOAD_FAILED
244
253
request .error_message = str (e )
254
+ request .dag_id = ""
245
255
return self .dao .update ({"uid" : request .uid }, request )
246
256
else :
247
257
raise e
@@ -306,12 +316,13 @@ def delete(self, uid: str) -> Optional[ServerResponse]:
306
316
inst = self .get (query_request )
307
317
if inst is None :
308
318
raise HTTPException (status_code = 404 , detail = f"Flow { uid } not found" )
309
- if not inst .dag_id :
319
+ if inst . state == State . RUNNING and not inst .dag_id :
310
320
raise HTTPException (
311
- status_code = 404 , detail = f"Flow { uid } 's dag id not found"
321
+ status_code = 404 , detail = f"Running flow { uid } 's dag id not found"
312
322
)
313
323
try :
314
- self .dag_manager .unregister_dag (inst .dag_id )
324
+ if inst .dag_id :
325
+ self .dag_manager .unregister_dag (inst .dag_id )
315
326
except Exception as e :
316
327
logger .warning (f"Unregister DAG({ inst .dag_id } ) error: { str (e )} " )
317
328
self .dao .delete (query_request )
0 commit comments