@@ -5,7 +5,7 @@ use crate::base::keys;
55use crate :: base:: keys:: TaskState ;
66use crate :: base:: Broker ;
77use crate :: error:: { Error , Result } ;
8- use crate :: proto:: { ServerInfo , TaskMessage } ;
8+ use crate :: proto:: { ServerInfo , TaskMessage , WorkerInfo } ;
99use crate :: task:: { generate_task_id, Task , TaskInfo } ;
1010use async_trait:: async_trait;
1111use chrono:: { DateTime , Utc } ;
@@ -811,14 +811,23 @@ impl Broker for RedisBroker {
811811 }
812812
813813 /// 写入服务器状态 - Go: WriteServerState
814- async fn write_server_state ( & self , server_info : & ServerInfo , ttl : Duration ) -> Result < ( ) > {
814+ async fn write_server_state (
815+ & self ,
816+ server_info : & ServerInfo ,
817+ workers : Vec < WorkerInfo > ,
818+ ttl : Duration ,
819+ tenant : Option < & str > ,
820+ ) -> Result < ( ) > {
815821 let mut conn = self . get_async_connection ( ) . await ?;
816822
817823 // 使用 ServerInfo 中的信息构建键
818824 // Build keys using information from ServerInfo
819- let server_key =
820- keys:: server_info_key ( & server_info. host , server_info. pid , & server_info. server_id ) ;
821- let workers_key = keys:: workers_key ( & server_info. host , server_info. pid , & server_info. server_id ) ;
825+ let ( server_key, workers_key) = keys:: server_and_workers_keys (
826+ tenant,
827+ & server_info. host ,
828+ server_info. pid ,
829+ & server_info. server_id ,
830+ ) ;
822831
823832 // 计算过期时间戳
824833 // Calculate expiration timestamp
@@ -842,44 +851,44 @@ impl Broker for RedisBroker {
842851 // Use Lua script to atomically write server state
843852 let server_info_bytes = server_info. encode_to_vec ( ) ;
844853 let keys = vec ! [ server_key, workers_key] ;
845- let string_args = vec ! [ ttl. as_secs( ) . to_string( ) ] ;
846- let binary_args = vec ! [ server_info_bytes] ;
854+ let mut args = vec ! [
855+ RedisArg :: Int ( ttl. as_secs( ) as i64 ) ,
856+ RedisArg :: Bytes ( server_info_bytes) ,
857+ ] ;
847858
848859 // ARGV[1] = TTL in seconds
849860 // ARGV[2] = server info (encoded protobuf as binary)
850861 // ARGV[3+] = worker info (暂时为空,需要支持 WorkerInfo)
851862 // ARGV[3+] = worker info (currently empty, needs to support WorkerInfo)
852-
863+ for worker in workers {
864+ let worker_info = worker. encode_to_vec ( ) ;
865+ args. push ( RedisArg :: Str ( worker. task_id ) ) ;
866+ args. push ( RedisArg :: Bytes ( worker_info) ) ;
867+ }
853868 let _: String = self
854869 . script_manager
855- . eval_script_with_binary_args (
856- & mut conn,
857- "write_server_state" ,
858- & keys,
859- & string_args,
860- & binary_args,
861- )
870+ . eval_script ( & mut conn, "write_server_state" , & keys, & args)
862871 . await ?;
863872
864873 Ok ( ( ) )
865874 }
866875
867876 /// 清除服务器状态 - Go: ClearServerState
868- async fn clear_server_state ( & self , host : & str , pid : i32 , server_id : & str ) -> Result < ( ) > {
877+ async fn clear_server_state (
878+ & self ,
879+ host : & str ,
880+ pid : i32 ,
881+ server_id : & str ,
882+ tenant : Option < & str > ,
883+ ) -> Result < ( ) > {
869884 let mut conn = self . get_async_connection ( ) . await ?;
870885
871886 // 生成键
872887 // Generate keys
873- let server_key = keys:: server_info_key ( host, pid, server_id) ;
874- let workers_key = keys:: workers_key ( host, pid, server_id) ;
875-
876- // 构造完整的 server_id (hostname:pid:uuid 格式)
877- // Construct full server_id (hostname:pid:uuid format)
878- let full_server_id = format ! ( "{host}:{pid}:{server_id}" ) ;
879-
888+ let ( server_key, workers_key) = keys:: server_and_workers_keys ( tenant, host, pid, server_id) ;
880889 // 1. 从 AllServers ZSET 中删除服务器 (服务器跟踪)
881890 // Remove the server from AllServers ZSET (server tracking)
882- let _: ( ) = conn. zrem ( keys:: ALL_SERVERS , & full_server_id ) . await ?;
891+ let _: ( ) = conn. zrem ( keys:: ALL_SERVERS , & server_key ) . await ?;
883892
884893 // 2. 从 AllWorkers ZSET 中删除工作者键 (如果存在)
885894 // Remove the worker key from AllWorkers ZSET (if exists)
@@ -888,18 +897,9 @@ impl Broker for RedisBroker {
888897 // 3. 使用 Lua 脚本原子性地清除服务器状态
889898 // Use Lua script to atomically clear server state
890899 let keys = vec ! [ server_key, workers_key] ;
891- let string_args: Vec < String > = vec ! [ ] ;
892- let binary_args: Vec < Vec < u8 > > = vec ! [ ] ;
893-
894900 let _: String = self
895901 . script_manager
896- . eval_script_with_binary_args (
897- & mut conn,
898- "clear_server_state" ,
899- & keys,
900- & string_args,
901- & binary_args,
902- )
902+ . eval_script ( & mut conn, "clear_server_state" , & keys, & [ ] )
903903 . await ?;
904904
905905 Ok ( ( ) )
0 commit comments