| 
									
										
										
										
											2024-10-25 13:57:03 +08:00
										 |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import click | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import app | 
					
						
							|  |  |  | from configs import dify_config | 
					
						
							|  |  |  | from core.rag.datasource.vdb.tidb_on_qdrant.tidb_service import TidbService | 
					
						
							| 
									
										
										
										
											2025-05-12 13:52:33 +08:00
										 |  |  | from extensions.ext_database import db | 
					
						
							| 
									
										
										
										
											2024-10-25 13:57:03 +08:00
										 |  |  | from models.dataset import TidbAuthBinding | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @app.celery.task(queue="dataset") | 
					
						
							|  |  |  | def update_tidb_serverless_status_task(): | 
					
						
							|  |  |  |     click.echo(click.style("Update tidb serverless status task.", fg="green")) | 
					
						
							|  |  |  |     start_at = time.perf_counter() | 
					
						
							| 
									
										
										
										
											2024-11-27 17:41:00 +08:00
										 |  |  |     try: | 
					
						
							|  |  |  |         # check the number of idle tidb serverless | 
					
						
							| 
									
										
										
										
											2025-05-12 13:52:33 +08:00
										 |  |  |         tidb_serverless_list = ( | 
					
						
							|  |  |  |             db.session.query(TidbAuthBinding) | 
					
						
							|  |  |  |             .filter(TidbAuthBinding.active == False, TidbAuthBinding.status == "CREATING") | 
					
						
							|  |  |  |             .all() | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-11-27 17:41:00 +08:00
										 |  |  |         if len(tidb_serverless_list) == 0: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         # update tidb serverless status | 
					
						
							|  |  |  |         update_clusters(tidb_serverless_list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         click.echo(click.style(f"Error: {e}", fg="red")) | 
					
						
							| 
									
										
										
										
											2024-10-25 13:57:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     end_at = time.perf_counter() | 
					
						
							|  |  |  |     click.echo( | 
					
						
							|  |  |  |         click.style("Update tidb serverless status task success latency: {}".format(end_at - start_at), fg="green") | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def update_clusters(tidb_serverless_list: list[TidbAuthBinding]): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         # batch 20 | 
					
						
							|  |  |  |         for i in range(0, len(tidb_serverless_list), 20): | 
					
						
							|  |  |  |             items = tidb_serverless_list[i : i + 20] | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |             # TODO: maybe we can set the default value for the following parameters in the config file | 
					
						
							| 
									
										
										
										
											2024-10-25 13:57:03 +08:00
										 |  |  |             TidbService.batch_update_tidb_serverless_cluster_status( | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                 tidb_serverless_list=items, | 
					
						
							|  |  |  |                 project_id=dify_config.TIDB_PROJECT_ID or "", | 
					
						
							|  |  |  |                 api_url=dify_config.TIDB_API_URL or "", | 
					
						
							|  |  |  |                 iam_url=dify_config.TIDB_IAM_API_URL or "", | 
					
						
							|  |  |  |                 public_key=dify_config.TIDB_PUBLIC_KEY or "", | 
					
						
							|  |  |  |                 private_key=dify_config.TIDB_PRIVATE_KEY or "", | 
					
						
							| 
									
										
										
										
											2024-10-25 13:57:03 +08:00
										 |  |  |             ) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         click.echo(click.style(f"Error: {e}", fg="red")) |