@@ -179,12 +179,22 @@ var cmdCreate = &cli.Command{
179
179
EnvVars : []string {"FCA_CREATE_HEIGHT" },
180
180
Value : 0 ,
181
181
},
182
+ & cli.StringFlag {
183
+ Name : "filename" ,
184
+ Usage : "name of exported CAR file for internal chain export" ,
185
+ EnvVars : []string {"FCA_EXPORT_FILENAME" },
186
+ },
182
187
& cli.DurationFlag {
183
188
Name : "progress-update" ,
184
189
Usage : "how frequenty to provide provide update logs" ,
185
190
EnvVars : []string {"FCA_CREATE_PROGRESS_UPDATE" },
186
191
Value : 60 * time .Second ,
187
192
},
193
+ & cli.StringFlag {
194
+ Name : "export-dir" ,
195
+ Usage : "directory where to save the exported CAR file" ,
196
+ EnvVars : []string {"FCA_EXPORT_DIR" },
197
+ },
188
198
},
189
199
Action : func (cctx * cli.Context ) error {
190
200
ctx := context .Background ()
@@ -203,6 +213,8 @@ var cmdCreate = &cli.Command{
203
213
flagConfidence := cctx .Int ("confidence" )
204
214
flagHeight := cctx .Int ("height" )
205
215
flagAfter := cctx .Int ("after" )
216
+ flagExportDir := cctx .String ("export-dir" )
217
+ flagFileName := cctx .String ("filename" )
206
218
207
219
u , err := url .Parse (flagBucketEndpoint )
208
220
if err != nil {
@@ -331,7 +343,7 @@ var cmdCreate = &cli.Command{
331
343
return xerrors .Errorf ("failed to aquire lock" )
332
344
}
333
345
334
- e := export .NewExport (node , headTs , tailTs )
346
+ e := export .NewExport (node , headTs , tailTs , flagFileName , flagExportDir )
335
347
errCh := make (chan error )
336
348
go func () {
337
349
errCh <- e .Export (ctx )
@@ -358,35 +370,34 @@ var cmdCreate = &cli.Command{
358
370
}
359
371
}()
360
372
361
- name , err := filepath .Glob ("snapshot_" + string (tailHeight ) + "_" + string (height ) + "*.car" )
362
- if err != nil {
363
- return err
373
+ rrPath := filepath .Join (flagExportDir , flagFileName )
374
+ for {
375
+ info , err := os .Stat (rrPath )
376
+ if os .IsNotExist (err ) {
377
+ logger .Infow ("waiting for snapshot car file to begin writing" )
378
+ time .Sleep (time .Second * 15 )
379
+ continue
380
+ } else if info .IsDir () {
381
+ return xerrors .Errorf ("trying to open directory instead of car file" )
382
+ }
383
+ break
364
384
}
365
- rrfn := filepath .Join (cctx .String ("repo" ), name [0 ])
366
- rr , err := os .OpenFile (rrfn , os .O_RDONLY , 444 )
385
+ rr , err := os .OpenFile (rrPath , os .O_RDONLY , 444 )
367
386
if err != nil {
368
387
return err
369
388
}
370
389
defer rr .Close ()
371
390
372
- cname := name [0 ] + ".zstd"
373
- rcfn := filepath .Join (cctx .String ("repo" ), string (cname [0 ]))
374
- rc , err := os .OpenFile (rcfn , os .O_RDONLY , 444 )
375
- if err != nil {
376
- return err
377
- }
378
- defer rc .Close ()
379
-
380
391
go func () {
381
392
var lastSize int64
393
+ fmt .Printf ("rrPath: %v" , rrPath )
382
394
for {
383
395
select {
384
396
case <- time .After (flagProgressUpdate ):
385
- size := e .Progress (rrfn )
397
+ size := e .Progress (rrPath )
386
398
if size == 0 {
387
399
continue
388
400
}
389
-
390
401
logger .Infow ("update" , "total" , size , "speed" , (size - lastSize )/ int64 (flagProgressUpdate / time .Second ))
391
402
lastSize = size
392
403
}
@@ -401,10 +412,6 @@ var cmdCreate = &cli.Command{
401
412
_ , err := io .Copy (io .Discard , rr )
402
413
return err
403
414
})
404
- g .Go (func () error {
405
- _ , err := io .Copy (io .Discard , rc )
406
- return err
407
- })
408
415
409
416
if err := g .Wait (); err != nil {
410
417
return err
@@ -435,19 +442,13 @@ var cmdCreate = &cli.Command{
435
442
436
443
//t := export.TimeAtHeight(gtp, height, 30*time.Second)
437
444
438
- logger .Infow ("object" , "name" , name [ 0 ] )
445
+ logger .Infow ("object" , "name" , flagFileName )
439
446
440
447
g , ctxGroup := errgroup .WithContext (ctx )
441
- var siRaw * snapshotInfo
442
448
var siCompressed * snapshotInfo
443
449
g .Go (func () error {
444
450
var err error
445
- siRaw , err = runUploadRaw (ctxGroup , minioClient , flagBucket , flagNamePrefix , flagRetrievalEndpointPrefix , name [0 ], peerID , bt , rr )
446
- return err
447
- })
448
- g .Go (func () error {
449
- var err error
450
- siCompressed , err = runUploadCompressed (ctxGroup , minioClient , flagBucket , flagNamePrefix , flagRetrievalEndpointPrefix , name [0 ], peerID , bt , rc )
451
+ siCompressed , err = runUploadCompressed (ctxGroup , minioClient , flagBucket , flagNamePrefix , flagRetrievalEndpointPrefix , flagFileName + ".zstd" , peerID , bt , rr )
451
452
return err
452
453
})
453
454
if err := g .Wait (); err != nil {
@@ -457,7 +458,7 @@ var cmdCreate = &cli.Command{
457
458
return err
458
459
}
459
460
460
- sis := []* snapshotInfo {siRaw , siCompressed }
461
+ sis := []* snapshotInfo {siCompressed }
461
462
462
463
var sb strings.Builder
463
464
for _ , x := range sis {
@@ -466,12 +467,12 @@ var cmdCreate = &cli.Command{
466
467
467
468
sha256sum := sb .String ()
468
469
469
- _ , err = minioClient .PutObject (ctx , flagBucket , fmt .Sprintf ("%s%s.sha256sum" , flagNamePrefix , name ), strings .NewReader (sha256sum ), - 1 , minio.PutObjectOptions {
470
- ContentDisposition : fmt .Sprintf ("attachment; filename=\" %s.sha256sum\" " , name ),
470
+ _ , err = minioClient .PutObject (ctx , flagBucket , fmt .Sprintf ("%s%s.sha256sum" , flagNamePrefix , flagFileName ), strings .NewReader (sha256sum ), - 1 , minio.PutObjectOptions {
471
+ ContentDisposition : fmt .Sprintf ("attachment; filename=\" %s.sha256sum\" " , flagFileName ),
471
472
ContentType : "text/plain" ,
472
473
})
473
474
if err != nil {
474
- logger .Errorw ("failed to write sha256sum" , "object" , fmt .Sprintf ("%s%s.sha256sum" , flagNamePrefix , name ), "err" , err )
475
+ logger .Errorw ("failed to write sha256sum" , "object" , fmt .Sprintf ("%s%s.sha256sum" , flagNamePrefix , flagFileName ), "err" , err )
475
476
}
476
477
477
478
for _ , x := range sis {
@@ -501,50 +502,6 @@ var cmdCreate = &cli.Command{
501
502
},
502
503
}
503
504
504
- func runUploadRaw (ctx context.Context , minioClient * minio.Client , flagBucket , flagNamePrefix , flagRetrievalEndpointPrefix , name , peerID string , bt time.Time , source io.Reader ) (* snapshotInfo , error ) {
505
- h := sha256 .New ()
506
- r := io .TeeReader (source , h )
507
-
508
- filename := fmt .Sprintf ("%s.car" , name )
509
-
510
- info , err := minioClient .PutObject (ctx , flagBucket , fmt .Sprintf ("%s%s" , flagNamePrefix , filename ), r , - 1 , minio.PutObjectOptions {
511
- ContentDisposition : fmt .Sprintf ("attachment; filename=\" %s\" " , filename ),
512
- ContentType : "application/octet-stream" ,
513
- })
514
- if err != nil {
515
- return nil , fmt .Errorf ("failed to upload object (%s): %w" , fmt .Sprintf ("%s%s" , flagNamePrefix , filename ), err )
516
- }
517
-
518
- logger .Infow ("snapshot upload" ,
519
- "bucket" , info .Bucket ,
520
- "key" , info .Key ,
521
- "etag" , info .ETag ,
522
- "size" , info .Size ,
523
- "location" , info .Location ,
524
- "version_id" , info .VersionID ,
525
- "expiration" , info .Expiration ,
526
- "expiration_rule_id" , info .ExpirationRuleID ,
527
- )
528
-
529
- snapshotSize := info .Size
530
-
531
- latestLocation , err := url .JoinPath (flagRetrievalEndpointPrefix , info .Key )
532
- if err != nil {
533
- logger .Errorw ("failed to join request path" , "request_prefix" , flagRetrievalEndpointPrefix , "key" , info .Key )
534
- return nil , fmt .Errorf ("failed to join request path: %w" , err )
535
- }
536
-
537
- digest := fmt .Sprintf ("%x" , h .Sum (nil ))
538
-
539
- return & snapshotInfo {
540
- digest : digest ,
541
- size : snapshotSize ,
542
- filename : filename ,
543
- latestIndex : "latest" ,
544
- latestLocation : latestLocation ,
545
- }, nil
546
- }
547
-
548
505
func runUploadCompressed (ctx context.Context , minioClient * minio.Client , flagBucket , flagNamePrefix , flagRetrievalEndpointPrefix , name , peerID string , bt time.Time , source io.Reader ) (* snapshotInfo , error ) {
549
506
550
507
r1 , w1 := io .Pipe ()
@@ -555,7 +512,7 @@ func runUploadCompressed(ctx context.Context, minioClient *minio.Client, flagBuc
555
512
h := sha256 .New ()
556
513
r := io .TeeReader (r1 , h )
557
514
558
- filename := fmt . Sprintf ( "%s.car.zst" , name )
515
+ filename := name
559
516
560
517
info , err := minioClient .PutObject (ctx , flagBucket , fmt .Sprintf ("%s%s" , flagNamePrefix , filename ), r , - 1 , minio.PutObjectOptions {
561
518
ContentDisposition : fmt .Sprintf ("attachment; filename=\" %s\" " , filename ),
0 commit comments