1919from backend .constants import IP_PORT_DIVIDER
2020from backend .db_meta .enums import ClusterEntryType , ClusterType , InstanceRole
2121from backend .db_meta .enums .comm import SystemTagEnum
22- from backend .db_meta .models import AppCache , Cluster , ClusterEntry , DBModule , Machine , ProxyInstance , StorageInstance
22+ from backend .db_meta .models import (
23+ AppCache ,
24+ Cluster ,
25+ ClusterEntry ,
26+ DBModule ,
27+ Machine ,
28+ ProxyInstance ,
29+ StorageInstance ,
30+ StorageInstanceTuple ,
31+ )
2332from backend .db_services .dbbase .instances .handlers import InstanceHandler
2433from backend .db_services .dbbase .resources .query_base import (
2534 build_q_for_domain_by_cluster ,
@@ -457,10 +466,20 @@ def _filter_cluster_hook(
457466 if count == 0 :
458467 return ResourceList (count = 0 , data = [])
459468
469+ storage_instance_queryset = StorageInstance .objects .prefetch_related (
470+ Prefetch (
471+ "as_ejector" ,
472+ queryset = StorageInstanceTuple .objects .filter (
473+ ejector__in = storage_queryset .values_list ("id" , flat = True )
474+ ),
475+ to_attr = "instance_tuples" ,
476+ )
477+ )
460478 # 预取proxy_queryset,storage_queryset,clusterentry_set,加块查询效率
461- cluster_queryset = cluster_queryset [offset : limit + offset ].prefetch_related (
479+ cluster_list = cluster_queryset [offset : limit + offset ].prefetch_related (
462480 Prefetch ("proxyinstance_set" , queryset = proxy_queryset .select_related ("machine" ), to_attr = "proxies" ),
463481 Prefetch ("storageinstance_set" , queryset = storage_queryset .select_related ("machine" ), to_attr = "storages" ),
482+ Prefetch ("storageinstance_set" , queryset = storage_instance_queryset , to_attr = "storage_instances" ),
464483 Prefetch ("nosqlstoragesetdtl_set" , to_attr = "storage_set_dtl" ),
465484 Prefetch ("clusterentry_set" , to_attr = "entries" ),
466485 "tag_set" ,
@@ -487,7 +506,7 @@ def _filter_cluster_hook(
487506
488507 # 将集群的查询结果序列化为集群字典信息
489508 clusters : List [Dict [str , Any ]] = []
490- for cluster in cluster_queryset :
509+ for cluster in cluster_list :
491510 cluster_info = cls ._to_cluster_representation (
492511 cluster = cluster ,
493512 cluster_entry = [
@@ -534,13 +553,29 @@ def _to_cluster_representation(
534553 (storage_set_dtl .seg_range , f"{ storage_set_dtl .instance .machine .ip } :{ storage_set_dtl .instance .port } " )
535554 for storage_set_dtl in cluster .storage_set_dtl
536555 ]
556+
537557 machine_map = {}
538558 for group_name , machine_ip_port in machine_list :
539559 if not machine_map .get (group_name ):
540560 machine_map [group_name ] = [machine_ip_port ]
541561 else :
542562 machine_map [group_name ].append (machine_ip_port )
543563
564+ master_slave_map = {}
565+ for instance in cluster .storage_instances :
566+ for instance_tuple in instance .instance_tuples :
567+ key = f"{ instance .machine .ip } :{ instance .port } "
568+ item = f"{ instance_tuple .receiver .machine .ip } :{ instance_tuple .receiver .port } "
569+ if not master_slave_map .get (key ):
570+ master_slave_map [key ] = [item ]
571+ else :
572+ master_slave_map [key ].append (item )
573+
574+ for k , v in master_slave_map .items ():
575+ for group_name , ip_port_list in machine_map .items ():
576+ if k in ip_port_list :
577+ machine_map [group_name ].extend (v )
578+
544579 return {
545580 "id" : cluster .id ,
546581 "phase" : cluster .phase ,
0 commit comments