@@ -40,12 +40,13 @@ import (
40
40
commonv1 "d7y.io/api/v2/pkg/apis/common/v1"
41
41
commonv2 "d7y.io/api/v2/pkg/apis/common/v2"
42
42
dfdaemonv2 "d7y.io/api/v2/pkg/apis/dfdaemon/v2"
43
- managerv2 "d7y.io/api/v2/pkg/apis/manager/v2"
44
43
45
44
logger "d7y.io/dragonfly/v2/internal/dflog"
46
45
internaljob "d7y.io/dragonfly/v2/internal/job"
47
46
managertypes "d7y.io/dragonfly/v2/manager/types"
47
+ "d7y.io/dragonfly/v2/pkg/dfnet"
48
48
"d7y.io/dragonfly/v2/pkg/idgen"
49
+ cndsystemclient "d7y.io/dragonfly/v2/pkg/rpc/cdnsystem/client"
49
50
dfdaemonclient "d7y.io/dragonfly/v2/pkg/rpc/dfdaemon/client"
50
51
"d7y.io/dragonfly/v2/scheduler/config"
51
52
resource "d7y.io/dragonfly/v2/scheduler/resource/standard"
@@ -63,10 +64,11 @@ type job struct {
63
64
localJob * internaljob.Job
64
65
resource resource.Resource
65
66
config * config.Config
67
+ dialOptions []grpc.DialOption
66
68
}
67
69
68
70
// New creates a new Job.
69
- func New (cfg * config.Config , resource resource.Resource ) (Job , error ) {
71
+ func New (cfg * config.Config , resource resource.Resource , dialOptions ... grpc. DialOption ) (Job , error ) {
70
72
redisConfig := & internaljob.Config {
71
73
Addrs : cfg .Database .Redis .Addrs ,
72
74
MasterName : cfg .Database .Redis .MasterName ,
@@ -111,6 +113,7 @@ func New(cfg *config.Config, resource resource.Resource) (Job, error) {
111
113
localJob : localJob ,
112
114
resource : resource ,
113
115
config : cfg ,
116
+ dialOptions : dialOptions ,
114
117
}
115
118
116
119
namedJobFuncs := map [string ]any {
@@ -230,8 +233,8 @@ func (j *job) preheatSingleSeedPeer(ctx context.Context, req *internaljob.Prehea
230
233
}
231
234
232
235
// If scheduler has no available seed peer, return error.
233
- if len ( j .resource .SeedPeer ().Client (). Addrs ()) == 0 {
234
- return nil , fmt .Errorf ("cluster %d scheduler %s has no available seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
236
+ if _ , err := j .resource .SeedPeer ().SelectSeedPeer ( ctx , req . TaskUUID ); err != nil {
237
+ return nil , fmt .Errorf ("cluster %d scheduler %s has no available seed peer: %w " , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP , err )
235
238
}
236
239
237
240
// Preheat by v2 grpc protocol. If seed peer does not support
@@ -262,8 +265,20 @@ func (j *job) preheatV1SingleSeedPeer(ctx context.Context, req *internaljob.Preh
262
265
Priority : commonv1 .Priority (req .Priority ),
263
266
}
264
267
268
+ selectedSeedPeer , err := j .resource .SeedPeer ().SelectSeedPeer (ctx , taskID )
269
+ if err != nil {
270
+ return nil , err
271
+ }
272
+
273
+ // TODO: reuse the client if we encounter the performance issue in future.
274
+ client , err := cndsystemclient .GetClientByAddr (ctx , dfnet.NetAddr {Type : dfnet .TCP , Addr : fmt .Sprintf ("%s:%d" , selectedSeedPeer .IP , selectedSeedPeer .Port )}, j .dialOptions ... )
275
+ if err != nil {
276
+ return nil , err
277
+ }
278
+ defer client .Close ()
279
+
265
280
// Trigger seed peer download seeds.
266
- stream , err := j . resource . SeedPeer (). Client () .ObtainSeeds (ctx , & cdnsystemv1.SeedRequest {
281
+ stream , err := client .ObtainSeeds (ctx , & cdnsystemv1.SeedRequest {
267
282
TaskId : taskID ,
268
283
Url : req .URL ,
269
284
UrlMeta : urlMeta ,
@@ -330,7 +345,20 @@ func (j *job) preheatV2SingleSeedPeerByURL(ctx context.Context, url string, req
330
345
taskID := idgen .TaskIDV2ByURLBased (url , req .PieceLength , req .Tag , req .Application , strings .Split (req .FilteredQueryParams , idgen .FilteredQueryParamsSeparator ))
331
346
filteredQueryParams := strings .Split (req .FilteredQueryParams , idgen .FilteredQueryParamsSeparator )
332
347
advertiseIP := j .config .Server .AdvertiseIP .String ()
333
- stream , err := j .resource .SeedPeer ().Client ().DownloadTask (ctx , taskID , & dfdaemonv2.DownloadTaskRequest {
348
+
349
+ selectedSeedPeer , err := j .resource .SeedPeer ().SelectSeedPeer (ctx , taskID )
350
+ if err != nil {
351
+ return nil , err
352
+ }
353
+
354
+ // TODO: reuse the client if we encounter the performance issue in future.
355
+ client , err := dfdaemonclient .GetV2ByAddr (ctx , fmt .Sprintf ("%s:%d" , selectedSeedPeer .IP , selectedSeedPeer .Port ), j .dialOptions ... )
356
+ if err != nil {
357
+ return nil , err
358
+ }
359
+ defer client .Close ()
360
+
361
+ stream , err := client .DownloadTask (ctx , taskID , & dfdaemonv2.DownloadTaskRequest {
334
362
Download : & commonv2.Download {
335
363
Url : url ,
336
364
PieceLength : req .PieceLength ,
@@ -398,7 +426,7 @@ func (j *job) preheatAllSeedPeers(ctx context.Context, req *internaljob.PreheatR
398
426
for _ , seedPeer := range seedPeers {
399
427
var (
400
428
hostname = seedPeer .Hostname
401
- ip = seedPeer .Ip
429
+ ip = seedPeer .IP
402
430
port = seedPeer .Port
403
431
)
404
432
@@ -542,20 +570,20 @@ func (j *job) preheatAllSeedPeers(ctx context.Context, req *internaljob.PreheatR
542
570
// 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.
543
571
// 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.
544
572
// Priority: IPs > Count > Percentage
545
- func (j * job ) selectSeedPeers (ips []string , count * uint32 , percentage * uint8 , log * logger.SugaredLoggerOnWith ) ([]* managerv2. SeedPeer , error ) {
573
+ func (j * job ) selectSeedPeers (ips []string , count * uint32 , percentage * uint8 , log * logger.SugaredLoggerOnWith ) ([]* resource. Host , error ) {
546
574
if ! j .config .SeedPeer .Enable {
547
575
return nil , fmt .Errorf ("cluster %d scheduler %s has disabled seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
548
576
}
549
577
550
- seedPeers := j .resource .SeedPeer ().Client (). SeedPeers ()
578
+ seedPeers := j .resource .HostManager ().LoadAllNonNormals ()
551
579
if len (seedPeers ) == 0 {
552
580
return nil , fmt .Errorf ("cluster %d scheduler %s has no available seed peer" , j .config .Manager .SchedulerClusterID , j .config .Server .AdvertiseIP )
553
581
}
554
582
555
583
if len (ips ) > 0 {
556
- selectedSeedPeers := make ([]* managerv2. SeedPeer , 0 , len (ips ))
584
+ selectedSeedPeers := make ([]* resource. Host , 0 , len (ips ))
557
585
for _ , seedPeer := range seedPeers {
558
- if slices .Contains (ips , seedPeer .Ip ) {
586
+ if slices .Contains (ips , seedPeer .IP ) {
559
587
selectedSeedPeers = append (selectedSeedPeers , seedPeer )
560
588
continue
561
589
}
0 commit comments