@@ -283,76 +283,95 @@ func NewEpochFromConfig(
283
283
var localCarReader * carv2.Reader
284
284
var remoteCarReader ReaderAtCloser
285
285
var err error
286
- if config .IsSplitCarMode () {
286
+ if config .IsCarFromPieces () {
287
287
288
288
metadata , err := splitcarfetcher .MetadataFromYaml (string (config .Data .Car .FromPieces .Metadata .URI ))
289
289
if err != nil {
290
290
return nil , fmt .Errorf ("failed to read pieces metadata: %w" , err )
291
291
}
292
292
293
- dealRegistry , err := splitcarfetcher .DealsFromCSV (string (config .Data .Car .FromPieces .Deals .URI ))
294
- if err != nil {
295
- return nil , fmt .Errorf ("failed to read deals: %w" , err )
296
- }
293
+ isFromDeals := ! config .Data .Car .FromPieces .Deals .URI .IsZero ()
297
294
298
- lotusAPIAddress := "https://api.node.glif.io"
299
- cl := jsonrpc .NewClient (lotusAPIAddress )
300
- dm := splitcarfetcher .NewMinerInfo (
301
- cl ,
302
- 5 * time .Minute ,
303
- 5 * time .Second ,
304
- )
295
+ if isFromDeals {
296
+ dealRegistry , err := splitcarfetcher .DealsFromCSV (string (config .Data .Car .FromPieces .Deals .URI ))
297
+ if err != nil {
298
+ return nil , fmt .Errorf ("failed to read deals: %w" , err )
299
+ }
305
300
306
- scr , err := splitcarfetcher .NewSplitCarReader (metadata .CarPieces ,
307
- func (piece carlet.CarFile ) (splitcarfetcher.ReaderAtCloserSize , error ) {
308
- minerID , ok := dealRegistry .GetMinerByPieceCID (piece .CommP )
309
- if ! ok {
310
- return nil , fmt .Errorf ("failed to find miner for piece CID %s" , piece .CommP )
311
- }
312
- klog .Infof ("piece CID %s is stored on miner %s" , piece .CommP , minerID )
313
- minerInfo , err := dm .GetProviderInfo (c .Context , minerID )
314
- if err != nil {
315
- return nil , fmt .Errorf ("failed to get miner info for miner %s, for piece %s: %w" , minerID , piece .CommP , err )
316
- }
317
- if len (minerInfo .Multiaddrs ) == 0 {
318
- return nil , fmt .Errorf ("miner %s has no multiaddrs" , minerID )
319
- }
320
- spew .Dump (minerInfo )
321
- // extract the IP address from the multiaddr:
322
- split := multiaddr .Split (minerInfo .Multiaddrs [0 ])
323
- if len (split ) < 2 {
324
- return nil , fmt .Errorf ("invalid multiaddr: %s" , minerInfo .Multiaddrs [0 ])
325
- }
326
- component0 := split [0 ].(* multiaddr.Component )
327
- component1 := split [1 ].(* multiaddr.Component )
328
-
329
- var ip string
330
- var port string
331
-
332
- if component0 .Protocol ().Code == multiaddr .P_IP4 {
333
- ip = component0 .Value ()
334
- port = component1 .Value ()
335
- } else if component1 .Protocol ().Code == multiaddr .P_IP4 {
336
- ip = component1 .Value ()
337
- port = component0 .Value ()
338
- } else {
339
- return nil , fmt .Errorf ("invalid multiaddr: %s" , minerInfo .Multiaddrs [0 ])
340
- }
341
- // reset the port to 80:
342
- // TODO: use the appropriate port (80, better if 443 with TLS)
343
- port = "80"
344
- minerIP := fmt .Sprintf ("%s:%s" , ip , port )
345
- klog .Infof ("piece CID %s is stored on miner %s (%s)" , piece .CommP , minerID , minerIP )
346
- formattedURL := fmt .Sprintf ("http://%s/piece/%s" , minerIP , piece .CommP .String ())
347
- return splitcarfetcher .NewRemoteFileSplitCarReader (
348
- piece .CommP .String (),
349
- formattedURL ,
350
- )
351
- })
352
- if err != nil {
353
- return nil , fmt .Errorf ("failed to open CAR file from pieces: %w" , err )
301
+ lotusAPIAddress := "https://api.node.glif.io"
302
+ cl := jsonrpc .NewClient (lotusAPIAddress )
303
+ dm := splitcarfetcher .NewMinerInfo (
304
+ cl ,
305
+ 5 * time .Minute ,
306
+ 5 * time .Second ,
307
+ )
308
+
309
+ scr , err := splitcarfetcher .NewSplitCarReader (
310
+ metadata .CarPieces ,
311
+ func (piece carlet.CarFile ) (splitcarfetcher.ReaderAtCloserSize , error ) {
312
+ minerID , ok := dealRegistry .GetMinerByPieceCID (piece .CommP )
313
+ if ! ok {
314
+ return nil , fmt .Errorf ("failed to find miner for piece CID %s" , piece .CommP )
315
+ }
316
+ klog .Infof ("piece CID %s is stored on miner %s" , piece .CommP , minerID )
317
+ minerInfo , err := dm .GetProviderInfo (c .Context , minerID )
318
+ if err != nil {
319
+ return nil , fmt .Errorf ("failed to get miner info for miner %s, for piece %s: %w" , minerID , piece .CommP , err )
320
+ }
321
+ if len (minerInfo .Multiaddrs ) == 0 {
322
+ return nil , fmt .Errorf ("miner %s has no multiaddrs" , minerID )
323
+ }
324
+ spew .Dump (minerInfo )
325
+ // extract the IP address from the multiaddr:
326
+ split := multiaddr .Split (minerInfo .Multiaddrs [0 ])
327
+ if len (split ) < 2 {
328
+ return nil , fmt .Errorf ("invalid multiaddr: %s" , minerInfo .Multiaddrs [0 ])
329
+ }
330
+ component0 := split [0 ].(* multiaddr.Component )
331
+ component1 := split [1 ].(* multiaddr.Component )
332
+
333
+ var ip string
334
+ // TODO: use the appropriate port (80, better if 443 with TLS)
335
+ port := "80"
336
+
337
+ if component0 .Protocol ().Code == multiaddr .P_IP4 {
338
+ ip = component0 .Value ()
339
+ } else if component1 .Protocol ().Code == multiaddr .P_IP4 {
340
+ ip = component1 .Value ()
341
+ } else {
342
+ return nil , fmt .Errorf ("invalid multiaddr: %s" , minerInfo .Multiaddrs [0 ])
343
+ }
344
+ minerIP := fmt .Sprintf ("%s:%s" , ip , port )
345
+ klog .Infof ("piece CID %s is stored on miner %s (%s)" , piece .CommP , minerID , minerIP )
346
+ formattedURL := fmt .Sprintf ("http://%s/piece/%s" , minerIP , piece .CommP .String ())
347
+ return splitcarfetcher .NewRemoteFileSplitCarReader (
348
+ piece .CommP .String (),
349
+ formattedURL ,
350
+ )
351
+ })
352
+ if err != nil {
353
+ return nil , fmt .Errorf ("failed to open CAR file from pieces: %w" , err )
354
+ }
355
+ remoteCarReader = scr
356
+ } else {
357
+ // is from pieceToURL mapping:
358
+ scrFromURLs , err := splitcarfetcher .NewSplitCarReader (
359
+ metadata .CarPieces ,
360
+ func (piece carlet.CarFile ) (splitcarfetcher.ReaderAtCloserSize , error ) {
361
+ pieceURL , ok := config .Data .Car .FromPieces .PieceToURI [piece .CommP ]
362
+ if ! ok {
363
+ return nil , fmt .Errorf ("failed to find URL for piece CID %s" , piece .CommP )
364
+ }
365
+ return splitcarfetcher .NewRemoteFileSplitCarReader (
366
+ piece .CommP .String (),
367
+ pieceURL .URI .String (),
368
+ )
369
+ })
370
+ if err != nil {
371
+ return nil , fmt .Errorf ("failed to open CAR file from pieces: %w" , err )
372
+ }
373
+ remoteCarReader = scrFromURLs
354
374
}
355
- remoteCarReader = scr
356
375
} else {
357
376
localCarReader , remoteCarReader , err = openCarStorage (c .Context , string (config .Data .Car .URI ))
358
377
if err != nil {
@@ -397,6 +416,9 @@ func NewEpochFromConfig(
397
416
headerSize := uint64 (buf .Len ())
398
417
ep .carHeaderSize = headerSize
399
418
}
419
+ if remoteCarReader == nil && localCarReader == nil {
420
+ return nil , fmt .Errorf ("no CAR reader available" )
421
+ }
400
422
}
401
423
{
402
424
sigExistsFile , err := openIndexStorage (
0 commit comments