CleanStorage removes assets which are no longer useful, according to opts.
(ctx context.Context, storage Storage, opts CleanStorageOptions)
| 647 | // CleanStorage removes assets which are no longer useful, |
| 648 | // according to opts. |
| 649 | func CleanStorage(ctx context.Context, storage Storage, opts CleanStorageOptions) error { |
| 650 | const ( |
| 651 | lockName = "storage_clean" |
| 652 | storageKey = "last_clean.json" |
| 653 | ) |
| 654 | |
| 655 | if opts.Logger == nil { |
| 656 | opts.Logger = defaultLogger.Named("clean_storage") |
| 657 | } |
| 658 | opts.Logger = opts.Logger.With(zap.Any("storage", storage)) |
| 659 | |
| 660 | // storage cleaning should be globally exclusive |
| 661 | if err := acquireLock(ctx, storage, lockName); err != nil { |
| 662 | return fmt.Errorf("unable to acquire %s lock: %v", lockName, err) |
| 663 | } |
| 664 | defer func() { |
| 665 | if err := releaseLock(ctx, storage, lockName); err != nil { |
| 666 | opts.Logger.Error("unable to release lock", zap.Error(err)) |
| 667 | return |
| 668 | } |
| 669 | }() |
| 670 | |
| 671 | // cleaning should not happen more often than the interval |
| 672 | if opts.Interval > 0 { |
| 673 | lastCleanBytes, err := storage.Load(ctx, storageKey) |
| 674 | if !errors.Is(err, fs.ErrNotExist) { |
| 675 | if err != nil { |
| 676 | return fmt.Errorf("loading last clean timestamp: %v", err) |
| 677 | } |
| 678 | |
| 679 | var lastClean lastCleanPayload |
| 680 | err = json.Unmarshal(lastCleanBytes, &lastClean) |
| 681 | if err != nil { |
| 682 | return fmt.Errorf("decoding last clean data: %v", err) |
| 683 | } |
| 684 | |
| 685 | lastTLSClean := lastClean["tls"] |
| 686 | if time.Since(lastTLSClean.Timestamp) < opts.Interval { |
| 687 | nextTime := time.Now().Add(opts.Interval) |
| 688 | opts.Logger.Info("storage cleaning happened too recently; skipping for now", |
| 689 | zap.String("instance", lastTLSClean.InstanceID), |
| 690 | zap.Time("try_again", nextTime), |
| 691 | zap.Duration("try_again_in", time.Until(nextTime)), |
| 692 | ) |
| 693 | return nil |
| 694 | } |
| 695 | } |
| 696 | } |
| 697 | |
| 698 | opts.Logger.Info("cleaning storage unit") |
| 699 | |
| 700 | if opts.OCSPStaples { |
| 701 | err := deleteOldOCSPStaples(ctx, storage, opts.Logger) |
| 702 | if err != nil { |
| 703 | opts.Logger.Error("deleting old OCSP staples", zap.Error(err)) |
| 704 | } |
| 705 | } |
| 706 | if opts.ExpiredCerts { |
nothing calls this directly
no test coverage detected
searching dependent graphs…