@@ -39,12 +39,13 @@ import (
39
39
commonv1 "d7y.io/api/v2/pkg/apis/common/v1"
40
40
commonv2 "d7y.io/api/v2/pkg/apis/common/v2"
41
41
dfdaemonv2 "d7y.io/api/v2/pkg/apis/dfdaemon/v2"
42
- managerv2 "d7y.io/api/v2/pkg/apis/manager/v2"
43
42
44
43
logger "d7y.io/dragonfly/v2/internal/dflog"
45
44
internaljob "d7y.io/dragonfly/v2/internal/job"
46
45
managertypes "d7y.io/dragonfly/v2/manager/types"
46
+ "d7y.io/dragonfly/v2/pkg/dfnet"
47
47
"d7y.io/dragonfly/v2/pkg/idgen"
48
+ cndsystemclient "d7y.io/dragonfly/v2/pkg/rpc/cdnsystem/client"
48
49
dfdaemonclient "d7y.io/dragonfly/v2/pkg/rpc/dfdaemon/client"
49
50
"d7y.io/dragonfly/v2/scheduler/config"
50
51
resource "d7y.io/dragonfly/v2/scheduler/resource/standard"
@@ -79,10 +80,11 @@ type job struct {
79
80
localJob * internaljob.Job
80
81
resource resource.Resource
81
82
config * config.Config
83
+ dialOptions []grpc.DialOption
82
84
}
83
85
84
86
// New creates a new Job.
85
- func New (cfg * config.Config , resource resource.Resource ) (Job , error ) {
87
+ func New (cfg * config.Config , resource resource.Resource , dialOptions ... grpc. DialOption ) (Job , error ) {
86
88
redisConfig := & internaljob.Config {
87
89
Addrs : cfg .Database .Redis .Addrs ,
88
90
MasterName : cfg .Database .Redis .MasterName ,
@@ -127,6 +129,7 @@ func New(cfg *config.Config, resource resource.Resource) (Job, error) {
127
129
localJob : localJob ,
128
130
resource : resource ,
129
131
config : cfg ,
132
+ dialOptions : dialOptions ,
130
133
}
131
134
132
135
namedJobFuncs := map [string ]any {
@@ -241,11 +244,6 @@ func (j *job) PreheatSingleSeedPeer(ctx context.Context, req *internaljob.Prehea
241
244
return nil , fmt .Errorf ("cluster %d scheduler %s has disabled seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
242
245
}
243
246
244
- // If scheduler has no available seed peer, return error.
245
- if len (j .resource .SeedPeer ().Client ().Addrs ()) == 0 {
246
- return nil , fmt .Errorf ("cluster %d scheduler %s has no available seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
247
- }
248
-
249
247
// Preheat by v2 grpc protocol. If seed peer does not support
250
248
// v2 protocol, preheat by v1 grpc protocol.
251
249
resp , err := j .preheatV2SingleSeedPeer (ctx , req , log )
@@ -275,8 +273,22 @@ func (j *job) preheatV1SingleSeedPeer(ctx context.Context, req *internaljob.Preh
275
273
Priority : commonv1 .Priority (req .Priority ),
276
274
}
277
275
276
+ selectedSeedPeer , err := j .resource .SeedPeer ().SelectSeedPeer (ctx , taskID )
277
+ if err != nil {
278
+ return nil , err
279
+ }
280
+
281
+ log .Infof ("[preheat]: selected seed peer %s" , selectedSeedPeer )
282
+
283
+ // TODO(chlins): reuse the client if we encounter the performance issue in future.
284
+ client , err := cndsystemclient .GetClientByAddr (ctx , dfnet.NetAddr {Type : dfnet .TCP , Addr : selectedSeedPeer }, j .dialOptions ... )
285
+ if err != nil {
286
+ return nil , err
287
+ }
288
+ defer client .Close ()
289
+
278
290
// Trigger seed peer download seeds.
279
- stream , err := j . resource . SeedPeer (). Client () .ObtainSeeds (ctx , & cdnsystemv1.SeedRequest {
291
+ stream , err := client .ObtainSeeds (ctx , & cdnsystemv1.SeedRequest {
280
292
TaskId : taskID ,
281
293
Url : req .URL ,
282
294
UrlMeta : urlMeta ,
@@ -343,7 +355,22 @@ func (j *job) preheatV2SingleSeedPeerByURL(ctx context.Context, url string, req
343
355
filteredQueryParams := idgen .ParseFilteredQueryParams (req .FilteredQueryParams )
344
356
taskID := idgen .TaskIDV2ByURLBased (url , req .PieceLength , req .Tag , req .Application , filteredQueryParams )
345
357
advertiseIP := j .config .Server .AdvertiseIP .String ()
346
- stream , err := j .resource .SeedPeer ().Client ().DownloadTask (ctx , taskID , & dfdaemonv2.DownloadTaskRequest {
358
+
359
+ selectedSeedPeer , err := j .resource .SeedPeer ().SelectSeedPeer (ctx , taskID )
360
+ if err != nil {
361
+ return nil , err
362
+ }
363
+
364
+ log .Infof ("[preheat]: selected seed peer %s" , selectedSeedPeer )
365
+
366
+ // TODO(chlins): reuse the client if we encounter the performance issue in future.
367
+ client , err := dfdaemonclient .GetV2ByAddr (ctx , selectedSeedPeer , j .dialOptions ... )
368
+ if err != nil {
369
+ return nil , err
370
+ }
371
+ defer client .Close ()
372
+
373
+ stream , err := client .DownloadTask (ctx , taskID , & dfdaemonv2.DownloadTaskRequest {
347
374
Download : & commonv2.Download {
348
375
Url : url ,
349
376
PieceLength : req .PieceLength ,
@@ -410,7 +437,7 @@ func (j *job) PreheatAllSeedPeers(ctx context.Context, req *internaljob.PreheatR
410
437
for _ , seedPeer := range seedPeers {
411
438
var (
412
439
hostname = seedPeer .Hostname
413
- ip = seedPeer .Ip
440
+ ip = seedPeer .IP
414
441
port = seedPeer .Port
415
442
)
416
443
@@ -554,20 +581,20 @@ func (j *job) PreheatAllSeedPeers(ctx context.Context, req *internaljob.PreheatR
554
581
// 2. Count: If count is provided, selects up to the specified number of seed peers. If count exceeds the number of available seed peers, all seed peers are selected.
555
582
// 3. Percentage: If percentage is provided, selects a proportional number of seed peers (rounded down). Ensures at least one seed peer is selected if percentage > 0.
556
583
// Priority: IPs > Count > Percentage
557
- func (j * job ) selectSeedPeers (ips []string , count * uint32 , percentage * uint32 , log * logger.SugaredLoggerOnWith ) ([]* managerv2. SeedPeer , error ) {
584
+ func (j * job ) selectSeedPeers (ips []string , count * uint32 , percentage * uint32 , log * logger.SugaredLoggerOnWith ) ([]* resource. Host , error ) {
558
585
if ! j .config .SeedPeer .Enable {
559
586
return nil , fmt .Errorf ("cluster %d scheduler %s has disabled seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
560
587
}
561
588
562
- seedPeers := j .resource .SeedPeer ().Client (). SeedPeers ()
589
+ seedPeers := j .resource .HostManager ().LoadAllSeeds ()
563
590
if len (seedPeers ) == 0 {
564
591
return nil , fmt .Errorf ("cluster %d scheduler %s has no available seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
565
592
}
566
593
567
594
if len (ips ) > 0 {
568
- selectedSeedPeers := make ([]* managerv2. SeedPeer , 0 , len (ips ))
595
+ selectedSeedPeers := make ([]* resource. Host , 0 , len (ips ))
569
596
for _ , seedPeer := range seedPeers {
570
- if slices .Contains (ips , seedPeer .Ip ) {
597
+ if slices .Contains (ips , seedPeer .IP ) {
571
598
selectedSeedPeers = append (selectedSeedPeers , seedPeer )
572
599
continue
573
600
}
0 commit comments