@@ -34,6 +34,7 @@ import (
3434 p2pDown "github.com/dragonflyoss/Dragonfly/dfget/core/downloader/p2p_downloader"
3535 "github.com/dragonflyoss/Dragonfly/dfget/core/regist"
3636 "github.com/dragonflyoss/Dragonfly/dfget/core/uploader"
37+ "github.com/dragonflyoss/Dragonfly/dfget/locator"
3738 "github.com/dragonflyoss/Dragonfly/pkg/algorithm"
3839 "github.com/dragonflyoss/Dragonfly/pkg/constants"
3940 "github.com/dragonflyoss/Dragonfly/pkg/errortypes"
@@ -50,32 +51,33 @@ import (
5051// Start function creates a new task and starts it to download file.
5152func Start (cfg * config.Config ) * errortypes.DfError {
5253 var (
53- supernodeAPI = api .NewSupernodeAPI ()
54- register = regist .NewSupernodeRegister (cfg , supernodeAPI )
55- err error
56- result * regist.RegisterResult
54+ supernodeAPI = api .NewSupernodeAPI ()
55+ supernodeLocator = locator .CreateLocator (cfg )
56+ register = regist .NewSupernodeRegister (cfg , supernodeAPI , supernodeLocator )
57+ err error
58+ result * regist.RegisterResult
5759 )
5860
5961 printer .Println (fmt .Sprintf ("--%s-- %s" ,
6062 cfg .StartTime .Format (config .DefaultTimestampFormat ), cfg .URL ))
6163
62- if err = prepare (cfg ); err != nil {
64+ if err = prepare (cfg , supernodeLocator ); err != nil {
6365 return errortypes .New (config .CodePrepareError , err .Error ())
6466 }
6567
66- if result , err = registerToSuperNode (cfg , register ); err != nil {
68+ if result , err = registerToSuperNode (cfg , register , supernodeLocator ); err != nil {
6769 return errortypes .New (config .CodeRegisterError , err .Error ())
6870 }
6971
70- if err = downloadFile (cfg , supernodeAPI , register , result ); err != nil {
72+ if err = downloadFile (cfg , supernodeAPI , supernodeLocator , register , result ); err != nil {
7173 return errortypes .New (config .CodeDownloadError , err .Error ())
7274 }
7375
7476 return nil
7577}
7678
7779// prepare the RV-related information and create the corresponding files.
78- func prepare (cfg * config.Config ) (err error ) {
80+ func prepare (cfg * config.Config , locator locator. SupernodeLocator ) (err error ) {
7981 printer .Printf ("dfget version:%s" , version .DFGetVersion )
8082 printer .Printf ("workspace:%s" , cfg .WorkHome )
8183 printer .Printf ("sign:%s" , cfg .Sign )
@@ -104,9 +106,8 @@ func prepare(cfg *config.Config) (err error) {
104106 }
105107 rv .DataDir = cfg .RV .SystemDataDir
106108
107- cfg .Nodes = adjustSupernodeList (cfg .Nodes )
108109 if stringutils .IsEmptyStr (rv .LocalIP ) {
109- rv .LocalIP = checkConnectSupernode (cfg . Nodes )
110+ rv .LocalIP = checkConnectSupernode (locator )
110111 }
111112 rv .Cid = getCid (rv .LocalIP , cfg .Sign )
112113 rv .TaskFileName = getTaskFileName (rv .RealTarget , cfg .Sign )
@@ -124,7 +125,7 @@ func launchPeerServer(cfg *config.Config) error {
124125 return err
125126}
126127
127- func registerToSuperNode (cfg * config.Config , register regist.SupernodeRegister ) (
128+ func registerToSuperNode (cfg * config.Config , register regist.SupernodeRegister , supernodeLocator locator. SupernodeLocator ) (
128129 * regist.RegisterResult , error ) {
129130 defer func () {
130131 if r := recover (); r != nil {
@@ -137,7 +138,7 @@ func registerToSuperNode(cfg *config.Config, register regist.SupernodeRegister)
137138 panic ("user specified" )
138139 }
139140
140- if len ( cfg . Nodes ) == 0 {
141+ if supernodeLocator == nil || supernodeLocator . Size ( ) == 0 {
141142 cfg .BackSourceReason = config .BackSourceReasonNodeEmpty
142143 panic ("supernode empty" )
143144 }
@@ -162,7 +163,7 @@ func registerToSuperNode(cfg *config.Config, register regist.SupernodeRegister)
162163 return result , nil
163164}
164165
165- func downloadFile (cfg * config.Config , supernodeAPI api.SupernodeAPI ,
166+ func downloadFile (cfg * config.Config , supernodeAPI api.SupernodeAPI , locator locator. SupernodeLocator ,
166167 register regist.SupernodeRegister , result * regist.RegisterResult ) error {
167168 timeout := calculateTimeout (cfg )
168169
@@ -180,7 +181,7 @@ func downloadFile(cfg *config.Config, supernodeAPI api.SupernodeAPI,
180181 downloadTime := time .Since (cfg .StartTime ).Seconds ()
181182 // upload metrics to supernode only if pattern is p2p or cdn and result is not nil
182183 if cfg .Pattern != config .PatternSource && result != nil {
183- reportMetrics (cfg , supernodeAPI , downloadTime , result .TaskID , success )
184+ reportMetrics (cfg , supernodeAPI , locator , downloadTime , result .TaskID , success )
184185 }
185186
186187 if success {
@@ -285,21 +286,26 @@ func adjustSupernodeList(nodes []string) []string {
285286 }
286287}
287288
288- func checkConnectSupernode (nodes [] string ) (localIP string ) {
289+ func checkConnectSupernode (locator locator. SupernodeLocator ) (localIP string ) {
289290 var (
290291 e error
291292 )
292- for _ , n := range nodes {
293- ip , port := netutils .GetIPAndPortFromNode (n , config .DefaultSupernodePort )
294- if localIP , e = httputils .CheckConnect (ip , port , 1000 ); e == nil {
295- return localIP
293+ if locator == nil {
294+ return ""
295+ }
296+ for _ , group := range locator .All () {
297+ for _ , n := range group .Nodes {
298+ if localIP , e = httputils .CheckConnect (n .IP , n .Port , 1000 ); e == nil {
299+ return localIP
300+ }
301+ logrus .Errorf ("Connect to node:%s error: %v" , n , e )
296302 }
297- logrus .Errorf ("Connect to node:%s error: %v" , n , e )
298303 }
299304 return ""
300305}
301306
302- func reportMetrics (cfg * config.Config , supernodeAPI api.SupernodeAPI , downloadTime float64 , taskID string , success bool ) {
307+ func reportMetrics (cfg * config.Config , supernodeAPI api.SupernodeAPI , locator locator.SupernodeLocator ,
308+ downloadTime float64 , taskID string , success bool ) {
303309 req := & types.TaskMetricsRequest {
304310 BacksourceReason : strconv .Itoa (cfg .BackSourceReason ),
305311 IP : cfg .RV .LocalIP ,
@@ -311,10 +317,16 @@ func reportMetrics(cfg *config.Config, supernodeAPI api.SupernodeAPI, downloadTi
311317 Success : success ,
312318 TaskID : taskID ,
313319 }
314- for _ , node := range cfg .Nodes {
315- resp , err := supernodeAPI .ReportMetrics (node , req )
320+ node := locator .Get ()
321+ if node == nil {
322+ return
323+ }
324+ nodeStr := node .String ()
325+ // retry twice
326+ for i := 0 ; i < 2 ; i ++ {
327+ resp , err := supernodeAPI .ReportMetrics (nodeStr , req )
316328 if err != nil {
317- logrus .Errorf ("failed to report metrics to supernode %s: %v" , node , err )
329+ logrus .Errorf ("failed to report metrics to supernode %s: %v" , nodeStr , err )
318330 }
319331 if resp != nil && resp .IsSuccess () {
320332 return
0 commit comments