fork of indigo with slightly nicer lexgen

if repo base has a 'prev', ignore block diff errors

Changed files
+57 -36
backfill
carstore
cmd
gosky
repo
repomgr
testing
+4 -2
backfill/backfill.go
··· 342 // Producer routine 343 go func() { 344 defer close(recordQueue) 345 - r.ForEach(ctx, b.NSIDFilter, func(recordPath string, nodeCid cid.Cid) error { 346 numRecords++ 347 recordQueue <- recordQueueItem{recordPath: recordPath, nodeCid: nodeCid} 348 return nil 349 - }) 350 }() 351 352 // Consumer routines
··· 342 // Producer routine 343 go func() { 344 defer close(recordQueue) 345 + if err := r.ForEach(ctx, b.NSIDFilter, func(recordPath string, nodeCid cid.Cid) error { 346 numRecords++ 347 recordQueue <- recordQueueItem{recordPath: recordPath, nodeCid: nodeCid} 348 return nil 349 + }); err != nil { 350 + log.Error("failed to iterated records in repo", "err", err) 351 + } 352 }() 353 354 // Consumer routines
+9 -12
carstore/bs.go
··· 861 return out 862 } 863 864 - func BlockDiff(ctx context.Context, bs blockstore.Blockstore, oldroot cid.Cid, newcids map[cid.Cid]blockformat.Block) (map[cid.Cid]bool, error) { 865 ctx, span := otel.Tracer("repo").Start(ctx, "BlockDiff") 866 defer span.End() 867 ··· 901 902 oblk, err := bs.Get(ctx, c) 903 if err != nil { 904 - return nil, fmt.Errorf("get failed in old tree: %w", err) 905 } 906 907 if err := cbg.ScanForLinks(bytes.NewReader(oblk.RawData()), func(lnk cid.Cid) { ··· 956 } 957 } 958 959 - rmcids, err := BlockDiff(ctx, ds, ds.baseCid, ds.blks) 960 - if err != nil { 961 - return cid.Undef, nil, fmt.Errorf("block diff failed (base=%s,since=%v,rev=%s): %w", ds.baseCid, since, ds.lastRev, err) 962 - } 963 - 964 - ds.rmcids = rmcids 965 - 966 return carr.Header.Roots[0], ds, nil 967 } 968 969 - func (ds *DeltaSession) CalcDiff(ctx context.Context, nroot cid.Cid) error { 970 - rmcids, err := BlockDiff(ctx, ds, ds.baseCid, ds.blks) 971 if err != nil { 972 - return fmt.Errorf("block diff failed: %w", err) 973 } 974 975 ds.rmcids = rmcids
··· 861 return out 862 } 863 864 + func BlockDiff(ctx context.Context, bs blockstore.Blockstore, oldroot cid.Cid, newcids map[cid.Cid]blockformat.Block, skipmissing bool) (map[cid.Cid]bool, error) { 865 ctx, span := otel.Tracer("repo").Start(ctx, "BlockDiff") 866 defer span.End() 867 ··· 901 902 oblk, err := bs.Get(ctx, c) 903 if err != nil { 904 + if skipmissing && ipld.IsNotFound(err) { 905 + log.Warnw("missing block in old tree", "root", oldroot, "missing", c) 906 + } else { 907 + return nil, fmt.Errorf("get failed in old tree: %w", err) 908 + } 909 } 910 911 if err := cbg.ScanForLinks(bytes.NewReader(oblk.RawData()), func(lnk cid.Cid) { ··· 960 } 961 } 962 963 return carr.Header.Roots[0], ds, nil 964 } 965 966 + func (ds *DeltaSession) CalcDiff(ctx context.Context, skipmissing bool) error { 967 + rmcids, err := BlockDiff(ctx, ds, ds.baseCid, ds.blks, skipmissing) 968 if err != nil { 969 + return fmt.Errorf("block diff failed (base=%s,rev=%s): %w", ds.baseCid, ds.lastRev, err) 970 } 971 972 ds.rmcids = rmcids
+8 -8
carstore/repo_test.go
··· 103 t.Fatal(err) 104 } 105 106 - rr, err := repo.OpenRepo(ctx, ds, head, true) 107 if err != nil { 108 t.Fatal(err) 109 } ··· 125 126 rev = nrev 127 128 - if err := ds.CalcDiff(ctx, nroot); err != nil { 129 t.Fatal(err) 130 } 131 ··· 188 t.Fatal(err) 189 } 190 191 - rr, err := repo.OpenRepo(ctx, ds, head, true) 192 if err != nil { 193 t.Fatal(err) 194 } ··· 217 218 rev = nrev 219 220 - if err := ds.CalcDiff(ctx, nroot); err != nil { 221 t.Fatal(err) 222 } 223 ··· 338 b.Fatal(err) 339 } 340 341 - rr, err := repo.OpenRepo(ctx, ds, head, true) 342 if err != nil { 343 b.Fatal(err) 344 } ··· 356 } 357 358 rev = nrev 359 - if err := ds.CalcDiff(ctx, nroot); err != nil { 360 b.Fatal(err) 361 } 362 ··· 386 b.ResetTimer() 387 for i := 0; i < b.N; i++ { 388 389 - rr, err := repo.OpenRepo(ctx, bs, head, true) 390 if err != nil { 391 b.Fatal(err) 392 } ··· 424 b.ResetTimer() 425 for i := 0; i < b.N; i++ { 426 427 - rr, err := repo.OpenRepo(ctx, bs, head, true) 428 if err != nil { 429 b.Fatal(err) 430 }
··· 103 t.Fatal(err) 104 } 105 106 + rr, err := repo.OpenRepo(ctx, ds, head) 107 if err != nil { 108 t.Fatal(err) 109 } ··· 125 126 rev = nrev 127 128 + if err := ds.CalcDiff(ctx, false); err != nil { 129 t.Fatal(err) 130 } 131 ··· 188 t.Fatal(err) 189 } 190 191 + rr, err := repo.OpenRepo(ctx, ds, head) 192 if err != nil { 193 t.Fatal(err) 194 } ··· 217 218 rev = nrev 219 220 + if err := ds.CalcDiff(ctx, false); err != nil { 221 t.Fatal(err) 222 } 223 ··· 338 b.Fatal(err) 339 } 340 341 + rr, err := repo.OpenRepo(ctx, ds, head) 342 if err != nil { 343 b.Fatal(err) 344 } ··· 356 } 357 358 rev = nrev 359 + if err := ds.CalcDiff(ctx, false); err != nil { 360 b.Fatal(err) 361 } 362 ··· 386 b.ResetTimer() 387 for i := 0; i < b.N; i++ { 388 389 + rr, err := repo.OpenRepo(ctx, bs, head) 390 if err != nil { 391 b.Fatal(err) 392 } ··· 424 b.ResetTimer() 425 for i := 0; i < b.N; i++ { 426 427 + rr, err := repo.OpenRepo(ctx, bs, head) 428 if err != nil { 429 b.Fatal(err) 430 }
+1 -1
cmd/gosky/main.go
··· 363 } 364 } 365 366 - r, err := repo.OpenRepo(ctx, bstore, carr.Header.Roots[0], false) 367 if err != nil { 368 return nil, err 369 }
··· 363 } 364 } 365 366 + r, err := repo.OpenRepo(ctx, bstore, carr.Header.Roots[0]) 367 if err != nil { 368 return nil, err 369 }
+3 -3
repo/repo.go
··· 107 return nil, err 108 } 109 110 - return OpenRepo(ctx, bs, root, false) 111 } 112 113 func NewRepo(ctx context.Context, did string, bs blockstore.Blockstore) *Repo { ··· 128 } 129 } 130 131 - func OpenRepo(ctx context.Context, bs blockstore.Blockstore, root cid.Cid, fullRepo bool) (*Repo, error) { 132 cst := util.CborStore(bs) 133 134 var sc SignedCommit ··· 363 364 var oldTree cid.Cid 365 if oldrepo.Defined() { 366 - otherRepo, err := OpenRepo(ctx, r.bs, oldrepo, true) 367 if err != nil { 368 return nil, err 369 }
··· 107 return nil, err 108 } 109 110 + return OpenRepo(ctx, bs, root) 111 } 112 113 func NewRepo(ctx context.Context, did string, bs blockstore.Blockstore) *Repo { ··· 128 } 129 } 130 131 + func OpenRepo(ctx context.Context, bs blockstore.Blockstore, root cid.Cid) (*Repo, error) { 132 cst := util.CborStore(bs) 133 134 var sc SignedCommit ··· 363 364 var oldTree cid.Cid 365 if oldrepo.Defined() { 366 + otherRepo, err := OpenRepo(ctx, r.bs, oldrepo) 367 if err != nil { 368 return nil, err 369 }
+31 -9
repomgr/repomgr.go
··· 163 164 head := ds.BaseCid() 165 166 - r, err := repo.OpenRepo(ctx, ds, head, true) 167 if err != nil { 168 return "", cid.Undef, err 169 } ··· 227 } 228 229 head := ds.BaseCid() 230 - r, err := repo.OpenRepo(ctx, ds, head, true) 231 if err != nil { 232 return cid.Undef, err 233 } ··· 297 } 298 299 head := ds.BaseCid() 300 - r, err := repo.OpenRepo(ctx, ds, head, true) 301 if err != nil { 302 return err 303 } ··· 432 return cid.Undef, nil, err 433 } 434 435 - r, err := repo.OpenRepo(ctx, bs, head, true) 436 if err != nil { 437 return cid.Undef, nil, err 438 } ··· 462 return cid.Undef, nil, err 463 } 464 465 - r, err := repo.OpenRepo(ctx, bs, head, true) 466 if err != nil { 467 return cid.Undef, nil, err 468 } ··· 486 return nil, err 487 } 488 489 - r, err := repo.OpenRepo(ctx, bs, head, true) 490 if err != nil { 491 return nil, err 492 } ··· 543 return fmt.Errorf("importing external carslice: %w", err) 544 } 545 546 - r, err := repo.OpenRepo(ctx, ds, root, true) 547 if err != nil { 548 return fmt.Errorf("opening external user repo (%d, root=%s): %w", uid, root, err) 549 } ··· 552 return err 553 } 554 555 var evtops []RepoOp 556 557 for _, op := range ops { ··· 650 } 651 652 head := ds.BaseCid() 653 - r, err := repo.OpenRepo(ctx, ds, head, true) 654 if err != nil { 655 return err 656 } ··· 781 } 782 783 err = rm.processNewRepo(ctx, user, r, rev, func(ctx context.Context, root cid.Cid, finish func(context.Context, string) ([]byte, error), bs blockstore.Blockstore) error { 784 - r, err := repo.OpenRepo(ctx, bs, root, true) 785 if err != nil { 786 return fmt.Errorf("opening new repo: %w", err) 787 }
··· 163 164 head := ds.BaseCid() 165 166 + r, err := repo.OpenRepo(ctx, ds, head) 167 if err != nil { 168 return "", cid.Undef, err 169 } ··· 227 } 228 229 head := ds.BaseCid() 230 + r, err := repo.OpenRepo(ctx, ds, head) 231 if err != nil { 232 return cid.Undef, err 233 } ··· 297 } 298 299 head := ds.BaseCid() 300 + r, err := repo.OpenRepo(ctx, ds, head) 301 if err != nil { 302 return err 303 } ··· 432 return cid.Undef, nil, err 433 } 434 435 + r, err := repo.OpenRepo(ctx, bs, head) 436 if err != nil { 437 return cid.Undef, nil, err 438 } ··· 462 return cid.Undef, nil, err 463 } 464 465 + r, err := repo.OpenRepo(ctx, bs, head) 466 if err != nil { 467 return cid.Undef, nil, err 468 } ··· 486 return nil, err 487 } 488 489 + r, err := repo.OpenRepo(ctx, bs, head) 490 if err != nil { 491 return nil, err 492 } ··· 543 return fmt.Errorf("importing external carslice: %w", err) 544 } 545 546 + r, err := repo.OpenRepo(ctx, ds, root) 547 if err != nil { 548 return fmt.Errorf("opening external user repo (%d, root=%s): %w", uid, root, err) 549 } ··· 552 return err 553 } 554 555 + var badPrev bool 556 + if ds.BaseCid().Defined() { 557 + oldrepo, err := repo.OpenRepo(ctx, ds, ds.BaseCid()) 558 + if err != nil { 559 + return fmt.Errorf("failed to check data root in old repo: %w", err) 560 + } 561 + 562 + // if the old commit has a 'prev', CalcDiff will error out while trying 563 + // to walk it. This is an old repo thing that is being deprecated. 564 + // This check is a temporary workaround until all repos get migrated 565 + // and this becomes no longer an issue 566 + prev, _ := oldrepo.PrevCommit(ctx) 567 + if prev != nil { 568 + badPrev = true 569 + } 570 + } 571 + 572 + if err := ds.CalcDiff(ctx, badPrev); err != nil { 573 + return fmt.Errorf("failed while calculating mst diff (since=%v): %w", since, err) 574 + 575 + } 576 + 577 var evtops []RepoOp 578 579 for _, op := range ops { ··· 672 } 673 674 head := ds.BaseCid() 675 + r, err := repo.OpenRepo(ctx, ds, head) 676 if err != nil { 677 return err 678 } ··· 803 } 804 805 err = rm.processNewRepo(ctx, user, r, rev, func(ctx context.Context, root cid.Cid, finish func(context.Context, string) ([]byte, error), bs blockstore.Blockstore) error { 806 + r, err := repo.OpenRepo(ctx, bs, root) 807 if err != nil { 808 return fmt.Errorf("opening new repo: %w", err) 809 }
+1 -1
testing/sig_test.go
··· 33 t.Fatal(err) 34 } 35 36 - r, err := repo.OpenRepo(ctx, bs, c, true) 37 if err != nil { 38 t.Fatal(err) 39 }
··· 33 t.Fatal(err) 34 } 35 36 + r, err := repo.OpenRepo(ctx, bs, c) 37 if err != nil { 38 t.Fatal(err) 39 }